From daddeb78dc3f7e30f07712e24f20795235e713f4 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 24 Oct 2022 23:39:05 +0700 Subject: [PATCH] TF-1074 Handle go to path `/destination_picker` --- lib/features/base/base_controller.dart | 4 +- .../mixin/view_as_dialog_action_mixin.dart | 40 ++++++ .../destination_picker_bindings.dart | 4 + .../destination_picker_controller.dart | 27 +++- .../presentation/destination_picker_view.dart | 42 ++++-- .../email/presentation/email_controller.dart | 62 ++++++++- .../presentation/mailbox_controller.dart | 57 +++++--- .../mailbox_creator_controller.dart | 41 ++++-- .../advanced_filter_controller.dart | 38 ++++-- .../mailbox_dashboard_controller.dart | 60 ++++++++- .../advanced_search_filter_form.dart | 2 +- .../rules_filter_creator_controller.dart | 36 +++-- .../presentation/search_email_controller.dart | 43 +++--- .../mixin/email_action_controller.dart | 77 ++++++++++- .../presentation/thread_controller.dart | 127 ++++++++++++++++-- lib/main/pages/app_pages.dart | 106 +++++++-------- lib/main/routes/app_routes.dart | 5 +- 17 files changed, 601 insertions(+), 170 deletions(-) create mode 100644 lib/features/base/mixin/view_as_dialog_action_mixin.dart diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index 839fee1df..8cf1bf5c8 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -7,12 +7,14 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart'; +import 'package:tmail_ui_user/features/base/mixin/view_as_dialog_action_mixin.dart'; import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; -abstract class BaseController extends GetxController with MessageDialogActionMixin, PopupContextMenuActionMixin { +abstract class BaseController extends GetxController + with MessageDialogActionMixin, PopupContextMenuActionMixin, ViewAsDialogActionMixin { final viewState = Rx>(Right(UIState.idle)); FpsCallback? fpsCallback; diff --git a/lib/features/base/mixin/view_as_dialog_action_mixin.dart b/lib/features/base/mixin/view_as_dialog_action_mixin.dart new file mode 100644 index 000000000..44f053246 --- /dev/null +++ b/lib/features/base/mixin/view_as_dialog_action_mixin.dart @@ -0,0 +1,40 @@ + +import 'package:flutter/material.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_bindings.dart'; +import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_view.dart'; +import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +mixin ViewAsDialogActionMixin { + + void showDialogDestinationPicker({ + required BuildContext context, + required DestinationPickerArguments arguments, + required Function(PresentationMailbox) onSelectedMailbox + }) { + DestinationPickerBindings().dependencies(); + + showGeneralDialog( + context: context, + barrierDismissible: true, + barrierLabel: '', + barrierColor: Colors.black54, + pageBuilder: (context, animation, secondaryAnimation) { + return DestinationPickerView.fromArguments( + arguments, + onDismissCallback: () { + DestinationPickerBindings().dispose(); + popBack(); + }, + onSelectedMailboxCallback: (destinationMailbox) { + DestinationPickerBindings().dispose(); + popBack(); + + if (destinationMailbox is PresentationMailbox) { + onSelectedMailbox.call(destinationMailbox); + } + }); + }); + } +} \ No newline at end of file diff --git a/lib/features/destination_picker/presentation/destination_picker_bindings.dart b/lib/features/destination_picker/presentation/destination_picker_bindings.dart index 227ff9b82..bccf76b05 100644 --- a/lib/features/destination_picker/presentation/destination_picker_bindings.dart +++ b/lib/features/destination_picker/presentation/destination_picker_bindings.dart @@ -83,4 +83,8 @@ class DestinationPickerBindings extends BaseBindings { Get.find(), )); } + + void dispose() { + Get.delete(); + } } \ No newline at end of file diff --git a/lib/features/destination_picker/presentation/destination_picker_controller.dart b/lib/features/destination_picker/presentation/destination_picker_controller.dart index f4c9d9bf8..e1fe0f740 100644 --- a/lib/features/destination_picker/presentation/destination_picker_controller.dart +++ b/lib/features/destination_picker/presentation/destination_picker_controller.dart @@ -20,6 +20,8 @@ import 'package:tmail_ui_user/features/thread/presentation/model/search_state.da import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; +typedef OnSelectedMailboxCallback = Function(PresentationMailbox? destinationMailbox); + class DestinationPickerController extends BaseMailboxController { final GetAllMailboxInteractor _getAllMailboxInteractor; @@ -31,8 +33,12 @@ class DestinationPickerController extends BaseMailboxController { final searchQuery = SearchQuery.initial().obs; final mailboxCategoriesExpandMode = MailboxCategoriesExpandMode.initial().obs; + DestinationPickerArguments? arguments; AccountId? accountId; MailboxId? mailboxIdSelected; + OnSelectedMailboxCallback? onSelectedMailboxCallback; + VoidCallback? onDismissDestinationPicker; + final searchInputController = TextEditingController(); final searchFocus = FocusNode(); @@ -45,11 +51,10 @@ class DestinationPickerController extends BaseMailboxController { @override void onReady() { super.onReady(); - final arguments = Get.arguments; - if (arguments != null && arguments is DestinationPickerArguments) { - mailboxAction.value = arguments.mailboxAction; - mailboxIdSelected = arguments.mailboxIdSelected; - accountId = arguments.accountId; + if (arguments != null) { + mailboxAction.value = arguments!.mailboxAction; + mailboxIdSelected = arguments!.mailboxIdSelected; + accountId = arguments!.accountId; getAllMailboxAction(); } } @@ -160,10 +165,18 @@ class DestinationPickerController extends BaseMailboxController { } void selectMailboxAction(PresentationMailbox? destinationMailbox) { - popBack(result: destinationMailbox); + if (BuildUtils.isWeb) { + onSelectedMailboxCallback?.call(destinationMailbox); + } else { + popBack(result: destinationMailbox); + } } void closeDestinationPicker() { - popBack(); + if (BuildUtils.isWeb) { + onDismissDestinationPicker?.call(); + } else { + popBack(); + } } } \ No newline at end of file diff --git a/lib/features/destination_picker/presentation/destination_picker_view.dart b/lib/features/destination_picker/presentation/destination_picker_view.dart index 69f8acbf9..b0c4016a4 100644 --- a/lib/features/destination_picker/presentation/destination_picker_view.dart +++ b/lib/features/destination_picker/presentation/destination_picker_view.dart @@ -1,9 +1,19 @@ -import 'package:core/core.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/utils/style_utils.dart'; +import 'package:core/presentation/views/button/icon_button_web.dart'; +import 'package:core/presentation/views/list/tree_view.dart'; +import 'package:core/presentation/views/search/search_bar_view.dart'; +import 'package:core/utils/build_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; -import 'package:model/model.dart'; +import 'package:model/extensions/presentation_mailbox_extension.dart'; +import 'package:model/mailbox/expand_mode.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/destination_picker_controller.dart'; @@ -25,17 +35,29 @@ class DestinationPickerView extends GetWidget final _imagePaths = Get.find(); final _responsiveUtils = Get.find(); - DestinationPickerView({Key? key}) : super(key: key); + @override + final controller = Get.find(); + + DestinationPickerView({Key? key}) : super(key: key) { + controller.arguments = Get.arguments; + } + + DestinationPickerView.fromArguments( + DestinationPickerArguments arguments, { + Key? key, + OnSelectedMailboxCallback? onSelectedMailboxCallback, + VoidCallback? onDismissCallback + }) : super(key: key) { + controller.arguments = arguments; + controller.onSelectedMailboxCallback = onSelectedMailboxCallback; + controller.onDismissDestinationPicker = onDismissCallback; + controller.onInit(); + } @override Widget build(BuildContext context) { - MailboxActions? actions; - MailboxId? mailboxIdSelected; - final arguments = Get.arguments; - if (arguments != null && arguments is DestinationPickerArguments) { - actions = arguments.mailboxAction; - mailboxIdSelected = arguments.mailboxIdSelected; - } + MailboxActions? actions = controller.arguments?.mailboxAction; + MailboxId? mailboxIdSelected = controller.arguments?.mailboxIdSelected; return PointerInterceptor( child: GestureDetector( diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index efc62a7d0..cd85f6ac1 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -501,10 +501,23 @@ class EmailController extends BaseController with AppLoaderMixin { final accountId = mailboxDashBoardController.accountId.value; if (currentMailbox != null && accountId != null) { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) - ); + final arguments = DestinationPickerArguments(accountId, MailboxActions.moveEmail); + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + _dispatchMoveToAction( + context, + accountId, + email, + currentMailbox, + destinationMailbox); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); if (destinationMailbox != null && destinationMailbox is PresentationMailbox && mailboxDashBoardController.sessionCurrent != null) { if (destinationMailbox.isTrash) { @@ -531,6 +544,47 @@ class EmailController extends BaseController with AppLoaderMixin { destinationPath: destinationMailbox.mailboxPath)); } } + if (destinationMailbox is PresentationMailbox) { + _dispatchMoveToAction( + context, + accountId, + email, + currentMailbox, + destinationMailbox); + } + } + } + } + + void _dispatchMoveToAction( + BuildContext context, + AccountId accountId, + PresentationEmail emailSelected, + PresentationMailbox currentMailbox, + PresentationMailbox destinationMailbox + ) { + if (destinationMailbox.isTrash) { + _moveToTrashAction(context, accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToTrash)); + } else if (destinationMailbox.isSpam) { + _moveToSpamAction(context, accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToSpam)); + } else { + _moveToMailbox(accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath)); } } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index ee8a67713..19d7676a6 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -538,7 +538,7 @@ class MailboxController extends BaseMailboxController { } void pressMailboxSelectionAction( - BuildContext context, + BuildContext context, MailboxActions actions, List selectedMailboxList ) { @@ -553,7 +553,7 @@ class MailboxController extends BaseMailboxController { _markAsReadMailboxAction(context, selectedMailboxList.first); break; case MailboxActions.move: - _moveMailboxAction(selectedMailboxList.first); + _moveMailboxAction(context, selectedMailboxList.first); break; default: break; @@ -702,7 +702,7 @@ class MailboxController extends BaseMailboxController { _cancelSelectMailbox(); popBack(); } - + void _switchBackToMailboxDefault() { final inboxMailbox = findMailboxNodeByRole(PresentationMailbox.roleInbox); mailboxDashBoardController.setSelectedMailbox(inboxMailbox?.item); @@ -812,26 +812,41 @@ class MailboxController extends BaseMailboxController { } } - void _moveMailboxAction(PresentationMailbox mailboxSelected) async { + void _moveMailboxAction(BuildContext context, PresentationMailbox mailboxSelected) async { final accountId = mailboxDashBoardController.accountId.value; if (accountId != null) { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments( + final arguments = DestinationPickerArguments( + accountId, + MailboxActions.move, + mailboxIdSelected: mailboxSelected.id); + + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + _handleMovingMailbox( + accountId, + MoveAction.moving, + mailboxSelected, + destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox); + + _cancelSelectMailbox(); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); + + if (destinationMailbox is PresentationMailbox) { + _handleMovingMailbox( accountId, - MailboxActions.move, - mailboxIdSelected: mailboxSelected.id)); + MoveAction.moving, + mailboxSelected, + destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox); - if (destinationMailbox is PresentationMailbox) { - final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox - ? null : destinationMailbox; - _handleMovingMailbox( - accountId, - MoveAction.moving, - mailboxSelected, - destinationMailbox: mailboxDestination); - - _cancelSelectMailbox(); + _cancelSelectMailbox(); + } } } } @@ -944,7 +959,7 @@ class MailboxController extends BaseMailboxController { } void handleMailboxAction( - BuildContext context, + BuildContext context, MailboxActions actions, PresentationMailbox mailbox ) { @@ -958,7 +973,7 @@ class MailboxController extends BaseMailboxController { _openDialogRenameMailboxAction(context, mailbox); break; case MailboxActions.move: - _moveMailboxAction(mailbox); + _moveMailboxAction(context, mailbox); break; case MailboxActions.markAsRead: _markAsReadMailboxAction(context, mailbox); diff --git a/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart b/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart index bf7f229d2..a28980a1d 100644 --- a/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart +++ b/lib/features/mailbox_creator/presentation/mailbox_creator_controller.dart @@ -142,21 +142,36 @@ class MailboxCreatorController extends BaseController { FocusScope.of(context).unfocus(); if (accountId != null) { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments( - accountId!, - MailboxActions.create, - mailboxIdSelected: selectedMailbox.value?.id) - ); + final arguments = DestinationPickerArguments( + accountId!, + MailboxActions.create, + mailboxIdSelected: selectedMailbox.value?.id); - if (destinationMailbox is PresentationMailbox) { - final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox - ? null - : destinationMailbox; + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox + ? null + : destinationMailbox; - selectedMailbox.value = mailboxDestination; - _createListMailboxNameAsStringInMailboxLocation(); + selectedMailbox.value = mailboxDestination; + _createListMailboxNameAsStringInMailboxLocation(); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); + + if (destinationMailbox is PresentationMailbox) { + final mailboxDestination = destinationMailbox == PresentationMailbox.unifiedMailbox + ? null + : destinationMailbox; + + selectedMailbox.value = mailboxDestination; + _createListMailboxNameAsStringInMailboxLocation(); + } } } } diff --git a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart index 5c157df53..6129cf1b9 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart @@ -134,18 +134,34 @@ class AdvancedFilterController extends BaseController { ); } - void selectedMailBox() async { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments( - _mailboxDashBoardController.accountId.value!, - MailboxActions.select, - mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id)); + void selectedMailBox(BuildContext context) async { + final accountId = _mailboxDashBoardController.accountId.value; + if (accountId != null) { + final arguments = DestinationPickerArguments( + accountId, + MailboxActions.select, + mailboxIdSelected: searchController.searchEmailFilter.value.mailbox?.id); - if (destinationMailbox is PresentationMailbox) { - searchController.updateFilterEmail(mailbox: destinationMailbox); - mailBoxFilterInputController.text = - StringConvert.writeNullToEmpty(destinationMailbox.name?.name); + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + searchController.updateFilterEmail(mailbox: destinationMailbox); + mailBoxFilterInputController.text = + StringConvert.writeNullToEmpty(destinationMailbox.name?.name); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); + + if (destinationMailbox is PresentationMailbox) { + searchController.updateFilterEmail(mailbox: destinationMailbox); + mailBoxFilterInputController.text = + StringConvert.writeNullToEmpty(destinationMailbox.name?.name); + } + } } } 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 a05645ea0..da5faea4f 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -611,13 +611,27 @@ class MailboxDashBoardController extends ReloadableController { } void moveSelectedMultipleEmailToMailbox( + BuildContext context, List listEmails, - PresentationMailbox mailboxCurrent + PresentationMailbox currentMailbox ) async { if (accountId.value != null) { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments(accountId.value!, MailboxActions.moveEmail)); + final arguments = DestinationPickerArguments(accountId.value!, MailboxActions.moveEmail); + + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + _dispatchMoveToMultipleAction( + accountId.value!, + listEmails.listEmailIds, + currentMailbox, destinationMailbox); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.isTrash) { @@ -644,6 +658,44 @@ class MailboxDashBoardController extends ReloadableController { destinationPath: destinationMailbox.mailboxPath)); } } + if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { + _dispatchMoveToMultipleAction( + accountId.value!, + listEmails.listEmailIds, + currentMailbox, destinationMailbox); + } + } + } + } + + void _dispatchMoveToMultipleAction( + AccountId accountId, + List listEmailIds, + PresentationMailbox currentMailbox, + PresentationMailbox destinationMailbox + ) { + if (destinationMailbox.isTrash) { + _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( + listEmailIds, + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToTrash)); + } else if (destinationMailbox.isSpam) { + _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( + listEmailIds, + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToSpam)); + } else { + _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( + listEmailIds, + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath)); } } diff --git a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart index bcf71f467..34c968e87 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart @@ -70,7 +70,7 @@ class AdvancedSearchInputForm extends GetWidget currentFocusNode: controller.focusManager.mailboxFieldFocusNode, nextFocusNode: controller.focusManager.attachmentCheckboxFocusNode, mouseCursor: SystemMouseCursors.click, - onTap: () => controller.selectedMailBox()), + onTap: () => controller.selectedMailBox(context)), Row(children: [ Expanded(child: _buildFilterField( textEditingController: controller.dateFilterInputController, diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart index 0a70c2df5..4ebc3af5e 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart @@ -192,17 +192,33 @@ class RulesFilterCreatorController extends BaseMailboxController { } void selectMailbox(BuildContext context) async { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments( - _accountId!, - MailboxActions.selectForRuleAction)); + if (_accountId != null) { + final arguments = DestinationPickerArguments( + _accountId!, + MailboxActions.selectForRuleAction); - if (destinationMailbox is PresentationMailbox) { - mailboxSelected.value = destinationMailbox; - errorRuleActionValue.value = _getErrorStringByInputValue( - context, - mailboxSelected.value?.name?.name); + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + mailboxSelected.value = destinationMailbox; + errorRuleActionValue.value = _getErrorStringByInputValue( + context, + mailboxSelected.value?.name?.name); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); + + if (destinationMailbox is PresentationMailbox) { + mailboxSelected.value = destinationMailbox; + errorRuleActionValue.value = _getErrorStringByInputValue( + context, + mailboxSelected.value?.name?.name); + } + } } } diff --git a/lib/features/search/presentation/search_email_controller.dart b/lib/features/search/presentation/search_email_controller.dart index 3d8875e4b..db6a9cf93 100644 --- a/lib/features/search/presentation/search_email_controller.dart +++ b/lib/features/search/presentation/search_email_controller.dart @@ -1,4 +1,5 @@ +import 'package:core/core.dart'; import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:core/utils/app_logger.dart'; @@ -415,21 +416,33 @@ class SearchEmailController extends BaseController } void selectMailboxForSearchFilter(BuildContext context, PresentationMailbox? mailbox) async { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments( - mailboxDashBoardController.accountId.value!, - MailboxActions.select, - mailboxIdSelected: mailbox?.id)); + final arguments = DestinationPickerArguments( + mailboxDashBoardController.accountId.value!, + MailboxActions.select, + mailboxIdSelected: mailbox?.id); - if (destinationMailbox is PresentationMailbox) { - final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox - ? null - : destinationMailbox; - if (mailbox?.id != mailboxSelected?.id) { - simpleSearchFilter.value = simpleSearchFilter.value - .toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected); - _searchEmailAction(context); + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox; + if (mailbox?.id != mailboxSelected?.id) { + simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected); + _searchEmailAction(context); + } + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); + + if (destinationMailbox is PresentationMailbox) { + final mailboxSelected = destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox; + if (mailbox?.id != mailboxSelected?.id) { + simpleSearchFilter.value = simpleSearchFilter.value.toSimpleSearchFilterByMailbox(newMailbox: mailboxSelected); + _searchEmailAction(context); + } } } } @@ -642,7 +655,7 @@ class SearchEmailController extends BaseController cancelSelectionMode(context); final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToMailbox(listEmails, mailboxContainCurrent); + moveSelectedMultipleEmailToMailbox(context, listEmails, mailboxContainCurrent); } break; case EmailActionType.moveToTrash: diff --git a/lib/features/thread/presentation/mixin/email_action_controller.dart b/lib/features/thread/presentation/mixin/email_action_controller.dart index e2b162a55..92235327c 100644 --- a/lib/features/thread/presentation/mixin/email_action_controller.dart +++ b/lib/features/thread/presentation/mixin/email_action_controller.dart @@ -1,9 +1,11 @@ + import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart'; import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart'; +import 'package:core/utils/build_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; @@ -14,6 +16,7 @@ import 'package:model/email/presentation_email.dart'; import 'package:model/email/read_actions.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; +import 'package:tmail_ui_user/features/base/mixin/view_as_dialog_action_mixin.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; @@ -26,7 +29,7 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; -mixin EmailActionController { +mixin EmailActionController on ViewAsDialogActionMixin { final mailboxDashBoardController = Get.find(); final responsiveUtils = Get.find(); @@ -107,10 +110,24 @@ mixin EmailActionController { final accountId = mailboxDashBoardController.accountId.value; if (currentMailbox != null && accountId != null) { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) - ); + final arguments = DestinationPickerArguments(accountId, MailboxActions.moveEmail); + + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + _dispatchMoveToAction( + context, + accountId, + email, + currentMailbox, + destinationMailbox); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.isTrash) { @@ -137,6 +154,45 @@ mixin EmailActionController { destinationPath: destinationMailbox.mailboxPath)); } } + _dispatchMoveToAction( + context, + accountId, + email, + currentMailbox, + destinationMailbox); + } + } + } + + void _dispatchMoveToAction( + BuildContext context, + AccountId accountId, + PresentationEmail emailSelected, + PresentationMailbox currentMailbox, + PresentationMailbox destinationMailbox + ) { + if (destinationMailbox.isTrash) { + moveToSpamAction(accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToTrash)); + } else if (destinationMailbox.isSpam) { + moveToSpamAction(accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToSpam)); + } else { + _moveToMailboxAction(accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath)); } } @@ -200,8 +256,15 @@ mixin EmailActionController { mailboxDashBoardController.markAsStarSelectedMultipleEmail(listEmails, markStarAction); } - void moveSelectedMultipleEmailToMailbox(List listEmails, PresentationMailbox mailboxCurrent) { - mailboxDashBoardController.moveSelectedMultipleEmailToMailbox(listEmails, mailboxCurrent); + void moveSelectedMultipleEmailToMailbox( + BuildContext context, + List listEmails, + PresentationMailbox mailboxCurrent + ) { + mailboxDashBoardController.moveSelectedMultipleEmailToMailbox( + context, + listEmails, + mailboxCurrent); } void moveSelectedMultipleEmailToTrash(List listEmails, PresentationMailbox mailboxCurrent) { diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 8980718c4..7a4ca9ab7 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -635,15 +635,28 @@ class ThreadController extends BaseController { } void moveSelectedMultipleEmailToMailbox( + BuildContext context, List listEmail, PresentationMailbox currentMailbox ) async { if (_accountId != null) { - final listEmailIds = listEmail.map((email) => email.id).toList(); - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments(_accountId!, MailboxActions.moveEmail) - ); + final arguments = DestinationPickerArguments(_accountId!, MailboxActions.moveEmail); + + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + _dispatchMoveToMultipleAction( + _accountId!, + listEmail.listEmailIds, + currentMailbox, + destinationMailbox); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.isTrash) { @@ -670,6 +683,45 @@ class ThreadController extends BaseController { destinationPath: destinationMailbox.mailboxPath)); } } + if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { + _dispatchMoveToMultipleAction( + _accountId!, + listEmail.listEmailIds, + currentMailbox, + destinationMailbox); + } + } + } + } + + void _dispatchMoveToMultipleAction( + AccountId accountId, + List listEmailIds, + PresentationMailbox currentMailbox, + PresentationMailbox destinationMailbox + ) { + if (destinationMailbox.isTrash) { + _moveSelectedEmailMultipleToTrashAction(accountId, MoveToMailboxRequest( + listEmailIds, + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToTrash)); + } else if (destinationMailbox.isSpam) { + _moveSelectedEmailMultipleToSpamAction(accountId, MoveToMailboxRequest( + listEmailIds, + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToSpam)); + } else { + _moveSelectedEmailMultipleToMailboxAction(accountId, MoveToMailboxRequest( + listEmailIds, + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath)); } } @@ -984,7 +1036,7 @@ class ThreadController extends BaseController { ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) : currentMailbox; if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToMailbox(selectionEmail, mailboxContainCurrent); + moveSelectedMultipleEmailToMailbox(context, selectionEmail, mailboxContainCurrent); } break; case EmailActionType.moveToTrash: @@ -1079,10 +1131,24 @@ class ThreadController extends BaseController { final accountId = mailboxDashBoardController.accountId.value; if (currentMailbox != null && accountId != null) { - final destinationMailbox = await push( - AppRoutes.destinationPicker, - arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) - ); + final arguments = DestinationPickerArguments(accountId, MailboxActions.moveEmail); + + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + _dispatchMoveToAction( + context, + accountId, + email, + currentMailbox, + destinationMailbox); + }); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.isTrash) { @@ -1109,6 +1175,47 @@ class ThreadController extends BaseController { destinationPath: destinationMailbox.mailboxPath)); } } + if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { + _dispatchMoveToAction( + context, + accountId, + email, + currentMailbox, + destinationMailbox); + } + } + } + } + + void _dispatchMoveToAction( + BuildContext context, + AccountId accountId, + PresentationEmail emailSelected, + PresentationMailbox currentMailbox, + PresentationMailbox destinationMailbox + ) { + if (destinationMailbox.isTrash) { + _moveToTrashAction(accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToTrash)); + } else if (destinationMailbox.isSpam) { + _moveToSpamAction(accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToSpam)); + } else { + _moveToMailboxAction(accountId, MoveToMailboxRequest( + [emailSelected.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath)); } } diff --git a/lib/main/pages/app_pages.dart b/lib/main/pages/app_pages.dart index 014e69ae7..1462e263e 100644 --- a/lib/main/pages/app_pages.dart +++ b/lib/main/pages/app_pages.dart @@ -31,70 +31,70 @@ import 'package:tmail_ui_user/main/pages/deferred_widget.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; class AppPages { - static final pages = [ + static final pagesOnlyOnMobile = [ GetPage( - name: AppRoutes.home, - page: () => const HomeView(), - binding: HomeBindings()), - GetPage( - name: AppRoutes.login, - page: () => DeferredWidget(login.loadLibrary, () => login.LoginView()), - binding: LoginBindings()), - GetPage( - name: AppRoutes.session, - page: () => DeferredWidget(session.loadLibrary, () => session.SessionView()), - binding: SessionPageBindings()), - GetPage( - name: AppRoutes.dashboard, - page: () => DeferredWidget(mailbox_dashboard.loadLibrary, () => mailbox_dashboard.MailboxDashBoardView()), - binding: MailboxDashBoardBindings()), - if (!BuildUtils.isWeb) - GetPage( name: AppRoutes.composer, opaque: false, - page: () { - ComposerBindings().dependencies(); - return DeferredWidget(composer.loadLibrary, () => composer.ComposerView()); - }), + page: () => DeferredWidget(composer.loadLibrary, () => composer.ComposerView()), + binding: ComposerBindings()), GetPage( - name: AppRoutes.destinationPicker, - opaque: false, - page: () => DeferredWidget(destination_picker.loadLibrary, () => destination_picker.DestinationPickerView()), - binding: DestinationPickerBindings()), + name: AppRoutes.destinationPicker, + opaque: false, + page: () => DeferredWidget(destination_picker.loadLibrary, () => destination_picker.DestinationPickerView()), + binding: DestinationPickerBindings()), + ]; + + static final pages = [ GetPage( - name: AppRoutes.mailboxCreator, - opaque: false, - page: () => DeferredWidget(mailbox_creator.loadLibrary, () => mailbox_creator.MailboxCreatorView()), - binding: MailboxCreatorBindings()), + name: AppRoutes.home, + page: () => const HomeView(), + binding: HomeBindings()), GetPage( - name: AppRoutes.settings, - page: () => DeferredWidget(manage_account_dashboard.loadLibrary, () => manage_account_dashboard.ManageAccountDashBoardView()), - binding: ManageAccountDashBoardBindings()), + name: AppRoutes.login, + page: () => DeferredWidget(login.loadLibrary, () => login.LoginView()), + binding: LoginBindings()), GetPage( - name: AppRoutes.identityCreator, - opaque: false, - page: () => DeferredWidget(identity_creator.loadLibrary, () => identity_creator.IdentityCreatorView()), - binding: IdentityCreatorBindings()), + name: AppRoutes.session, + page: () => DeferredWidget(session.loadLibrary, () => session.SessionView()), + binding: SessionPageBindings()), GetPage( - name: AppRoutes.rulesFilterCreator, - opaque: false, - page: () => DeferredWidget( - rules_filter_creator.loadLibrary, - () => rules_filter_creator.RuleFilterCreatorView()), - binding: RulesFilterCreatorBindings()), + name: AppRoutes.dashboard, + page: () => DeferredWidget(mailbox_dashboard.loadLibrary, () => mailbox_dashboard.MailboxDashBoardView()), + binding: MailboxDashBoardBindings()), GetPage( - name: AppRoutes.emailsForwardCreator, - opaque: false, - page: () => DeferredWidget( - emails_forward_creator.loadLibrary, - () => emails_forward_creator.EmailsForwardCreatorView()), - binding: EmailsForwardCreatorBindings()), + name: AppRoutes.mailboxCreator, + opaque: false, + page: () => DeferredWidget(mailbox_creator.loadLibrary, () => mailbox_creator.MailboxCreatorView()), + binding: MailboxCreatorBindings()), + GetPage( + name: AppRoutes.settings, + page: () => DeferredWidget(manage_account_dashboard.loadLibrary, + () => manage_account_dashboard.ManageAccountDashBoardView()), + binding: ManageAccountDashBoardBindings()), + GetPage( + name: AppRoutes.identityCreator, + opaque: false, + page: () => DeferredWidget(identity_creator.loadLibrary, + () => identity_creator.IdentityCreatorView()), + binding: IdentityCreatorBindings()), + GetPage( + name: AppRoutes.rulesFilterCreator, + opaque: false, + page: () => DeferredWidget(rules_filter_creator.loadLibrary, + () => rules_filter_creator.RuleFilterCreatorView()), + binding: RulesFilterCreatorBindings()), + GetPage( + name: AppRoutes.emailsForwardCreator, + opaque: false, + page: () => DeferredWidget(emails_forward_creator.loadLibrary, + () => emails_forward_creator.EmailsForwardCreatorView()), + binding: EmailsForwardCreatorBindings()), GetPage( name: AppRoutes.contact, opaque: false, - page: () => DeferredWidget( - contact_view.loadLibrary, - () => contact_view.ContactView()), + page: () => DeferredWidget(contact_view.loadLibrary, () => contact_view.ContactView()), binding: ContactBindings()), -]; + if (!BuildUtils.isWeb) + ...pagesOnlyOnMobile + ]; } diff --git a/lib/main/routes/app_routes.dart b/lib/main/routes/app_routes.dart index ee3031b10..88d894972 100644 --- a/lib/main/routes/app_routes.dart +++ b/lib/main/routes/app_routes.dart @@ -3,13 +3,12 @@ abstract class AppRoutes { static const login = '/login'; static const session = '/session'; static const dashboard = '/dashboard'; - static const composer = '/composer'; - static const destinationPicker = '/destination_picker'; static const settings = '/settings'; + static const composer = '/composer'; + static const destinationPicker = '/destination_picker'; static const mailboxCreator = '$dashboard/mailbox_creator'; static const contact = '$dashboard/contact'; - static const identityCreator = '$settings/identity_creator'; static const rulesFilterCreator = '$settings/rules_filter_creator'; static const emailsForwardCreator = '$settings/emails_forward_creator';