From cd6874faa753ff5039da3630fbfddf0e6516aa94 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 18 Mar 2022 18:07:49 +0700 Subject: [PATCH] Fix draft email when close composer on browser --- .../presentation/composer_controller.dart | 80 ++++++++++--------- .../composer/presentation/composer_view.dart | 4 +- .../presentation/composer_view_web.dart | 38 +++++++-- .../widgets/email_address_input_builder.dart | 2 +- .../model/composer_arguments.dart | 1 + .../mailbox_dashboard_controller.dart | 1 + 6 files changed, 79 insertions(+), 47 deletions(-) diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 8678c0257..1361c0ba9 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -60,7 +60,7 @@ class ComposerController extends BaseController { final isEnableEmailSendButton = false.obs; final isInitialRecipient = false.obs; final attachments = [].obs; - final emailContents = [].obs; + final emailContents = Rxn>(); final subjectEmail = Rxn(); final screenDisplayMode = ScreenDisplayMode.normal.obs; @@ -84,7 +84,7 @@ class ComposerController extends BaseController { List listBccEmailAddress = []; ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.localContact; HtmlEditorApi? htmlEditorApi; - final HtmlEditorBrowser.HtmlEditorController htmlControllerBrowser = HtmlEditorBrowser.HtmlEditorController(); + final HtmlEditorBrowser.HtmlEditorController htmlControllerBrowser = HtmlEditorBrowser.HtmlEditorController(processNewLineAsBr: true); final subjectEmailInputController = TextEditingController(); final toEmailAddressController = TextEditingController(); @@ -92,11 +92,11 @@ class ComposerController extends BaseController { final bccEmailAddressController = TextEditingController(); List initialAttachments = []; - String? _textEditor; + String? _textEditorWeb; - void setTextEditor(String? text) => _textEditor = text; + void setTextEditorWeb(String? text) => _textEditorWeb = text; - String? get textEditor => _textEditor; + String? get textEditorWeb => _textEditorWeb; void setSubjectEmail(String subject) => subjectEmail.value = subject; @@ -193,6 +193,7 @@ class ComposerController extends BaseController { void _initEmail() { final arguments = kIsWeb ? mailboxDashBoardController.routerArguments : Get.arguments; if (arguments is ComposerArguments) { + log('ComposerController::_initEmail(): arguments: ${arguments.props}'); composerArguments.value = arguments; if (arguments.emailActionType == EmailActionType.edit) { _getEmailContentAction(arguments); @@ -211,31 +212,24 @@ class ComposerController extends BaseController { } } - String getContentEmail() { - if (composerArguments.value != null - && composerArguments.value!.emailActionType != EmailActionType.compose - && Get.context != null) { - if (composerArguments.value?.emailActionType == EmailActionType.edit) { - return _getOldEmailContentAsHtml(); - } else { - return _getBodyEmailQuotedAsHtml(Get.context!, composerArguments.value!); + String? getContentEmail(BuildContext context) { + if (composerArguments.value != null) { + switch(composerArguments.value!.emailActionType) { + case EmailActionType.reply: + case EmailActionType.forward: + case EmailActionType.replyAll: + return getEmailContentQuotedAsHtml(context, composerArguments.value!); + case EmailActionType.edit: + return getEmailContentDraftsAsHtml(); + default: + return ''; } } return ''; } - String? get initTextEditorComposer { - if (composerArguments.value?.emailActionType == EmailActionType.compose) { - return textEditor; - } else { - return textEditor ?? getContentEmail(); - } - } - void setFullScreenEditor() { - Future.delayed(const Duration(milliseconds: 1000), () { - htmlControllerBrowser.setFullScreen(); - }); + htmlControllerBrowser.setFullScreen(); } Tuple2? _getHeaderEmailQuoted(String locale, ComposerArguments arguments) { @@ -306,7 +300,7 @@ class ComposerController extends BaseController { } } - String _getBodyEmailQuotedAsHtml(BuildContext context, ComposerArguments arguments) { + String getEmailContentQuotedAsHtml(BuildContext context, ComposerArguments arguments) { final headerEmailQuoted = _getHeaderEmailQuoted(Localizations.localeOf(context).toLanguageTag(), arguments); final headerEmailQuotedAsHtml = headerEmailQuoted != null @@ -538,10 +532,17 @@ class ComposerController extends BaseController { attachments.removeWhere((attachment) => attachment == attachmentRemoved); } - Future _isEmailChanged(ComposerArguments arguments) async { + Future _isEmailChanged(BuildContext context, ComposerArguments arguments) async { final newEmailBody = await _getEmailBodyText(onlyText: true); - final oldEmailBody = kIsWeb ? getContentEmail() : '\n${getContentEmail()}\n'; - final isEmailBodyChanged = !oldEmailBody.isSame(newEmailBody); + log('ComposerController::_isEmailChanged(): newEmailBody: $newEmailBody'); + var oldEmailBody = ''; + final contentEmail = getContentEmail(context); + if (arguments.emailActionType != EmailActionType.compose && contentEmail != null && contentEmail.isNotEmpty) { + oldEmailBody = kIsWeb ? contentEmail : '\n$contentEmail\n'; + } + log('ComposerController::_isEmailChanged(): oldEmailBody: $oldEmailBody'); + final isEmailBodyChanged = !oldEmailBody.trim().isSame(newEmailBody.trim()); + log('ComposerController::_isEmailChanged(): isEmailBodyChanged: $isEmailBodyChanged'); final newEmailSubject = subjectEmail.value; final titleEmail = arguments.presentationEmail?.getEmailTitle().trim() ?? ''; @@ -583,10 +584,11 @@ class ComposerController extends BaseController { final userProfile = mailboxDashBoardController.userProfile.value; final session = mailboxDashBoardController.sessionCurrent; - if (arguments != null && Get.context != null && mapDefaultMailboxId.isNotEmpty - && userProfile != null && session != null) { - final isChanged = await _isEmailChanged(arguments); + if (arguments != null && mapDefaultMailboxId.isNotEmpty && userProfile != null && session != null) { + log('ComposerController::saveEmailAsDrafts(): saveEmailAsDrafts START'); + final isChanged = await _isEmailChanged(context, arguments); if (isChanged) { + log('ComposerController::saveEmailAsDrafts(): saveEmailAsDrafts isChanged: $isChanged'); _saveEmailAddress(); final newEmail = await _generateEmail(mapDefaultMailboxId, userProfile, asDrafts: true); @@ -617,15 +619,15 @@ class ComposerController extends BaseController { initialAttachments = success.attachments; } - String _getOldEmailContentAsHtml() { - if (emailContents.isNotEmpty) { - final trustAsHtml = emailContents - .map((emailContent) => emailContent.content) - .toList() - .join('
'); - return trustAsHtml; + String? getEmailContentDraftsAsHtml() { + final listContents = emailContents.value; + if (listContents != null) { + return listContents.isNotEmpty + ? listContents.map((emailContent) => emailContent.content).toList().join('
') + : ''; + } else { + return null; } - return ''; } String getEmailAddressSender() { diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index c3333fec6..4d5ae376e 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -304,8 +304,8 @@ class ComposerView extends GetWidget { minHeight: 550, onCreated: (editorApi) => controller.htmlEditorApi = editorApi); } else { - final message = controller.getContentEmail(); - return message.isNotEmpty + final message = controller.getContentEmail(context); + return message != null && message.isNotEmpty ? HtmlEditor( key: Key('composer_editor'), minHeight: 550, diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index 771a4e805..be20538ae 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -409,18 +409,46 @@ class ComposerView extends GetWidget { padding: EdgeInsets.only(bottom: 8, left: 10, right: 10), child: _buildAttachmentsList(context, controller.attachments, controller.expandModeAttachments.value)) : SizedBox.shrink()), - Expanded(child: Padding(padding: EdgeInsets.symmetric(horizontal: 10), child: _buildEditor(context))), + Obx(() { + if (controller.composerArguments.value != null) { + if (controller.composerArguments.value?.emailActionType == EmailActionType.compose) { + final initContent = controller.textEditorWeb ?? ''; + log('ComposerView::_buildEditorAndAttachments(): initContent: $initContent'); + return Expanded(child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10), + child: _buildEditor(context, initContent))); + } else if (controller.composerArguments.value?.emailActionType == EmailActionType.edit) { + final initContent = controller.getEmailContentDraftsAsHtml(); + log('ComposerView::_buildEditorAndAttachments(): initContent: $initContent'); + if (initContent != null) { + return Expanded(child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10), + child: _buildEditor(context, initContent))); + } else { + return SizedBox.shrink(); + } + } else { + final initContent = controller.getEmailContentQuotedAsHtml(context, controller.composerArguments.value!); + log('ComposerView::_buildEditorAndAttachments(): initContent: $initContent'); + return Expanded(child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10), + child: _buildEditor(context, initContent))); + } + } else { + return SizedBox.shrink(); + } + }), ] ); } - Widget _buildEditor(BuildContext context) { + Widget _buildEditor(BuildContext context, String initContent) { return HtmlEditorBrowser.HtmlEditor( key: Key('composer_editor_web'), controller: controller.htmlControllerBrowser, htmlEditorOptions: HtmlEditorBrowser.HtmlEditorOptions( hint: '

', - initialText: controller.initTextEditorComposer, + initialText: initContent, darkMode: false, ), htmlToolbarOptions: HtmlEditorBrowser.HtmlToolbarOptions( @@ -430,10 +458,10 @@ class ComposerView extends GetWidget { callbacks: HtmlEditorBrowser.Callbacks( onBeforeCommand: (String? currentHtml) { log('ComposerView::_buildComposerEditor(): onBeforeCommand'); - controller.setTextEditor(currentHtml); + controller.setTextEditorWeb(currentHtml); }, onChangeContent: (String? changed) { log('ComposerView::_buildComposerEditor(): onChangeContent'); - controller.setTextEditor(changed); + controller.setTextEditorWeb(changed); }, onInit: () { log('ComposerView::_buildComposerEditor(): onInit'); controller.setFullScreenEditor(); diff --git a/lib/features/composer/presentation/widgets/email_address_input_builder.dart b/lib/features/composer/presentation/widgets/email_address_input_builder.dart index c817103fc..eb2039825 100644 --- a/lib/features/composer/presentation/widgets/email_address_input_builder.dart +++ b/lib/features/composer/presentation/widgets/email_address_input_builder.dart @@ -23,7 +23,7 @@ class EmailAddressInputBuilder { final AppToast _appToast; final ExpandMode expandMode; final PrefixEmailAddress _prefixEmailAddress; - final List _listEmailAddress; + List _listEmailAddress; final TextEditingController? controller; final bool? isInitial; final bool hasAvatar; diff --git a/lib/features/email/presentation/model/composer_arguments.dart b/lib/features/email/presentation/model/composer_arguments.dart index 0335abb80..f599116a9 100644 --- a/lib/features/email/presentation/model/composer_arguments.dart +++ b/lib/features/email/presentation/model/composer_arguments.dart @@ -24,6 +24,7 @@ class ComposerArguments extends RouterArguments { @override List get props => [ emailActionType, + presentationEmail, emailContents, attachments, mailboxRole, diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index 42496a06e..9ea732d39 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -108,6 +108,7 @@ class MailboxDashBoardController extends ReloadableController { } clearState(); } else if (success is SaveEmailAsDraftsSuccess) { + log('MailboxDashBoardController::onDone(): SaveEmailAsDraftsSuccess'); _saveEmailAsDraftsSuccess(success); clearState(); } else if (success is RemoveEmailDraftsSuccess