diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 78f7a8437..a71e3178b 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -51,6 +51,7 @@ import 'package:tmail_ui_user/features/composer/presentation/controller/rich_tex import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/file_upload_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/list_identities_extension.dart'; +import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/draggable_email_address.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/image_source.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/inline_image.dart'; @@ -872,31 +873,101 @@ class ComposerController extends BaseController { ? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName) : null; - final sendingEmailArguments = SendingEmailArguments( - session, - accountId, - emailRequest, - mailboxRequest, - sendingEmailActionType: arguments.sendingEmail != null - ? SendingEmailActionType.edit - : SendingEmailActionType.create, - ); - uploadController.clearInlineFileUploaded(); - - if (PlatformInfo.isWeb) { - closeComposerWeb(result: sendingEmailArguments); + if (PlatformInfo.isMobile && !networkConnectionController.isNetworkConnectionAvailable()) { + switch(arguments.sendingEmailActionType) { + case SendingEmailActionType.create: + _showConfirmDialogStoreSendingEmail( + SendingEmailArguments( + session, + accountId, + emailRequest, + mailboxRequest, + actionMode: ComposeActionMode.pushQueue + ) + ); + break; + case SendingEmailActionType.edit: + uploadController.clearInlineFileUploaded(); + _closeComposerAction( + result: SendingEmailArguments( + session, + accountId, + emailRequest, + mailboxRequest, + actionMode: ComposeActionMode.editQueue + ) + ); + break; + default: + uploadController.clearInlineFileUploaded(); + _closeComposerAction( + result: SendingEmailArguments( + session, + accountId, + emailRequest, + mailboxRequest, + ) + ); + } } else { - popBack(result: sendingEmailArguments); + uploadController.clearInlineFileUploaded(); + _closeComposerAction( + result: SendingEmailArguments( + session, + accountId, + emailRequest, + mailboxRequest, + ) + ); } } else { - if (PlatformInfo.isWeb) { - closeComposerWeb(); - } else { - popBack(); - } + logError('ComposerController::_handleSendMessages: arguments/accountId/userProfile/session is NULL'); + uploadController.clearInlineFileUploaded(); + _closeComposerAction(); } } + void _showConfirmDialogStoreSendingEmail(SendingEmailArguments sendingEmailArguments) { + showConfirmDialogAction( + currentContext!, + '', + AppLocalizations.of(currentContext!).proceed, + onConfirmAction: () { + uploadController.clearInlineFileUploaded(); + _closeComposerAction(result: sendingEmailArguments); + }, + title: AppLocalizations.of(currentContext!).youAreInOfflineMode, + icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode), + alignCenter: true, + messageStyle: const TextStyle( + color: AppColor.colorTitleSendingItem, + fontSize: 15, + fontWeight: FontWeight.normal + ), + listTextSpan: [ + TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailFirst), + TextSpan( + text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailSecond, + style: const TextStyle( + color: AppColor.colorTitleSendingItem, + fontSize: 15, + fontWeight: FontWeight.w600 + ), + ), + TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailThird), + TextSpan( + text: AppLocalizations.of(currentContext!).sendingQueue, + style: const TextStyle( + color: AppColor.colorTitleSendingItem, + fontSize: 15, + fontWeight: FontWeight.w600 + ), + ), + TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailTail) + ] + ); + } + void _checkContactPermission() async { final permissionStatus = await Permission.contacts.status; if (permissionStatus.isGranted) { @@ -1369,7 +1440,15 @@ class ComposerController extends BaseController { FocusScope.of(context).unfocus(); } - void closeComposerWeb({dynamic result}) { + void _closeComposerAction({dynamic result}) { + if (PlatformInfo.isWeb) { + _closeComposerWeb(result: result); + } else { + popBack(result: result); + } + } + + void _closeComposerWeb({dynamic result}) { FocusManager.instance.primaryFocus?.unfocus(); mailboxDashBoardController.closeComposerOverlay(result: result); } diff --git a/lib/features/composer/presentation/model/compose_action_mode.dart b/lib/features/composer/presentation/model/compose_action_mode.dart new file mode 100644 index 000000000..b6c10166b --- /dev/null +++ b/lib/features/composer/presentation/model/compose_action_mode.dart @@ -0,0 +1,6 @@ + +enum ComposeActionMode { + pushQueue, + editQueue, + sent +} \ No newline at end of file diff --git a/lib/features/email/presentation/model/composer_arguments.dart b/lib/features/email/presentation/model/composer_arguments.dart index 52d0a0e4a..4f6b969e9 100644 --- a/lib/features/email/presentation/model/composer_arguments.dart +++ b/lib/features/email/presentation/model/composer_arguments.dart @@ -5,6 +5,7 @@ import 'package:model/model.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/composer_cache.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; +import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart'; import 'package:tmail_ui_user/main/routes/router_arguments.dart'; class ComposerArguments extends RouterArguments { @@ -131,6 +132,10 @@ class ComposerArguments extends RouterArguments { references: references, ); + SendingEmailActionType get sendingEmailActionType => sendingEmail != null + ? SendingEmailActionType.edit + : SendingEmailActionType.create; + @override List get props => [ emailActionType, 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 c611d83c8..53d76b10c 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -29,6 +29,7 @@ import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_draft 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/send_email_interactor.dart'; +import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart'; import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_state.dart'; @@ -104,7 +105,6 @@ import 'package:tmail_ui_user/features/sending_queue/domain/state/update_sending import 'package:tmail_ui_user/features/sending_queue/domain/usecases/get_all_sending_email_interactor.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/usecases/store_sending_email_interactor.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/usecases/update_sending_email_interactor.dart'; -import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart'; import 'package:tmail_ui_user/features/session/domain/usecases/store_session_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; @@ -368,13 +368,21 @@ class MailboxDashBoardController extends ReloadableController { if (PlatformInfo.isMobile && failure is SendEmailFailure && exception is NoNetworkError) { - _handleSendingEmailWhenNoNetwork( - failure.session, - failure.accountId, - failure.emailRequest, - failure.mailboxRequest, - failure.sendingEmailActionType - ); + if (failure.emailRequest.storedSendingId != null) { + _handleStoreSendingEmail( + failure.session, + failure.accountId, + failure.emailRequest, + failure.mailboxRequest + ); + } else { + _handleUpdateSendingEmail( + failure.session, + failure.accountId, + failure.emailRequest, + failure.mailboxRequest + ); + } } } @@ -1243,13 +1251,7 @@ class MailboxDashBoardController extends ReloadableController { composerOverlayState.value = ComposerOverlayState.inActive; if (result is SendingEmailArguments) { - handleSendEmailAction( - result.session, - result.accountId, - result.emailRequest, - result.mailboxRequest, - result.sendingEmailActionType - ); + handleSendEmailAction(result); } } @@ -1361,13 +1363,7 @@ class MailboxDashBoardController extends ReloadableController { } else { final result = await push(AppRoutes.composer, arguments: arguments); if (result is SendingEmailArguments) { - handleSendEmailAction( - result.session, - result.accountId, - result.emailRequest, - result.mailboxRequest, - result.sendingEmailActionType - ); + handleSendEmailAction(result); } } } @@ -1806,47 +1802,31 @@ class MailboxDashBoardController extends ReloadableController { clearState(); } - void handleSendEmailAction( - Session session, - AccountId accountId, - EmailRequest emailRequest, - CreateNewMailboxRequest? mailboxRequest, - SendingEmailActionType sendingEmailActionType - ) { - if (PlatformInfo.isWeb || - (PlatformInfo.isMobile && networkConnectionController.isNetworkConnectionAvailable())) { - consumeState(_sendEmailInteractor.execute( - session, - accountId, - emailRequest, - mailboxRequest: mailboxRequest - )); - } else { - _handleSendingEmailWhenNoNetwork( - session, - accountId, - emailRequest, - mailboxRequest, - sendingEmailActionType - ); - } - } - - void _handleSendingEmailWhenNoNetwork( - Session session, - AccountId accountId, - EmailRequest emailRequest, - CreateNewMailboxRequest? mailboxRequest, - SendingEmailActionType? sendingEmailActionType - ) { - switch(sendingEmailActionType) { - case SendingEmailActionType.create: - _showConfirmDialogStoreSendingEmail(session, accountId, emailRequest, mailboxRequest); + void handleSendEmailAction(SendingEmailArguments arguments) { + switch(arguments.actionMode) { + case ComposeActionMode.pushQueue: + _handleStoreSendingEmail( + arguments.session, + arguments.accountId, + arguments.emailRequest, + arguments.mailboxRequest + ); break; - case SendingEmailActionType.edit: - _handleUpdateSendingEmail(session, accountId, emailRequest, mailboxRequest); + case ComposeActionMode.editQueue: + _handleUpdateSendingEmail( + arguments.session, + arguments.accountId, + arguments.emailRequest, + arguments.mailboxRequest + ); break; - default: + case ComposeActionMode.sent: + consumeState(_sendEmailInteractor.execute( + arguments.session, + arguments.accountId, + arguments.emailRequest, + mailboxRequest: arguments.mailboxRequest + )); break; } } @@ -1884,51 +1864,6 @@ class MailboxDashBoardController extends ReloadableController { } } - void _showConfirmDialogStoreSendingEmail( - Session session, - AccountId accountId, - EmailRequest emailRequest, - CreateNewMailboxRequest? mailboxRequest - ) { - showConfirmDialogAction( - currentContext!, - '', - AppLocalizations.of(currentContext!).proceed, - onConfirmAction: () { - _handleStoreSendingEmail(session, accountId, emailRequest, mailboxRequest); - }, - title: AppLocalizations.of(currentContext!).youAreInOfflineMode, - icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode), - alignCenter: true, - messageStyle: const TextStyle( - color: AppColor.colorTitleSendingItem, - fontSize: 15, - fontWeight: FontWeight.normal - ), - listTextSpan: [ - TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailFirst), - TextSpan( - text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailSecond, - style: const TextStyle( - color: AppColor.colorTitleSendingItem, - fontSize: 15, - fontWeight: FontWeight.w600 - ), - ), - TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailThird), - TextSpan( - text: AppLocalizations.of(currentContext!).sendingQueue, - style: const TextStyle( - color: AppColor.colorTitleSendingItem, - fontSize: 15, - fontWeight: FontWeight.w600 - ), - ), - TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailTail) - ] - ); - } - void _handleStoreSendingEmailSuccess(StoreSendingEmailSuccess success) { addSendingEmailToSendingQueue(success.sendingEmail); getAllSendingEmails(); @@ -2124,7 +2059,7 @@ class MailboxDashBoardController extends ReloadableController { void disableDraggableApp() { draggableAppState.value = DraggableAppState.inActive; } - + @override void onClose() { _emailReceiveManager.closeEmailReceiveManagerStream(); diff --git a/lib/features/sending_queue/presentation/model/sending_email_arguments.dart b/lib/features/sending_queue/presentation/model/sending_email_arguments.dart index ec80ee2fd..af326cb00 100644 --- a/lib/features/sending_queue/presentation/model/sending_email_arguments.dart +++ b/lib/features/sending_queue/presentation/model/sending_email_arguments.dart @@ -1,8 +1,8 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; +import 'package:tmail_ui_user/features/composer/presentation/model/compose_action_mode.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; -import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart'; import 'package:tmail_ui_user/main/routes/router_arguments.dart'; class SendingEmailArguments extends RouterArguments { @@ -10,7 +10,7 @@ class SendingEmailArguments extends RouterArguments { final AccountId accountId; final EmailRequest emailRequest; final CreateNewMailboxRequest? mailboxRequest; - final SendingEmailActionType sendingEmailActionType; + final ComposeActionMode actionMode; SendingEmailArguments( this.session, @@ -18,7 +18,7 @@ class SendingEmailArguments extends RouterArguments { this.emailRequest, this.mailboxRequest, { - this.sendingEmailActionType = SendingEmailActionType.create + this.actionMode = ComposeActionMode.sent } ); @@ -28,6 +28,6 @@ class SendingEmailArguments extends RouterArguments { accountId, emailRequest, mailboxRequest, - sendingEmailActionType + actionMode ]; }