diff --git a/lib/features/base/mixin/contact_support_mixin.dart b/lib/features/base/mixin/contact_support_mixin.dart index fb9aaaad3..919788332 100644 --- a/lib/features/base/mixin/contact_support_mixin.dart +++ b/lib/features/base/mixin/contact_support_mixin.dart @@ -5,6 +5,7 @@ import 'package:model/extensions/contact_support_capability_extension.dart'; import 'package:model/support/contact_support_capability.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart'; @@ -31,7 +32,7 @@ mixin ContactSupportMixin { AppUtils.launchLink(mailtoLink); } else { final mailboxDashBoardController = getBinding(); - mailboxDashBoardController?.goToComposer( + mailboxDashBoardController?.openComposer( ComposerArguments.fromEmailAddress(EmailAddress(null, mailAddress)), ); } diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 862803b63..cc3e3662d 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -89,6 +89,7 @@ import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/remove_composer_cache_on_web_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; @@ -1601,17 +1602,11 @@ class ComposerController extends BaseController } void _closeComposerAction({dynamic result, bool closeOverlays = false}) { - if (PlatformInfo.isWeb) { - if (closeOverlays) { - popBack(); - } - mailboxDashBoardController.closeComposerOnWeb( - composerId: composerId, - result: result, - ); - } else { - popBack(result: result, closeOverlays: closeOverlays); - } + mailboxDashBoardController.closeComposer( + result: result, + closeOverlays: closeOverlays, + composerId: composerId, + ); } void displayScreenTypeComposerAction(ScreenDisplayMode displayMode) async { diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 74bc0f5e8..f4e604980 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -119,6 +119,7 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart'; @@ -1462,7 +1463,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void composeEmailFromEmailAddress(EmailAddress emailAddress) { popBack(); - mailboxDashBoardController.goToComposer(ComposerArguments.fromEmailAddress(emailAddress)); + mailboxDashBoardController.openComposer(ComposerArguments.fromEmailAddress(emailAddress)); } Future openMailToLink(Uri? uri) async { @@ -1472,7 +1473,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { log('SingleEmailController::openMailToLink(): ${uri.toString()}'); if (!RouteUtils.canOpenComposerFromNavigationRouter(navigationRouter)) return; - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.fromMailtoUri( listEmailAddress: navigationRouter.listEmailAddress, cc: navigationRouter.cc, @@ -1657,10 +1658,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin { ) { switch(emailActionType) { case EmailActionType.compose: - mailboxDashBoardController.goToComposer(ComposerArguments()); + mailboxDashBoardController.openComposer(ComposerArguments()); break; case EmailActionType.reply: - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.replyEmail( presentationEmail: presentationEmail, content: currentEmailLoaded.value?.htmlContent ?? '', @@ -1674,7 +1675,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { break; case EmailActionType.replyToList: log('SingleEmailController::pressEmailAction:replyToList'); - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.replyToListEmail( presentationEmail: presentationEmail, content: currentEmailLoaded.value?.htmlContent ?? '', @@ -1687,7 +1688,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { ); break; case EmailActionType.replyAll: - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.replyAllEmail( presentationEmail: presentationEmail, content: currentEmailLoaded.value?.htmlContent ?? '', @@ -1700,7 +1701,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { ); break; case EmailActionType.forward: - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.forwardEmail( presentationEmail: presentationEmail, content: currentEmailLoaded.value?.htmlContent ?? '', @@ -1832,7 +1833,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void openNewComposerAction(String mailTo) { final emailAddress = EmailAddress(mailTo, mailTo); - mailboxDashBoardController.goToComposer(ComposerArguments.fromEmailAddress(emailAddress)); + mailboxDashBoardController.openComposer(ComposerArguments.fromEmailAddress(emailAddress)); } void openAttachmentList(BuildContext context, List attachments) { @@ -1923,7 +1924,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { }) { log('SingleEmailController::_handleUnsubscribeMailByMailtoLink:mailtoLinks: $mailtoLinks'); final navigationRouter = RouteUtils.generateNavigationRouterFromMailtoLink(mailtoLinks.first); - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.fromUnsubscribeMailtoLink( listEmailAddress: navigationRouter.listEmailAddress, subject: navigationRouter.subject, @@ -2148,7 +2149,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void _editAsNewEmail(PresentationEmail presentationEmail) { if (accountId == null || session == null) return; - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.editAsNewEmail(presentationEmail), ); } @@ -2436,7 +2437,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { final currentUserEmail = mailboxDashBoardController.getOwnEmailAddress(); final listEmailAddressMailTo = listEmailAddressAttendees.removeInvalidEmails(currentUserEmail); log('SingleEmailController::handleMailToAttendees: listEmailAddressMailTo = $listEmailAddressMailTo'); - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.fromMailtoUri(listEmailAddress: listEmailAddressMailTo) ); } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 66e3edb37..850f93c11 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -84,6 +84,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_ma import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/websocket/web_socket_message.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/websocket/web_socket_queue_handler.dart'; @@ -697,7 +698,7 @@ class MailboxController extends BaseMailboxController } if (_navigationRouter?.routeName == AppRoutes.mailtoURL) { - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.fromMailtoUri( listEmailAddress: _navigationRouter?.listEmailAddress, cc: _navigationRouter?.cc, diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index 466a3083b..133e466c2 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -196,7 +196,6 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), - Get.find(), )); Get.put(AdvancedFilterController()); } 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 6adb2db63..42b10943d 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -40,8 +40,6 @@ import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.da import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; -import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart'; -import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/list_identities_extension.dart'; import 'package:tmail_ui_user/features/composer/presentation/manager/composer_manager.dart'; @@ -71,7 +69,6 @@ import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_int import 'package:tmail_ui_user/features/email/domain/usecases/restore_deleted_message_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; -import 'package:tmail_ui_user/features/email/presentation/extensions/composer_arguments_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; import 'package:tmail_ui_user/features/email_recovery/presentation/model/email_recovery_arguments.dart'; @@ -104,6 +101,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_preferences_setting_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/set_error_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart'; @@ -190,6 +188,7 @@ class MailboxDashBoardController extends ReloadableController final AppGridDashboardController appGridDashboardController = Get.find(); final SpamReportController spamReportController = Get.find(); final NetworkConnectionController networkConnectionController = Get.find(); + final ComposerManager composerManager = Get.find(); final MoveToMailboxInteractor _moveToMailboxInteractor; final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor; @@ -216,7 +215,6 @@ class MailboxDashBoardController extends ReloadableController final GetRestoredDeletedMessageInterator _getRestoredDeletedMessageInteractor; final RemoveComposerCacheOnWebInteractor _removeComposerCacheOnWebInteractor; final GetAllIdentitiesInteractor _getAllIdentitiesInteractor; - final ComposerManager _composerManager; GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; @@ -308,7 +306,6 @@ class MailboxDashBoardController extends ReloadableController this._getRestoredDeletedMessageInteractor, this._removeComposerCacheOnWebInteractor, this._getAllIdentitiesInteractor, - this._composerManager, ); @override @@ -318,7 +315,7 @@ class MailboxDashBoardController extends ReloadableController _registerDeepLinks(); } _registerStreamListener(); - BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard); + BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard); WidgetsBinding.instance.addPostFrameCallback((_) async { await applicationManager.initUserAgent(); }); @@ -436,8 +433,8 @@ class MailboxDashBoardController extends ReloadableController } else if (success is GetAllIdentitiesSuccess) { _handleGetAllIdentitiesSuccess(success); } else if (success is GetComposerCacheSuccess) { - _removeComposerCacheOnWeb(); - goToComposer(ComposerArguments.fromSessionStorageBrowser(success.composerCache)); + removeComposerCacheOnWeb(); + openComposer(ComposerArguments.fromSessionStorageBrowser(success.composerCache)); } else if (success is GetIdentityCacheOnWebSuccess) { goToSettings(); } else if (success is MarkAsStarEmailSuccess) { @@ -489,7 +486,7 @@ class MailboxDashBoardController extends ReloadableController SmartDialog.dismiss(); if (failure is SendEmailFailure && exception is NoNetworkError) { - _storeSendingEmailInCaseOfSendingFailureInMobile(failure); + storeSendingEmailInCaseOfSendingFailureInMobile(failure); } else { super.handleUrgentExceptionOnMobile(failure: failure, exception: exception); } @@ -538,17 +535,17 @@ class MailboxDashBoardController extends ReloadableController case SharedMediaType.image: case SharedMediaType.video: case SharedMediaType.file: - goToComposer( + openComposer( ComposerArguments.fromFileShared([sharedMediaFile]), ); break; case SharedMediaType.text: if (sharedMediaFile.mimeType == Constant.textVCardMimeType) { - goToComposer( + openComposer( ComposerArguments.fromFileShared([sharedMediaFile]), ); } else if (sharedMediaFile.mimeType == Constant.textPlainMimeType) { - goToComposer( + openComposer( ComposerArguments.fromContentShared(sharedMediaFile.path.trim()), ); } @@ -556,7 +553,7 @@ class MailboxDashBoardController extends ReloadableController case SharedMediaType.url: if (sharedMediaFile.path.startsWith(RouteUtils.mailtoPrefix)) { final navigationRouter = RouteUtils.generateNavigationRouterFromMailtoLink(sharedMediaFile.path); - goToComposer( + openComposer( ComposerArguments.fromMailtoUri( listEmailAddress: navigationRouter.listEmailAddress, subject: navigationRouter.subject, @@ -567,7 +564,7 @@ class MailboxDashBoardController extends ReloadableController break; case SharedMediaType.mailto: if (EmailUtils.isEmailAddressValid(sharedMediaFile.path)) { - goToComposer( + openComposer( ComposerArguments.fromEmailAddress( EmailAddress(null, sharedMediaFile.path), ), @@ -578,7 +575,7 @@ class MailboxDashBoardController extends ReloadableController return; } - goToComposer( + openComposer( ComposerArguments.fromFileShared(listSharedMediaFile), ); } @@ -1684,27 +1681,6 @@ class MailboxDashBoardController extends ReloadableController emailUIAction.value = newAction; } - Future closeComposerOnWeb({ - required String? composerId, - dynamic result, - }) async { - if (composerId != null) { - _composerManager.removeComposer(composerId); - } - if (!_composerManager.hasComposer) { - twakeAppManager.setHasComposer(false); - } - if (result is SendingEmailArguments) { - handleSendEmailAction(result); - } else if (result is SendEmailSuccess || - result is SaveEmailAsDraftsSuccess || - result is UpdateEmailDraftsSuccess) { - consumeState(Stream.value(Right(result))); - } - - await _removeComposerCacheOnWeb(); - } - void dispatchRoute(DashboardRoutes route) { log('MailboxDashBoardController::dispatchRoute(): $route'); dashboardRoute.value = route; @@ -1821,67 +1797,6 @@ class MailboxDashBoardController extends ReloadableController } } - void goToComposer(ComposerArguments arguments) { - final argumentsWithIdentity = arguments.withIdentity( - identities: List.from(_identities ?? []), - selectedIdentityId: arguments.selectedIdentityId); - - if (PlatformInfo.isWeb) { - _openComposerOnWeb(argumentsWithIdentity); - } else { - _openComposerOnMobile(argumentsWithIdentity); - } - } - - void _openComposerOnWeb(ComposerArguments composerArguments) { - if (_composerManager.composers.isNotEmpty) return; - - _composerManager.addComposer(composerArguments); - twakeAppManager.setHasComposer(true); - } - - Future _openComposerOnMobile(ComposerArguments arguments) async { - BackButtonInterceptor.removeByName(AppRoutes.dashboard); - - bool isTabletPlatform = currentContext != null - && !responsiveUtils.isScreenWithShortestSide(currentContext!); - dynamic result; - - if (isTabletPlatform) { - if (PlatformInfo.isIOS) { - dispatchEmailUIAction(HideEmailContentViewAction()); - } - - result = await Get.to( - () => const ComposerView(), - binding: ComposerBindings(), - opaque: false, - arguments: arguments, - ); - - if (PlatformInfo.isIOS) { - await Future.delayed( - const Duration(milliseconds: 200), - () => dispatchEmailUIAction(ShowEmailContentViewAction()), - ); - } - } else { - result = await push(AppRoutes.composer, arguments: arguments); - } - - BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard); - - if (result is SendingEmailArguments) { - handleSendEmailAction(result); - } else if (result is SendEmailSuccess || - result is SaveEmailAsDraftsSuccess || - result is UpdateEmailDraftsSuccess) { - consumeState(Stream.value(Right(result))); - } else if (validateSendingEmailFailedWhenNetworkIsLostOnMobile(result)) { - _storeSendingEmailInCaseOfSendingFailureInMobile(result); - } - } - void clearDashBoardAction() { dashBoardAction.value = DashBoardAction.idle; } @@ -1905,7 +1820,7 @@ class MailboxDashBoardController extends ReloadableController ), ); - BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard); + BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard); if (result is Tuple2) { if (result.value1 is VacationResponse) { @@ -1971,7 +1886,7 @@ class MailboxDashBoardController extends ReloadableController ) ); - BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard); + BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard); if (result is Tuple2) { if (result.value1 is VacationResponse) { @@ -2395,7 +2310,7 @@ class MailboxDashBoardController extends ReloadableController void _handleSendEmailFailure(SendEmailFailure failure) { logError('MailboxDashBoardController::_handleSendEmailFailure():failure: $failure'); if (PlatformInfo.isMobile) { - _storeSendingEmailInCaseOfSendingFailureInMobile(failure); + storeSendingEmailInCaseOfSendingFailureInMobile(failure); } if (currentContext == null) { clearState(); @@ -2529,7 +2444,7 @@ class MailboxDashBoardController extends ReloadableController )); } - void _storeSendingEmailInCaseOfSendingFailureInMobile(SendEmailFailure failure) { + void storeSendingEmailInCaseOfSendingFailureInMobile(SendEmailFailure failure) { if (failure.session != null && failure.accountId != null && failure.emailRequest != null @@ -3003,8 +2918,8 @@ class MailboxDashBoardController extends ReloadableController bool get _isDialogViewOpen => Get.isOverlaysOpen == true; - bool _onBackButtonInterceptor(bool stopDefaultButtonEvent, RouteInfo routeInfo) { - log('MailboxDashBoardController::_onBackButtonInterceptor:currentRoute: ${Get.currentRoute} | _isDialogViewOpen: $_isDialogViewOpen'); + bool onBackButtonInterceptor(bool stopDefaultButtonEvent, RouteInfo routeInfo) { + log('MailboxDashBoardController::onBackButtonInterceptor:currentRoute: ${Get.currentRoute} | _isDialogViewOpen: $_isDialogViewOpen'); if (_isDialogViewOpen) { popBack(); _replaceBrowserHistory(); diff --git a/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart new file mode 100644 index 000000000..e9db36421 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart @@ -0,0 +1,116 @@ + +import 'package:back_button_interceptor/back_button_interceptor.dart'; +import 'package:core/utils/platform_info.dart'; +import 'package:dartz/dartz.dart'; +import 'package:get/get.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/presentation/composer_bindings.dart'; +import 'package:tmail_ui_user/features/composer/presentation/composer_view.dart'; +import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; +import 'package:tmail_ui_user/features/email/presentation/extensions/composer_arguments_extension.dart'; +import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_arguments.dart'; +import 'package:tmail_ui_user/main/routes/app_routes.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +extension OpenAndCloseComposerExtension on MailboxDashBoardController { + void openComposer(ComposerArguments arguments) { + final argumentsWithIdentity = arguments.withIdentity( + identities: List.from(listIdentities), + selectedIdentityId: arguments.selectedIdentityId, + ); + + if (PlatformInfo.isWeb) { + _openComposerOnWeb(argumentsWithIdentity); + } else { + _openComposerOnMobile(argumentsWithIdentity); + } + } + + void _openComposerOnWeb(ComposerArguments composerArguments) { + composerManager.addComposer(composerArguments); + if (!twakeAppManager.hasComposer) { + twakeAppManager.setHasComposer(true); + } + } + + Future _openComposerOnMobile(ComposerArguments arguments) async { + BackButtonInterceptor.removeByName(AppRoutes.dashboard); + + bool isTabletPlatform = currentContext != null + && !responsiveUtils.isScreenWithShortestSide(currentContext!); + + dynamic result; + if (isTabletPlatform) { + if (PlatformInfo.isIOS) { + dispatchEmailUIAction(HideEmailContentViewAction()); + } + + result = await Get.to( + () => const ComposerView(), + binding: ComposerBindings(), + opaque: false, + arguments: arguments, + ); + + if (PlatformInfo.isIOS) { + await Future.delayed( + const Duration(milliseconds: 200), + () => dispatchEmailUIAction(ShowEmailContentViewAction()), + ); + } + } else { + result = await push(AppRoutes.composer, arguments: arguments); + } + + BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard); + + _handleResultAfterCloseComposer(result); + } + + void closeComposer({ + dynamic result, + bool closeOverlays = false, + String? composerId, + }) { + if (PlatformInfo.isWeb) { + if (closeOverlays) { + popBack(); + } + closeComposerOnWeb(composerId: composerId, result: result); + } else { + popBack(result: result, closeOverlays: closeOverlays); + } + } + + Future closeComposerOnWeb({ + required String? composerId, + dynamic result, + }) async { + if (composerId != null) { + composerManager.removeComposer(composerId); + } + if (!composerManager.hasComposer) { + twakeAppManager.setHasComposer(false); + } + + _handleResultAfterCloseComposer(result); + + await removeComposerCacheOnWeb(); + } + + void _handleResultAfterCloseComposer(dynamic result) { + if (result is SendingEmailArguments) { + handleSendEmailAction(result); + } else if (result is SendEmailSuccess || + result is SaveEmailAsDraftsSuccess || + result is UpdateEmailDraftsSuccess) { + consumeState(Stream.value(Right(result))); + } else if (validateSendingEmailFailedWhenNetworkIsLostOnMobile(result)) { + storeSendingEmailInCaseOfSendingFailureInMobile(result); + } + } +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 0c5cc54aa..cbb3eda74 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -15,6 +15,7 @@ import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view_web.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/base_mailbox_dashboard_view.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; diff --git a/lib/features/sending_queue/presentation/sending_queue_controller.dart b/lib/features/sending_queue/presentation/sending_queue_controller.dart index 4298ba5b7..8dece9256 100644 --- a/lib/features/sending_queue/presentation/sending_queue_controller.dart +++ b/lib/features/sending_queue/presentation/sending_queue_controller.dart @@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/email/domain/state/delete_sending_email_s import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/offline_mode/model/sending_state.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/extensions/list_sending_email_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_email_extension.dart'; @@ -230,7 +231,7 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi void _editSendingEmailAction(SendingEmail sendingEmail) { disableSelectionMode(); - dashboardController.goToComposer(ComposerArguments.fromSendingEmail(sendingEmail)); + dashboardController.openComposer(ComposerArguments.fromSendingEmail(sendingEmail)); } void _resendSendingEmailAction(List listSendingEmails) async { diff --git a/lib/features/sending_queue/presentation/sending_queue_view.dart b/lib/features/sending_queue/presentation/sending_queue_view.dart index 5a7e06b0d..6247ebff6 100644 --- a/lib/features/sending_queue/presentation/sending_queue_view.dart +++ b/lib/features/sending_queue/presentation/sending_queue_view.dart @@ -7,6 +7,7 @@ import 'package:model/mailbox/select_mode.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/extensions/list_sending_email_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/sending_queue_controller.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/widgets/app_bar_sending_queue_widget.dart'; @@ -98,14 +99,14 @@ class SendingQueueView extends GetWidget with AppLoaderM if (controller.isAllUnSelected) { return ComposeFloatingButton( scrollController: controller.listSendingEmailController, - onTap: () => controller.dashboardController.goToComposer(ComposerArguments()) + onTap: () => controller.dashboardController.openComposer(ComposerArguments()) ); } else { return Container( padding: const EdgeInsets.only(bottom: 70), child: ComposeFloatingButton( scrollController: controller.listSendingEmailController, - onTap: () => controller.dashboardController.goToComposer(ComposerArguments()) + onTap: () => controller.dashboardController.openComposer(ComposerArguments()) ), ); } diff --git a/lib/features/thread/presentation/mixin/email_action_controller.dart b/lib/features/thread/presentation/mixin/email_action_controller.dart index a47294d0f..707f2ef12 100644 --- a/lib/features/thread/presentation/mixin/email_action_controller.dart +++ b/lib/features/thread/presentation/mixin/email_action_controller.dart @@ -25,6 +25,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_reques import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -39,11 +40,11 @@ mixin EmailActionController { final imagePaths = Get.find(); void editDraftEmail(PresentationEmail presentationEmail) { - mailboxDashBoardController.goToComposer(ComposerArguments.editDraftEmail(presentationEmail)); + mailboxDashBoardController.openComposer(ComposerArguments.editDraftEmail(presentationEmail)); } void editAsNewEmail(PresentationEmail presentationEmail) { - mailboxDashBoardController.goToComposer( + mailboxDashBoardController.openComposer( ComposerArguments.editAsNewEmail(presentationEmail), ); } diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 3c2de1ac7..1614af220 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -12,6 +12,7 @@ import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart' import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/filter_email_popup_menu_mixin.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/recover_deleted_message_loading_banner_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; @@ -295,7 +296,7 @@ class ThreadView extends GetWidget : EdgeInsets.zero, child: ComposeFloatingButton( scrollController: controller.listEmailController, - onTap: () => controller.mailboxDashBoardController.goToComposer(ComposerArguments()) + onTap: () => controller.mailboxDashBoardController.openComposer(ComposerArguments()) ), ); } else { diff --git a/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart b/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart index f671eee90..6f7fd133a 100644 --- a/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart +++ b/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart @@ -353,7 +353,6 @@ void main() { getRestoredDeletedMessageInteractor, removeComposerCacheOnWebInteractor, getAllIdentitiesInteractor, - composerManager, ); }); diff --git a/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart b/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart index 51b8aeb23..850aa9c88 100644 --- a/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart +++ b/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart @@ -352,7 +352,6 @@ void main() { getRestoredDeletedMessageInteractor, removeComposerCacheOnWebInteractor, getAllIdentitiesInteractor, - composerManager, ); Get.put(mailboxDashboardController); mailboxDashboardController.onReady();