From 490a913bdbb5b9bcd3126d8e5b85f9dae2dd161b Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 6 Mar 2024 01:50:54 +0700 Subject: [PATCH] TF-2667 Show confirm dialog when click close composer Signed-off-by: dab246 --- .../dialog/confirmation_dialog_builder.dart | 4 +- .../mixin/message_dialog_action_mixin.dart | 9 +- .../presentation/composer_controller.dart | 101 +++++++++++++++--- .../widgets/sending_message_dialog_view.dart | 4 +- lib/l10n/intl_messages.arb | 20 +++- lib/main/localizations/app_localizations.dart | 18 ++++ 6 files changed, 137 insertions(+), 19 deletions(-) diff --git a/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart b/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart index 036f48523..054246ff6 100644 --- a/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart +++ b/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart @@ -27,7 +27,7 @@ class ConfirmDialogBuilder { EdgeInsets? _paddingContent; EdgeInsets? _paddingButton; EdgeInsets? _outsideDialogPadding; - EdgeInsets? _marginIcon; + EdgeInsetsGeometry? _marginIcon; EdgeInsets? _margin; double? _widthDialog; double? _heightDialog; @@ -107,7 +107,7 @@ class ConfirmDialogBuilder { _paddingButton = value; } - void marginIcon(EdgeInsets? value) { + void marginIcon(EdgeInsetsGeometry? value) { _marginIcon = value; } diff --git a/lib/features/base/mixin/message_dialog_action_mixin.dart b/lib/features/base/mixin/message_dialog_action_mixin.dart index 88cf77dac..bb4f09841 100644 --- a/lib/features/base/mixin/message_dialog_action_mixin.dart +++ b/lib/features/base/mixin/message_dialog_action_mixin.dart @@ -15,6 +15,7 @@ mixin MessageDialogActionMixin { { Function? onConfirmAction, Function? onCancelAction, + OnCloseButtonAction? onCloseButtonAction, String? title, String? cancelTitle, bool hasCancelButton = true, @@ -28,6 +29,7 @@ mixin MessageDialogActionMixin { TextStyle? cancelStyle, Color? actionButtonColor, Color? cancelButtonColor, + EdgeInsetsGeometry? marginIcon, } ) async { final responsiveUtils = Get.find(); @@ -43,7 +45,7 @@ mixin MessageDialogActionMixin { ..addIcon(icon) ..colorConfirmButton(actionButtonColor ?? AppColor.colorTextButton) ..colorCancelButton(cancelButtonColor ?? AppColor.colorCancelButton) - ..marginIcon(icon != null ? const EdgeInsets.only(top: 24) : null) + ..marginIcon(icon != null ? (marginIcon ?? const EdgeInsets.only(top: 24)) : null) ..paddingTitle(icon != null ? const EdgeInsetsDirectional.only(top: 24, start: 24, end: 24) : const EdgeInsetsDirectional.symmetric(horizontal: 24) @@ -66,6 +68,7 @@ mixin MessageDialogActionMixin { onCancelAction?.call(); } ) + ..onCloseButtonAction(onCloseButtonAction) ).build() ), barrierColor: AppColor.colorDefaultCupertinoActionSheet, @@ -111,7 +114,7 @@ mixin MessageDialogActionMixin { onCancelAction?.call(); } ) - ..onCloseButtonAction(() => popBack())) + ..onCloseButtonAction(onCloseButtonAction ?? () => popBack())) .build() ), isScrollControlled: true, @@ -171,7 +174,7 @@ mixin MessageDialogActionMixin { onCancelAction?.call(); } ) - ..onCloseButtonAction(() => popBack())) + ..onCloseButtonAction(onCloseButtonAction ?? () => popBack())) .build() ), barrierColor: AppColor.colorDefaultCupertinoActionSheet, diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index d58cc0235..40f39a6bb 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -428,7 +428,9 @@ class ComposerController extends BaseController with DragDropFileMixin { } void onCreatedMobileEditorAction(BuildContext context, HtmlEditorApi editorApi, String? content) { - initTextEditor(content); + if (identitySelected.value != null) { + initTextEditor(content); + } richTextMobileTabletController.htmlEditorApi = editorApi; keyboardRichTextController.onCreateHTMLEditor( editorApi, @@ -982,7 +984,6 @@ class ComposerController extends BaseController with DragDropFileMixin { alignCenter: true, onConfirmAction: () { _sendButtonState = ButtonState.enabled; - popBack(); _autoFocusFieldWhenLauncher(); }, onCancelAction: () async { @@ -1170,8 +1171,9 @@ class ComposerController extends BaseController with DragDropFileMixin { PresentationEmail? presentationEmail, Role? mailboxRole, }) async { - final newEmailBody = await _getEmailBodyText(context, asDrafts: true); + final newEmailBody = await _getContentInEditor(); final oldEmailBody = _initTextEditor ?? ''; + log('ComposerController::_validateEmailChange: newEmailBody = $newEmailBody | oldEmailBody = $oldEmailBody'); final isEmailBodyChanged = !oldEmailBody.trim().isSame(newEmailBody.trim()); final newEmailSubject = subjectEmail.value ?? ''; @@ -1936,7 +1938,9 @@ class ComposerController extends BaseController with DragDropFileMixin { HtmlEditorApi? get htmlEditorApi => richTextMobileTabletController.htmlEditorApi; void onChangeTextEditorWeb(String? text) { - initTextEditor(text); + if (identitySelected.value != null) { + initTextEditor(text); + } _textEditorWeb = text; } @@ -2053,19 +2057,92 @@ class ComposerController extends BaseController with DragDropFileMixin { log('ComposerController::handleClickCloseComposer: _closeComposerButtonState = disabled'); return; } - - if (!_isEmailBodyLoaded) { - log('ComposerController::handleClickCloseComposer: _isEmailBodyLoaded = false'); + + _closeComposerButtonState = ButtonState.disabled; + + if (composerArguments.value == null) { + log('ComposerController::handleClickCloseComposer: ARGUMENTS is NULL'); clearFocus(context); _closeComposerAction(); return; } - _closeComposerButtonState = ButtonState.disabled; - clearFocus(context); - final draftArgs = await _generateSaveAsDraftsArguments(context); - _closeComposerAction(result: draftArgs); - _closeComposerButtonState = ButtonState.enabled; + final isChanged = await _validateEmailChange( + context: context, + emailActionType: composerArguments.value!.emailActionType, + presentationEmail: composerArguments.value!.presentationEmail, + mailboxRole: composerArguments.value!.mailboxRole + ); + + if (isChanged && context.mounted) { + clearFocus(context); + _showConfirmDialogSaveMessage(context); + return; + } + + if (!_isEmailBodyLoaded && context.mounted) { + log('ComposerController::handleClickCloseComposer: EDITOR NOT LOADED'); + _closeComposerButtonState = ButtonState.enabled; + clearFocus(context); + _closeComposerAction(); + return; + } + + if (context.mounted) { + _closeComposerButtonState = ButtonState.enabled; + clearFocus(context); + _closeComposerAction(); + } + } + + void _showConfirmDialogSaveMessage(BuildContext context) { + showConfirmDialogAction( + context, + title: AppLocalizations.of(context).saveMessage.capitalizeFirstEach, + AppLocalizations.of(context).warningMessageWhenClickCloseComposer, + AppLocalizations.of(context).save, + cancelTitle: AppLocalizations.of(context).discardChanges, + alignCenter: true, + onConfirmAction: () { + _closeComposerButtonState = ButtonState.enabled; + }, + onCancelAction: () async { + _closeComposerButtonState = ButtonState.enabled; + await Future.delayed( + const Duration(milliseconds: 100), + _closeComposerAction + ); + }, + onCloseButtonAction: () { + _closeComposerButtonState = ButtonState.enabled; + popBack(); + _autoFocusFieldWhenLauncher(); + }, + marginIcon: EdgeInsets.zero, + icon: SvgPicture.asset( + imagePaths.icQuotasWarning, + width: 40, + height: 40, + colorFilter: AppColor.colorBackgroundQuotasWarning.asFilter(), + ), + titleStyle: Theme.of(context).textTheme.labelLarge?.copyWith( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black + ), + messageStyle: Theme.of(context).textTheme.labelMedium?.copyWith( + fontSize: 14, + color: AppColor.colorTextBody + ), + actionStyle: Theme.of(context).textTheme.labelMedium?.copyWith( + fontSize: 17, + color: Colors.white + ), + cancelStyle: Theme.of(context).textTheme.labelMedium?.copyWith( + fontSize: 17, + color: Colors.black + ) + ); } void _getAlwaysReadReceiptSetting() { diff --git a/lib/features/composer/presentation/widgets/sending_message_dialog_view.dart b/lib/features/composer/presentation/widgets/sending_message_dialog_view.dart index a1aa4d173..f80d9b574 100644 --- a/lib/features/composer/presentation/widgets/sending_message_dialog_view.dart +++ b/lib/features/composer/presentation/widgets/sending_message_dialog_view.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:math'; import 'package:core/presentation/extensions/capitalize_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart'; @@ -7,6 +8,7 @@ import 'package:core/presentation/state/success.dart'; import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart' as dartz; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:tmail_ui_user/features/composer/domain/state/generate_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_send_email_interactor.dart'; @@ -82,7 +84,7 @@ class _SendingMessageDialogViewState extends State { borderRadius: BorderRadius.all(Radius.circular(12)), color: Colors.white, ), - width: 400, + width: min(context.width, 400), child: Column( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 5eee433f3..dbbfcce02 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2024-03-06T00:47:30.311599", + "@@last_modified": "2024-03-06T01:50:29.250412", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3803,5 +3803,23 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "saveMessage": "Save message", + "@saveMessage": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "discardChanges": "Discard changes", + "@discardChanges": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "warningMessageWhenClickCloseComposer": "Save this message to your drafts folder and close composer?", + "@warningMessageWhenClickCloseComposer": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 9fe57f82b..0216e2501 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3974,4 +3974,22 @@ class AppLocalizations { 'Close anyway', name: 'closeAnyway'); } + + String get saveMessage { + return Intl.message( + 'Save message', + name: 'saveMessage'); + } + + String get discardChanges { + return Intl.message( + 'Discard changes', + name: 'discardChanges'); + } + + String get warningMessageWhenClickCloseComposer { + return Intl.message( + 'Save this message to your drafts folder and close composer?', + name: 'warningMessageWhenClickCloseComposer'); + } } \ No newline at end of file