From 57a41a6a5002ecb255f87f0918ddab3181c70e02 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 6 Mar 2024 00:47:57 +0700 Subject: [PATCH] TF-2667 Show confirm dialog when send email failed --- .../presentation/composer_controller.dart | 75 +++++++++++++++++-- .../mailbox/presentation/mailbox_view.dart | 4 +- .../presentation/mailbox_view_web.dart | 4 +- .../mailbox_dashboard_controller.dart | 5 -- .../settings/settings_first_level_view.dart | 4 +- lib/l10n/intl_messages.arb | 32 +++++++- lib/main/localizations/app_localizations.dart | 12 +++ 7 files changed, 119 insertions(+), 17 deletions(-) diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 3c404c95d..d58cc0235 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -37,9 +37,11 @@ import 'package:tmail_ui_user/features/base/state/base_ui_state.dart'; import 'package:tmail_ui_user/features/base/state/button_state.dart'; import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart'; import 'package:tmail_ui_user/features/composer/domain/state/download_image_as_base64_state.dart'; +import 'package:tmail_ui_user/features/composer/domain/state/generate_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_device_contact_suggestions_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; +import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/create_new_and_send_email_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/download_image_as_base64_interactor.dart'; @@ -855,7 +857,7 @@ class ComposerController extends BaseController with DragDropFileMixin { showConfirmDialogAction(context, AppLocalizations.of(context).message_dialog_send_email_without_a_subject, AppLocalizations.of(context).send_anyway, - onConfirmAction: _handleSendMessages, + onConfirmAction: () => _handleSendMessages(context), title: AppLocalizations.of(context).empty_subject, showAsBottomSheet: true, icon: SvgPicture.asset(imagePaths.icEmpty, fit: BoxFit.fill), @@ -889,7 +891,7 @@ class ComposerController extends BaseController with DragDropFileMixin { return; } - _handleSendMessages(); + _handleSendMessages(context); } Future _getContentInEditor() async { @@ -903,7 +905,7 @@ class ComposerController extends BaseController with DragDropFileMixin { } } - void _handleSendMessages() async { + void _handleSendMessages(BuildContext context) async { if (composerArguments.value == null || mailboxDashBoardController.sessionCurrent == null || mailboxDashBoardController.accountId.value == null @@ -916,7 +918,23 @@ class ComposerController extends BaseController with DragDropFileMixin { final emailContent = await _getContentInEditor(); - final resultState = await Get.dialog( + final resultState = await _showSendingMessageDialog(emailContent: emailContent); + + if (resultState is SendEmailSuccess) { + _sendButtonState = ButtonState.enabled; + _closeComposerAction(result: resultState); + } else if ((resultState is SendEmailFailure || resultState is GenerateEmailFailure) && context.mounted) { + _showConfirmDialogWhenSendMessageFailure( + context: context, + failure: resultState + ); + } else { + _sendButtonState = ButtonState.enabled; + } + } + + Future _showSendingMessageDialog({required String emailContent}) { + return Get.dialog( PointerInterceptor( child: SendingMessageDialogView( createEmailRequest: CreateEmailRequest( @@ -936,8 +954,8 @@ class ComposerController extends BaseController with DragDropFileMixin { outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId, sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent], draftsEmailId: composerArguments.value!.emailActionType == EmailActionType.editDraft - ? composerArguments.value!.presentationEmail?.id - : null, + ? composerArguments.value!.presentationEmail?.id + : null, answerForwardEmailId: composerArguments.value!.presentationEmail?.id, unsubscribeEmailId: composerArguments.value!.previousEmailId, messageId: composerArguments.value!.messageId, @@ -949,9 +967,50 @@ class ComposerController extends BaseController with DragDropFileMixin { ), barrierColor: AppColor.colorDefaultCupertinoActionSheet, ); + } - _sendButtonState = ButtonState.enabled; - _closeComposerAction(result: resultState); + void _showConfirmDialogWhenSendMessageFailure({ + required BuildContext context, + required FeatureFailure failure + }) { + showConfirmDialogAction( + context, + title: '', + AppLocalizations.of(context).warningMessageWhenSendEmailFailure, + AppLocalizations.of(context).edit, + cancelTitle: AppLocalizations.of(context).closeAnyway, + alignCenter: true, + onConfirmAction: () { + _sendButtonState = ButtonState.enabled; + popBack(); + _autoFocusFieldWhenLauncher(); + }, + onCancelAction: () async { + _sendButtonState = ButtonState.enabled; + await Future.delayed( + const Duration(milliseconds: 100), + _closeComposerAction + ); + }, + icon: SvgPicture.asset( + imagePaths.icQuotasWarning, + width: 40, + height: 40, + colorFilter: AppColor.colorBackgroundQuotasWarning.asFilter(), + ), + 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 _checkContactPermission() async { diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index cd892d688..ed13f9f8d 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -179,7 +179,9 @@ class MailboxView extends BaseMailboxView { return const SizedBox.shrink(); } return UserInformationWidget( - userName: controller.mailboxDashBoardController.sessionCurrent?.username, + userName: controller.mailboxDashBoardController.accountId.value != null + ? controller.mailboxDashBoardController.sessionCurrent?.username + : null, subtitle: AppLocalizations.of(context).manage_account, onSubtitleClick: controller.mailboxDashBoardController.goToSettings, border: const Border( diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 4dbab42c8..976176ed0 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -100,7 +100,9 @@ class MailboxView extends BaseMailboxView { child: Column(children: [ if (!controller.responsiveUtils.isDesktop(context)) Obx(() => UserInformationWidget( - userName: controller.mailboxDashBoardController.sessionCurrent?.username, + userName: controller.mailboxDashBoardController.accountId.value != null + ? controller.mailboxDashBoardController.sessionCurrent?.username + : null, subtitle: AppLocalizations.of(context).manage_account, onSubtitleClick: controller.mailboxDashBoardController.goToSettings, border: const Border( diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 784e1d67b..42e14e4a0 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -30,7 +30,6 @@ import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dar import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart'; import 'package:tmail_ui_user/features/composer/domain/extensions/email_request_extension.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; -import 'package:tmail_ui_user/features/composer/domain/state/generate_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; @@ -1263,8 +1262,6 @@ class MailboxDashBoardController extends ReloadableController { saveEmailToDraft(arguments: result); } else if (result is SendEmailSuccess) { consumeState(Stream.value(Right(result))); - } else if (result is SendEmailFailure || result is GenerateEmailFailure) { - consumeState(Stream.value(Left(result))); } } @@ -1400,8 +1397,6 @@ class MailboxDashBoardController extends ReloadableController { saveEmailToDraft(arguments: result); } else if (result is SendEmailSuccess) { consumeState(Stream.value(Right(result))); - } else if (result is SendEmailFailure || result is GenerateEmailFailure) { - consumeState(Stream.value(Left(result))); } } } diff --git a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart index 10af95629..81a9914d7 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart @@ -19,7 +19,9 @@ class SettingsFirstLevelView extends GetWidget { controller: PlatformInfo.isMobile ? null : controller.settingScrollController, child: Column(children: [ Obx(() => UserInformationWidget( - userName: controller.manageAccountDashboardController.sessionCurrent?.username, + userName: controller.manageAccountDashboardController.accountId.value != null + ? controller.manageAccountDashboardController.sessionCurrent?.username + : null, padding: SettingsUtils.getPaddingInFirstLevel(context, controller.responsiveUtils), titlePadding: const EdgeInsetsDirectional.only(start: 16))), Divider( diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 8675ed7ae..5eee433f3 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2024-03-15T21:34:52.177175", + "@@last_modified": "2024-03-06T00:47:30.311599", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3773,5 +3773,35 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "status": "Status", + "@status": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "progress": "Progress", + "@progress": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "sendingMessage": "Sending message", + "@sendingMessage": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "warningMessageWhenSendEmailFailure": "Sending of the message failed.\nAn error occurred while sending mail.", + "@warningMessageWhenSendEmailFailure": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "closeAnyway": "Close anyway", + "@closeAnyway": { + "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 fedc72313..9fe57f82b 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3962,4 +3962,16 @@ class AppLocalizations { 'Sending message', name: 'sendingMessage'); } + + String get warningMessageWhenSendEmailFailure { + return Intl.message( + 'Sending of the message failed.\nAn error occurred while sending mail.', + name: 'warningMessageWhenSendEmailFailure'); + } + + String get closeAnyway { + return Intl.message( + 'Close anyway', + name: 'closeAnyway'); + } } \ No newline at end of file