TF-2667 Show confirm dialog when send email failed

This commit is contained in:
dab246
2024-03-06 00:47:57 +07:00
committed by Dat H. Pham
parent ea58a4bd16
commit 57a41a6a50
7 changed files with 119 additions and 17 deletions
@@ -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/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/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/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_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/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/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/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/create_new_and_send_email_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/download_image_as_base64_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, showConfirmDialogAction(context,
AppLocalizations.of(context).message_dialog_send_email_without_a_subject, AppLocalizations.of(context).message_dialog_send_email_without_a_subject,
AppLocalizations.of(context).send_anyway, AppLocalizations.of(context).send_anyway,
onConfirmAction: _handleSendMessages, onConfirmAction: () => _handleSendMessages(context),
title: AppLocalizations.of(context).empty_subject, title: AppLocalizations.of(context).empty_subject,
showAsBottomSheet: true, showAsBottomSheet: true,
icon: SvgPicture.asset(imagePaths.icEmpty, fit: BoxFit.fill), icon: SvgPicture.asset(imagePaths.icEmpty, fit: BoxFit.fill),
@@ -889,7 +891,7 @@ class ComposerController extends BaseController with DragDropFileMixin {
return; return;
} }
_handleSendMessages(); _handleSendMessages(context);
} }
Future<String> _getContentInEditor() async { Future<String> _getContentInEditor() async {
@@ -903,7 +905,7 @@ class ComposerController extends BaseController with DragDropFileMixin {
} }
} }
void _handleSendMessages() async { void _handleSendMessages(BuildContext context) async {
if (composerArguments.value == null || if (composerArguments.value == null ||
mailboxDashBoardController.sessionCurrent == null || mailboxDashBoardController.sessionCurrent == null ||
mailboxDashBoardController.accountId.value == null mailboxDashBoardController.accountId.value == null
@@ -916,7 +918,23 @@ class ComposerController extends BaseController with DragDropFileMixin {
final emailContent = await _getContentInEditor(); 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<dynamic> _showSendingMessageDialog({required String emailContent}) {
return Get.dialog(
PointerInterceptor( PointerInterceptor(
child: SendingMessageDialogView( child: SendingMessageDialogView(
createEmailRequest: CreateEmailRequest( createEmailRequest: CreateEmailRequest(
@@ -936,8 +954,8 @@ class ComposerController extends BaseController with DragDropFileMixin {
outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId, outboxMailboxId: mailboxDashBoardController.outboxMailbox?.mailboxId,
sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent], sentMailboxId: mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleSent],
draftsEmailId: composerArguments.value!.emailActionType == EmailActionType.editDraft draftsEmailId: composerArguments.value!.emailActionType == EmailActionType.editDraft
? composerArguments.value!.presentationEmail?.id ? composerArguments.value!.presentationEmail?.id
: null, : null,
answerForwardEmailId: composerArguments.value!.presentationEmail?.id, answerForwardEmailId: composerArguments.value!.presentationEmail?.id,
unsubscribeEmailId: composerArguments.value!.previousEmailId, unsubscribeEmailId: composerArguments.value!.previousEmailId,
messageId: composerArguments.value!.messageId, messageId: composerArguments.value!.messageId,
@@ -949,9 +967,50 @@ class ComposerController extends BaseController with DragDropFileMixin {
), ),
barrierColor: AppColor.colorDefaultCupertinoActionSheet, barrierColor: AppColor.colorDefaultCupertinoActionSheet,
); );
}
_sendButtonState = ButtonState.enabled; void _showConfirmDialogWhenSendMessageFailure({
_closeComposerAction(result: resultState); 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 { void _checkContactPermission() async {
@@ -179,7 +179,9 @@ class MailboxView extends BaseMailboxView {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
return UserInformationWidget( return UserInformationWidget(
userName: controller.mailboxDashBoardController.sessionCurrent?.username, userName: controller.mailboxDashBoardController.accountId.value != null
? controller.mailboxDashBoardController.sessionCurrent?.username
: null,
subtitle: AppLocalizations.of(context).manage_account, subtitle: AppLocalizations.of(context).manage_account,
onSubtitleClick: controller.mailboxDashBoardController.goToSettings, onSubtitleClick: controller.mailboxDashBoardController.goToSettings,
border: const Border( border: const Border(
@@ -100,7 +100,9 @@ class MailboxView extends BaseMailboxView {
child: Column(children: [ child: Column(children: [
if (!controller.responsiveUtils.isDesktop(context)) if (!controller.responsiveUtils.isDesktop(context))
Obx(() => UserInformationWidget( Obx(() => UserInformationWidget(
userName: controller.mailboxDashBoardController.sessionCurrent?.username, userName: controller.mailboxDashBoardController.accountId.value != null
? controller.mailboxDashBoardController.sessionCurrent?.username
: null,
subtitle: AppLocalizations.of(context).manage_account, subtitle: AppLocalizations.of(context).manage_account,
onSubtitleClick: controller.mailboxDashBoardController.goToSettings, onSubtitleClick: controller.mailboxDashBoardController.goToSettings,
border: const Border( border: const Border(
@@ -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/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/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/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/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/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/send_email_state.dart';
@@ -1263,8 +1262,6 @@ class MailboxDashBoardController extends ReloadableController {
saveEmailToDraft(arguments: result); saveEmailToDraft(arguments: result);
} else if (result is SendEmailSuccess) { } else if (result is SendEmailSuccess) {
consumeState(Stream.value(Right<Failure, Success>(result))); consumeState(Stream.value(Right<Failure, Success>(result)));
} else if (result is SendEmailFailure || result is GenerateEmailFailure) {
consumeState(Stream.value(Left<Failure, Success>(result)));
} }
} }
@@ -1400,8 +1397,6 @@ class MailboxDashBoardController extends ReloadableController {
saveEmailToDraft(arguments: result); saveEmailToDraft(arguments: result);
} else if (result is SendEmailSuccess) { } else if (result is SendEmailSuccess) {
consumeState(Stream.value(Right<Failure, Success>(result))); consumeState(Stream.value(Right<Failure, Success>(result)));
} else if (result is SendEmailFailure || result is GenerateEmailFailure) {
consumeState(Stream.value(Left<Failure, Success>(result)));
} }
} }
} }
@@ -19,7 +19,9 @@ class SettingsFirstLevelView extends GetWidget<SettingsController> {
controller: PlatformInfo.isMobile ? null : controller.settingScrollController, controller: PlatformInfo.isMobile ? null : controller.settingScrollController,
child: Column(children: [ child: Column(children: [
Obx(() => UserInformationWidget( Obx(() => UserInformationWidget(
userName: controller.manageAccountDashboardController.sessionCurrent?.username, userName: controller.manageAccountDashboardController.accountId.value != null
? controller.manageAccountDashboardController.sessionCurrent?.username
: null,
padding: SettingsUtils.getPaddingInFirstLevel(context, controller.responsiveUtils), padding: SettingsUtils.getPaddingInFirstLevel(context, controller.responsiveUtils),
titlePadding: const EdgeInsetsDirectional.only(start: 16))), titlePadding: const EdgeInsetsDirectional.only(start: 16))),
Divider( Divider(
+31 -1
View File
@@ -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": "Initializing data...",
"@initializing_data": { "@initializing_data": {
"type": "text", "type": "text",
@@ -3773,5 +3773,35 @@
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "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": {}
} }
} }
@@ -3962,4 +3962,16 @@ class AppLocalizations {
'Sending message', 'Sending message',
name: 'sendingMessage'); 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');
}
} }