diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index 0a4de9fef..a917efadd 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -1,16 +1,47 @@ +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/presentation/views/dialog/edit_text_dialog_builder.dart'; +import 'package:core/presentation/views/modal_sheets/edit_text_modal_sheet_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'; 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:model/mailbox/select_mode.dart'; +import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:core/utils/app_logger.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; +import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +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'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; abstract class BaseMailboxController extends BaseController { final TreeBuilder _treeBuilder; + final VerifyNameInteractor verifyNameInteractor; + jmap.State? currentMailboxState; - BaseMailboxController(this._treeBuilder); + BaseMailboxController( + this._treeBuilder, + this.verifyNameInteractor + ); final personalMailboxTree = MailboxTree(MailboxNode.root()).obs; final defaultMailboxTree = MailboxTree(MailboxNode.root()).obs; @@ -159,4 +190,206 @@ abstract class BaseMailboxController extends BaseController { MailboxNode get teamMailboxesRootNode => teamMailboxesTree.value.root; -} + List getListMailboxNameInParentMailbox(PresentationMailbox parentMailbox) { + if (parentMailbox.parentId == null) { + final allChildrenAtMailboxLocation = (defaultMailboxTree.value.root.childrenItems ?? []) + + (personalMailboxTree.value.root.childrenItems ?? []) + + (teamMailboxesTree.value.root.childrenItems ?? []); + if (allChildrenAtMailboxLocation.isNotEmpty) { + final listMailboxNameAsStringExist = allChildrenAtMailboxLocation + .where((mailboxNode) => mailboxNode.nameNotEmpty) + .map((mailboxNode) => mailboxNode.mailboxNameAsString) + .toList(); + return listMailboxNameAsStringExist; + } else { + return []; + } + } else { + final mailboxNodeLocation = findMailboxNodeById(parentMailbox.parentId!); + if (mailboxNodeLocation != null && mailboxNodeLocation.childrenItems?.isNotEmpty == true) { + final allChildrenAtMailboxLocation = mailboxNodeLocation.childrenItems!; + final listMailboxNameAsStringExist = allChildrenAtMailboxLocation + .where((mailboxNode) => mailboxNode.nameNotEmpty) + .map((mailboxNode) => mailboxNode.mailboxNameAsString) + .toList(); + return listMailboxNameAsStringExist; + } else { + return []; + } + } + } + + String? verifyMailboxNameAction( + BuildContext context, + String newName, + List listMailboxName, + MailboxActions mailboxActions + ) { + return verifyNameInteractor.execute(newName, [ + EmptyNameValidator(), + DuplicateNameValidator(listMailboxName), + ]).fold((failure) { + if (failure is VerifyNameFailure) { + return failure.getMessage(context, actions: mailboxActions); + } else { + return null; + } + }, (success) => null); + } + + void openDialogRenameMailboxAction( + BuildContext context, + PresentationMailbox presentationMailbox, + ResponsiveUtils responsiveUtils, { + required Function(PresentationMailbox mailbox, MailboxName newMailboxName) onRenameMailboxAction + }) { + final listMailboxName = getListMailboxNameInParentMailbox(presentationMailbox); + + if (responsiveUtils.isMobile(context)) { + (EditTextModalSheetBuilder() + ..key(const Key('rename_mailbox_dialog')) + ..title(AppLocalizations.of(context).rename_mailbox) + ..cancelText(AppLocalizations.of(context).cancel) + ..boxConstraints(responsiveUtils.isLandscapeMobile(context) + ? const BoxConstraints(maxWidth: 400) + : null) + ..onConfirmAction( + AppLocalizations.of(context).rename, + (value) => onRenameMailboxAction(presentationMailbox, MailboxName(value)) + ) + ..setErrorString((value) { + return verifyMailboxNameAction( + context, + value, + listMailboxName, + MailboxActions.rename + ); + }) + ..setTextController(TextEditingController.fromValue( + TextEditingValue( + text: presentationMailbox.name?.name ?? '', + selection: TextSelection( + baseOffset: 0, + extentOffset: presentationMailbox.name?.name.length ?? 0 + ) + ))) + ).show(context); + } else { + showDialog( + context: context, + barrierColor: AppColor.colorDefaultCupertinoActionSheet, + builder: (context) => + PointerInterceptor(child: (EditTextDialogBuilder() + ..key(const Key('rename_mailbox_dialog')) + ..title(AppLocalizations.of(context).rename_mailbox) + ..cancelText(AppLocalizations.of(context).cancel) + ..setErrorString((value) { + return verifyMailboxNameAction( + context, + value, + listMailboxName, + MailboxActions.rename + ); + }) + ..setTextController(TextEditingController.fromValue( + TextEditingValue( + text: presentationMailbox.name?.name ?? '', + selection: TextSelection( + baseOffset: 0, + extentOffset: presentationMailbox.name?.name.length ?? 0 + ) + )) + ) + ..onConfirmButtonAction( + AppLocalizations.of(context).rename, + (value) => onRenameMailboxAction(presentationMailbox, MailboxName(value)) + ) + ).build()) + ); + } + } + + void moveMailboxAction( + BuildContext context, + PresentationMailbox mailboxSelected, + MailboxDashBoardController dashBoardController, { + required Function(PresentationMailbox mailboxSelected, PresentationMailbox? destinationMailbox) onMovingMailboxAction + }) async { + final accountId = dashBoardController.accountId.value; + final session = dashBoardController.sessionCurrent; + if (accountId != null && session != null) { + + final arguments = DestinationPickerArguments( + accountId, + MailboxActions.move, + session, + mailboxIdSelected: mailboxSelected.id + ); + + if (BuildUtils.isWeb) { + showDialogDestinationPicker( + context: context, + arguments: arguments, + onSelectedMailbox: (destinationMailbox) { + onMovingMailboxAction( + mailboxSelected, + destinationMailbox == PresentationMailbox.unifiedMailbox + ? null + : destinationMailbox + ); + } + ); + } else { + final destinationMailbox = await push( + AppRoutes.destinationPicker, + arguments: arguments); + + if (destinationMailbox is PresentationMailbox) { + onMovingMailboxAction( + mailboxSelected, + destinationMailbox == PresentationMailbox.unifiedMailbox + ? null + : destinationMailbox + ); + } + } + } + } + + void openConfirmationDialogDeleteMailboxAction( + BuildContext context, + ResponsiveUtils responsiveUtils, + ImagePaths imagePaths, + PresentationMailbox presentationMailbox, { + required Function(PresentationMailbox mailbox) onDeleteMailboxAction + }) { + if (responsiveUtils.isLandscapeMobile(context) || responsiveUtils.isPortraitMobile(context)) { + (ConfirmationDialogActionSheetBuilder(context) + ..messageText(AppLocalizations.of(context).message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? '')) + ..onCancelAction(AppLocalizations.of(context).cancel, () => popBack()) + ..onConfirmAction(AppLocalizations.of(context).delete, () => onDeleteMailboxAction(presentationMailbox)) + ).show(); + } else { + showDialog( + context: context, + barrierColor: AppColor.colorDefaultCupertinoActionSheet, + builder: (context) => PointerInterceptor( + child: (ConfirmDialogBuilder(imagePaths) + ..key(const Key('confirm_dialog_delete_mailbox')) + ..title(AppLocalizations.of(context).delete_mailboxes) + ..content(AppLocalizations.of(context).message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? '')) + ..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog, fit: BoxFit.fill)) + ..colorConfirmButton(AppColor.colorConfirmActionDialog) + ..styleTextConfirmButton(const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w500, + color: AppColor.colorActionDeleteConfirmDialog + )) + ..onCloseButtonAction(() => popBack()) + ..onConfirmButtonAction(AppLocalizations.of(context).delete, () => onDeleteMailboxAction(presentationMailbox)) + ..onCancelButtonAction(AppLocalizations.of(context).cancel, () => popBack()) + ).build()) + ); + } + } +} \ No newline at end of file diff --git a/lib/features/base/mixin/mailbox_action_handler_mixin.dart b/lib/features/base/mixin/mailbox_action_handler_mixin.dart new file mode 100644 index 000000000..2079d8599 --- /dev/null +++ b/lib/features/base/mixin/mailbox_action_handler_mixin.dart @@ -0,0 +1,45 @@ + +import 'package:core/utils/app_logger.dart'; +import 'package:flutter/material.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/main/routes/app_routes.dart'; +import 'package:tmail_ui_user/main/routes/navigation_router.dart'; +import 'package:tmail_ui_user/main/routes/route_utils.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; + +mixin MailboxActionHandlerMixin { + + void openMailboxInNewTabAction(PresentationMailbox mailbox) { + final mailboxRouteWeb = RouteUtils.generateRouteBrowser( + AppRoutes.dashboard, + NavigationRouter(mailboxId: mailbox.id) + ); + log('MailboxActionHandlerMixin::openMailboxInNewTabAction(): mailboxRouteWeb: $mailboxRouteWeb'); + AppUtils.launchLink(mailboxRouteWeb.toString()); + } + + void markAsReadMailboxAction( + BuildContext context, + PresentationMailbox presentationMailbox, + MailboxDashBoardController dashboardController, + { + Function(BuildContext)? onCallbackAction + } + ) { + final accountId = dashboardController.accountId.value; + final mailboxId = presentationMailbox.id; + final mailboxName = presentationMailbox.name; + final countEmailsUnread = presentationMailbox.unreadEmails?.value.value ?? 0; + if (accountId != null && mailboxName != null) { + dashboardController.markAsReadMailbox( + accountId, + mailboxId, + mailboxName, + countEmailsUnread.toInt() + ); + + onCallbackAction?.call(context); + } + } +} \ 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 50b18de6e..9b4b50fd7 100644 --- a/lib/features/destination_picker/presentation/destination_picker_bindings.dart +++ b/lib/features/destination_picker/presentation/destination_picker_bindings.dart @@ -44,12 +44,12 @@ class DestinationPickerBindings extends BaseBindings { @override void bindingsController() { Get.lazyPut(() => DestinationPickerController( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), )); } diff --git a/lib/features/destination_picker/presentation/destination_picker_controller.dart b/lib/features/destination_picker/presentation/destination_picker_controller.dart index 1e4131a0f..2e0828b77 100644 --- a/lib/features/destination_picker/presentation/destination_picker_controller.dart +++ b/lib/features/destination_picker/presentation/destination_picker_controller.dart @@ -34,6 +34,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; @@ -59,7 +60,6 @@ class DestinationPickerController extends BaseMailboxController { final SearchMailboxInteractor _searchMailboxInteractor; final CreateNewMailboxInteractor _createNewMailboxInteractor; final RefreshAllMailboxInteractor _refreshAllMailboxInteractor; - final VerifyNameInteractor _verifyNameInteractor; final mailboxAction = Rxn(); final listMailboxSearched = [].obs; @@ -88,9 +88,9 @@ class DestinationPickerController extends BaseMailboxController { this._searchMailboxInteractor, this._createNewMailboxInteractor, this._refreshAllMailboxInteractor, - this._verifyNameInteractor, - treeBuilder, - ) : super(treeBuilder); + TreeBuilder treeBuilder, + VerifyNameInteractor verifyNameInteractor, + ) : super(treeBuilder, verifyNameInteractor); @override void onInit() { @@ -201,7 +201,7 @@ class DestinationPickerController extends BaseMailboxController { return null; } - return _verifyNameInteractor.execute( + return verifyNameInteractor.execute( nameMailbox, [ EmptyNameValidator(), diff --git a/lib/features/destination_picker/presentation/destination_picker_view.dart b/lib/features/destination_picker/presentation/destination_picker_view.dart index c2f13b409..86f6c405a 100644 --- a/lib/features/destination_picker/presentation/destination_picker_view.dart +++ b/lib/features/destination_picker/presentation/destination_picker_view.dart @@ -282,8 +282,8 @@ class DestinationPickerView extends GetWidget mailboxActions: actions, mailboxIdAlreadySelected: mailboxIdSelected, mailboxDisplayed: MailboxDisplayed.destinationPicker) - ..addOnOpenMailboxFolderClick((node) => _pickMailboxNode(context, node)) - ..addOnExpandFolderActionClick((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) + ..addOnClickOpenMailboxNodeAction((node) => _pickMailboxNode(context, node)) + ..addOnClickExpandMailboxNodeAction((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) ).build(), children: _buildListChildTileWidget( context, @@ -300,7 +300,7 @@ class DestinationPickerView extends GetWidget mailboxDisplayed: MailboxDisplayed.destinationPicker, mailboxIdAlreadySelected: mailboxIdSelected, mailboxActions: actions) - ..addOnOpenMailboxFolderClick((node) => _pickMailboxNode(context, node)) + ..addOnClickOpenMailboxNodeAction((node) => _pickMailboxNode(context, node)) ).build(); }}) .toList() ?? []; diff --git a/lib/features/mailbox/presentation/mailbox_bindings.dart b/lib/features/mailbox/presentation/mailbox_bindings.dart index 76108a026..43679ad7d 100644 --- a/lib/features/mailbox/presentation/mailbox_bindings.dart +++ b/lib/features/mailbox/presentation/mailbox_bindings.dart @@ -49,17 +49,17 @@ class MailboxBindings extends BaseBindings { @override void bindingsController() { Get.put(MailboxController( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), - Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find(), + Get.find() )); } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 0edbae77b..ec06f3724 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -17,10 +17,10 @@ import 'package:model/model.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:rxdart/transformers.dart'; import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart'; +import 'package:tmail_ui_user/features/base/mixin/mailbox_action_handler_mixin.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/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/state/delete_email_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; @@ -59,19 +59,17 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_action import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/open_mailbox_view_event.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/duplicate_name_validator.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/presentation/extensions/validator_failure_extension.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/mailbox_creator_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_creator/presentation/model/new_mailbox_arguments.dart'; 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/model/dashboard_routes.dart'; +import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_bindings.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; @@ -83,10 +81,9 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart'; -import 'package:tmail_ui_user/main/utils/app_utils.dart'; import 'package:uuid/uuid.dart'; -class MailboxController extends BaseMailboxController { +class MailboxController extends BaseMailboxController with MailboxActionHandlerMixin { final mailboxDashBoardController = Get.find(); final _appToast = Get.find(); @@ -99,7 +96,6 @@ class MailboxController extends BaseMailboxController { final CreateNewMailboxInteractor _createNewMailboxInteractor; final SearchMailboxInteractor _searchMailboxInteractor; final DeleteMultipleMailboxInteractor _deleteMultipleMailboxInteractor; - final VerifyNameInteractor _verifyNameInteractor; final RenameMailboxInteractor _renameMailboxInteractor; final MoveMailboxInteractor _moveMailboxInteractor; final SubscribeMailboxInteractor _subscribeMailboxInteractor; @@ -116,9 +112,6 @@ class MailboxController extends BaseMailboxController { final searchFocus = FocusNode(); final mailboxListScrollController = ScrollController(); - jmap.State? _currentMailboxState; - List listMailboxNameAsStringExist = []; - PresentationMailbox? get selectedMailbox => mailboxDashBoardController.selectedMailbox.value; PresentationEmail? get selectedEmail => mailboxDashBoardController.selectedEmail.value; @@ -129,13 +122,13 @@ class MailboxController extends BaseMailboxController { this._createNewMailboxInteractor, this._searchMailboxInteractor, this._deleteMultipleMailboxInteractor, - this._verifyNameInteractor, this._renameMailboxInteractor, this._moveMailboxInteractor, this._subscribeMailboxInteractor, this._subscribeMultipleMailboxInteractor, - treeBuilder, - ) : super(treeBuilder); + TreeBuilder treeBuilder, + VerifyNameInteractor verifyNameInteractor, + ) : super(treeBuilder, verifyNameInteractor); @override void onInit() { @@ -168,10 +161,10 @@ class MailboxController extends BaseMailboxController { super.onData(newState); newState.map((success) async { if (success is GetAllMailboxSuccess) { - _currentMailboxState = success.currentMailboxState; + currentMailboxState = success.currentMailboxState; _buildMailboxTreeHasSubscribed(success.mailboxList); } else if (success is RefreshChangesAllMailboxSuccess) { - _currentMailboxState = success.currentMailboxState; + currentMailboxState = success.currentMailboxState; _refreshMailboxTreeHasSubscribed(success.mailboxList); } }); @@ -278,7 +271,7 @@ class MailboxController extends BaseMailboxController { ever(mailboxDashBoardController.dashBoardAction, (action) { if (action is ClearSearchEmailAction) { _switchBackToMailboxDefault(); - } else if (action is OpenSpamMailboxAction) { + } else if (action is OpenMailboxAction) { openMailbox(action.context, action.presentationMailbox); } }); @@ -290,7 +283,7 @@ class MailboxController extends BaseMailboxController { } mailboxDashBoardController.clearMailboxUIAction(); } else if (action is RefreshChangeMailboxAction) { - if (action.newState != _currentMailboxState) { + if (action.newState != currentMailboxState) { refreshMailboxChanges(); } mailboxDashBoardController.clearMailboxUIAction(); @@ -340,7 +333,7 @@ class MailboxController extends BaseMailboxController { void refreshMailboxChanges({jmap.State? currentMailboxState}) { mailboxDashBoardController.showSpamReportBanner(); log('MailboxController::refreshMailboxChanges(): currentMailboxState: $currentMailboxState'); - final newMailboxState = currentMailboxState ?? _currentMailboxState; + final newMailboxState = currentMailboxState ?? this.currentMailboxState; log('MailboxController::refreshMailboxChanges(): newMailboxState: $newMailboxState'); final accountId = mailboxDashBoardController.accountId.value; final session = mailboxDashBoardController.sessionCurrent; @@ -605,7 +598,8 @@ class MailboxController extends BaseMailboxController { void enableSearch() { _cancelSelectMailbox(); - searchState.value = searchState.value.enableSearchState(); + SearchMailboxBindings().dependencies(); + mailboxDashBoardController.searchMailboxActivated.value = true; } void disableSearch() { @@ -705,58 +699,34 @@ class MailboxController extends BaseMailboxController { _openConfirmationDialogDeleteMultipleMailboxAction(context, selectedMailboxList); break; case MailboxActions.rename: - _openDialogRenameMailboxAction(context, selectedMailboxList.first); + openDialogRenameMailboxAction( + context, + selectedMailboxList.first, + _responsiveUtils, + onRenameMailboxAction: _renameMailboxAction + ); break; case MailboxActions.markAsRead: - _markAsReadMailboxAction(context, selectedMailboxList.first); + markAsReadMailboxAction( + context, + selectedMailboxList.first, + mailboxDashBoardController, + onCallbackAction: closeMailboxScreen + ); break; case MailboxActions.move: - _moveMailboxAction(context, selectedMailboxList.first); + moveMailboxAction( + context, + selectedMailboxList.first, + mailboxDashBoardController, + onMovingMailboxAction: _invokeMovingMailboxAction + ); break; default: break; } } - void _openConfirmationDialogDeleteMailboxAction( - BuildContext context, - PresentationMailbox presentationMailbox - ) { - if (_responsiveUtils.isLandscapeMobile(context) || - _responsiveUtils.isPortraitMobile(context)) { - (ConfirmationDialogActionSheetBuilder(context) - ..messageText(AppLocalizations.of(context) - .message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? '')) - ..onCancelAction(AppLocalizations.of(context).cancel, () => - popBack()) - ..onConfirmAction(AppLocalizations.of(context).delete, () => - _deleteMailboxAction(presentationMailbox))) - .show(); - } else { - showDialog( - context: context, - barrierColor: AppColor.colorDefaultCupertinoActionSheet, - builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths) - ..key(const Key('confirm_dialog_delete_mailbox')) - ..title(AppLocalizations.of(context).delete_mailboxes) - ..content(AppLocalizations.of(context) - .message_confirmation_dialog_delete_mailbox(presentationMailbox.name?.name ?? '')) - ..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, - fit: BoxFit.fill)) - ..colorConfirmButton(AppColor.colorConfirmActionDialog) - ..styleTextConfirmButton(const TextStyle( - fontSize: 17, - fontWeight: FontWeight.w500, - color: AppColor.colorActionDeleteConfirmDialog)) - ..onCloseButtonAction(() => popBack()) - ..onConfirmButtonAction(AppLocalizations.of(context).delete, () => - _deleteMailboxAction(presentationMailbox)) - ..onCancelButtonAction(AppLocalizations.of(context).cancel, () => - popBack())) - .build())); - } - } - void _deleteMailboxAction(PresentationMailbox presentationMailbox) { final accountId = mailboxDashBoardController.accountId.value; final session = mailboxDashBoardController.sessionCurrent; @@ -881,141 +851,19 @@ class MailboxController extends BaseMailboxController { } } - void _openDialogRenameMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) { - _createListMailboxNameAsStringInMailboxParent(presentationMailbox); - - if (_responsiveUtils.isMobile(context)) { - (EditTextModalSheetBuilder() - ..key(const Key('rename_mailbox_modal_sheet')) - ..title(AppLocalizations.of(context).rename_mailbox) - ..cancelText(AppLocalizations.of(context).cancel) - ..boxConstraints(_responsiveUtils.isLandscapeMobile(context) - ? const BoxConstraints(maxWidth: 400) - : null) - ..onConfirmAction(AppLocalizations.of(context).rename, - (value) => _renameMailboxAction(presentationMailbox, value)) - ..setErrorString((value) => getErrorInputNameStringRenameMailbox(context, value)) - ..setTextController(TextEditingController.fromValue( - TextEditingValue( - text: presentationMailbox.name?.name ?? '', - selection: TextSelection( - baseOffset: 0, - extentOffset: presentationMailbox.name?.name.length ?? 0 - ) - )))) - .show(context); - } else { - showDialog( - context: context, - barrierColor: AppColor.colorDefaultCupertinoActionSheet, - builder: (BuildContext context) => - PointerInterceptor(child: (EditTextDialogBuilder() - ..key(const Key('rename_mailbox_dialog')) - ..title(AppLocalizations.of(context).rename_mailbox) - ..cancelText(AppLocalizations.of(context).cancel) - ..setErrorString((value) => getErrorInputNameStringRenameMailbox(context, value)) - ..setTextController(TextEditingController.fromValue( - TextEditingValue( - text: presentationMailbox.name?.name ?? '', - selection: TextSelection( - baseOffset: 0, - extentOffset: presentationMailbox.name?.name.length ?? 0 - ) - ))) - ..onConfirmButtonAction(AppLocalizations.of(context).rename, - (value) => _renameMailboxAction(presentationMailbox, value))) - .build())); - } - } - - String? getErrorInputNameStringRenameMailbox(BuildContext context, String newName) { - return _verifyNameInteractor.execute( - newName, - [ - EmptyNameValidator(), - DuplicateNameValidator(listMailboxNameAsStringExist), - ] - ).fold( - (failure) { - if (failure is VerifyNameFailure) { - return failure.getMessage(context, actions: MailboxActions.rename); - } else { - return null; - } - }, - (success) => null - ); - } - - void _renameMailboxAction(PresentationMailbox presentationMailbox, String newName) { + void _renameMailboxAction(PresentationMailbox presentationMailbox, MailboxName newMailboxName) { final accountId = mailboxDashBoardController.accountId.value; if (accountId != null) { consumeState(_renameMailboxInteractor.execute( - accountId, - RenameMailboxRequest(presentationMailbox.id, MailboxName(newName)))); + accountId, + RenameMailboxRequest(presentationMailbox.id, newMailboxName)) + ); } _cancelSelectMailbox(); } - void _markAsReadMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) { - final accountId = mailboxDashBoardController.accountId.value; - final mailboxId = presentationMailbox.id; - final mailboxName = presentationMailbox.name; - final countEmailsUnread = presentationMailbox.unreadEmails?.value.value ?? 0; - if (accountId != null && mailboxName != null) { - mailboxDashBoardController.markAsReadMailbox( - accountId, - mailboxId, - mailboxName, - countEmailsUnread.toInt()); - - closeMailboxScreen(context); - } - } - - void _moveMailboxAction(BuildContext context, PresentationMailbox mailboxSelected) async { - final accountId = mailboxDashBoardController.accountId.value; - final _session = mailboxDashBoardController.sessionCurrent; - if (accountId != null) { - final arguments = DestinationPickerArguments( - accountId, - MailboxActions.move, - _session, - 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, - MoveAction.moving, - mailboxSelected, - destinationMailbox: destinationMailbox == PresentationMailbox.unifiedMailbox ? null : destinationMailbox); - - _cancelSelectMailbox(); - } - } - } - } - void _handleMovingMailbox( AccountId accountId, MoveAction moveAction, @@ -1069,36 +917,6 @@ class MailboxController extends BaseMailboxController { } } - void _createListMailboxNameAsStringInMailboxParent(PresentationMailbox mailboxRenamed) { - if (mailboxRenamed.parentId == null) { - final allChildrenAtMailboxLocation = ( - defaultMailboxTree.value.root.childrenItems ?? []) - + (personalMailboxTree.value.root.childrenItems ?? []) - + (teamMailboxesTree.value.root.childrenItems ?? []); - if (allChildrenAtMailboxLocation.isNotEmpty) { - listMailboxNameAsStringExist = allChildrenAtMailboxLocation - .where((mailboxNode) => mailboxNode.nameNotEmpty) - .map((mailboxNode) => mailboxNode.mailboxNameAsString) - .toList(); - } else { - listMailboxNameAsStringExist = []; - } - } else { - final mailboxNodeLocation = findMailboxNodeById(mailboxRenamed.parentId!); - if (mailboxNodeLocation != null && mailboxNodeLocation.childrenItems?.isNotEmpty == true) { - final allChildrenAtMailboxLocation = mailboxNodeLocation.childrenItems!; - listMailboxNameAsStringExist = allChildrenAtMailboxLocation - .where((mailboxNode) => mailboxNode.nameNotEmpty) - .map((mailboxNode) => mailboxNode.mailboxNameAsString) - .toList(); - } else { - listMailboxNameAsStringExist = []; - } - } - - log('MailboxController::_createListMailboxNameAsStringInMailboxLocation(): $listMailboxNameAsStringExist'); - } - void toggleMailboxCategories(MailboxCategories categories) { switch(categories) { case MailboxCategories.exchange: @@ -1149,16 +967,37 @@ class MailboxController extends BaseMailboxController { switch(actions) { case MailboxActions.delete: - _openConfirmationDialogDeleteMailboxAction(context, mailbox); + openConfirmationDialogDeleteMailboxAction( + context, + _responsiveUtils, + _imagePaths, + mailbox, + onDeleteMailboxAction: _deleteMailboxAction + ); break; case MailboxActions.rename: - _openDialogRenameMailboxAction(context, mailbox); + openDialogRenameMailboxAction( + context, + mailbox, + _responsiveUtils, + onRenameMailboxAction: _renameMailboxAction + ); break; case MailboxActions.move: - _moveMailboxAction(context, mailbox); + moveMailboxAction( + context, + mailbox, + mailboxDashBoardController, + onMovingMailboxAction: _invokeMovingMailboxAction + ); break; case MailboxActions.markAsRead: - _markAsReadMailboxAction(context, mailbox); + markAsReadMailboxAction( + context, + mailbox, + mailboxDashBoardController, + onCallbackAction: closeMailboxScreen + ); break; case MailboxActions.openInNewTab: openMailboxInNewTabAction(mailbox); @@ -1175,13 +1014,17 @@ class MailboxController extends BaseMailboxController { } } - void openMailboxInNewTabAction(PresentationMailbox mailbox) { - final mailboxRouteWeb = RouteUtils.generateRouteBrowser( - AppRoutes.dashboard, - NavigationRouter(mailboxId: mailbox.id) - ); - log('MailboxController::openMailboxInNewTabAction(): mailboxRouteWeb: $mailboxRouteWeb'); - AppUtils.launchLink(mailboxRouteWeb.toString()); + void _invokeMovingMailboxAction(PresentationMailbox mailboxSelected, PresentationMailbox? destinationMailbox) { + final accountId = mailboxDashBoardController.accountId.value; + if (accountId != null) { + _handleMovingMailbox( + accountId, + MoveAction.moving, + mailboxSelected, + destinationMailbox: destinationMailbox + ); + _cancelSelectMailbox(); + } } void _updateSelectedMailboxRouteOnBrowser() { diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index 4623ed289..2a670a370 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -226,13 +226,16 @@ class MailboxView extends GetWidget { Row( children: [ buildIconWeb( - iconSize: 20, - minSize: 40, - iconPadding: EdgeInsets.zero, - splashRadius: 15, - icon: SvgPicture.asset(_imagePaths.icSearchBar, color: AppColor.colorTextButton, fit: BoxFit.fill), + minSize: 40, + iconPadding: EdgeInsets.zero, + icon: SvgPicture.asset( + _imagePaths.icSearchBar, + color: AppColor.colorTextButton, + fit: BoxFit.fill + ), tooltip: AppLocalizations.of(context).search_folder, - onTap: () => controller.enableSearch()), + onTap: controller.enableSearch + ), buildIconWeb( minSize: 40, iconSize: 20, @@ -391,18 +394,18 @@ class MailboxView extends GetWidget { isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, parent: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, allSelectMode: controller.currentSelectMode.value) - ..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item)) - ..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) - ..addOnExpandFolderActionClick((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) - ..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode))) + ..addOnLongPressMailboxNodeAction((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item)) + ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) + ..addOnClickExpandMailboxNodeAction((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) + ..addOnSelectMailboxNodeAction((mailboxNode) => controller.selectMailboxNode(mailboxNode))) .build()), children: _buildListChildTileWidget(context, mailboxNode) ).build() : Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, allSelectMode: controller.currentSelectMode.value) - ..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item)) - ..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) - ..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode))) + ..addOnLongPressMailboxNodeAction((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item)) + ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) + ..addOnSelectMailboxNodeAction((mailboxNode) => controller.selectMailboxNode(mailboxNode))) .build()) ).toList() ?? []; } @@ -466,7 +469,7 @@ class MailboxView extends GetWidget { allSelectMode: controller.currentSelectMode.value, lastMailboxIdInSearchedList: controller.listMailboxSearched.last.id) ..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox)) - ..addOnSelectMailboxActionClick((mailbox) => controller.selectMailboxSearched(context, mailbox))) + ..addOnSelectMailboxAction((mailbox) => controller.selectMailboxSearched(context, mailbox))) .build()) ) )); diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 0ac740775..8deaebfb2 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -153,12 +153,15 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu child: Row( children: [ buildIconWeb( - minSize: 40, - iconSize: 20, - iconPadding: EdgeInsets.zero, - splashRadius: 15, - icon: SvgPicture.asset(_imagePaths.icSearchBar, color: AppColor.colorTextButton, fit: BoxFit.fill), - onTap: () => controller.enableSearch()), + minSize: 40, + iconPadding: EdgeInsets.zero, + icon: SvgPicture.asset( + _imagePaths.icSearchBar, + color: AppColor.colorTextButton, + fit: BoxFit.fill + ), + onTap: controller.enableSearch + ), buildIconWeb( minSize: 40, iconSize: 20, @@ -295,27 +298,27 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, parent: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value) - ..addOnOpenMailboxFolderClick((mailboxNode) => + ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) - ..addOnExpandFolderActionClick((mailboxNode) => + ..addOnClickExpandMailboxNodeAction((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) - ..addOnMenuActionClick((position, mailboxNode) => + ..addOnClickOpenMenuMailboxNodeAction((position, mailboxNode) => _openMailboxMenuAction(context, position, mailboxNode.item)) - ..addOnSelectMailboxFolderClick((mailboxNode) => + ..addOnSelectMailboxNodeAction((mailboxNode) => controller.selectMailboxNode(mailboxNode)) - ..addOnDragItemAccepted(_handleDragItemAccepted)) + ..addOnDragEmailToMailboxAccepted(_handleDragItemAccepted)) .build()), children: _buildListChildTileWidget(context, mailboxNode) ).build() : Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value) - ..addOnOpenMailboxFolderClick((mailboxNode) => + ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) - ..addOnMenuActionClick((position, mailboxNode) => + ..addOnClickOpenMenuMailboxNodeAction((position, mailboxNode) => _openMailboxMenuAction(context, position, mailboxNode.item)) - ..addOnSelectMailboxFolderClick((mailboxNode) => + ..addOnSelectMailboxNodeAction((mailboxNode) => controller.selectMailboxNode(mailboxNode)) - ..addOnDragItemAccepted(_handleDragItemAccepted)) + ..addOnDragEmailToMailboxAccepted(_handleDragItemAccepted)) .build()) ).toList() ?? []; } @@ -392,10 +395,10 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu _imagePaths, _responsiveUtils, listMailbox[index]) - ..addOnDragItemAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction) + ..addOnDragEmailToMailboxAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction) ..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox)) ..addOnMenuActionClick((position, mailbox) => _openMailboxMenuAction(context, position, mailbox)) - ..addOnSelectMailboxActionClick((mailbox) => controller.selectMailboxSearched(context, mailbox))) + ..addOnSelectMailboxAction((mailbox) => controller.selectMailboxSearched(context, mailbox))) .build())) ); } @@ -427,7 +430,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu if (_responsiveUtils.isScreenWithShortestSide(context)) { controller.openContextMenuAction( context, - _bottomSheetIdentityActionTiles( + _bottomSheetMailboxActionTiles( context, mailbox, listContextMenuItemAction)); @@ -442,7 +445,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu } } - List _bottomSheetIdentityActionTiles( + List _bottomSheetMailboxActionTiles( BuildContext context, PresentationMailbox mailbox, List contextMenuActions diff --git a/lib/features/mailbox/presentation/utils/mailbox_method_action_define.dart b/lib/features/mailbox/presentation/utils/mailbox_method_action_define.dart new file mode 100644 index 000000000..8481f6f1e --- /dev/null +++ b/lib/features/mailbox/presentation/utils/mailbox_method_action_define.dart @@ -0,0 +1,16 @@ + +import 'package:flutter/material.dart'; +import 'package:model/email/presentation_email.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; + +typedef OnClickOpenMailboxAction = void Function(PresentationMailbox); +typedef OnClickOpenMenuMailboxAction = void Function(RelativeRect, PresentationMailbox); +typedef OnSelectMailboxAction = void Function(PresentationMailbox); +typedef OnDragEmailToMailboxAccepted = void Function(List, PresentationMailbox); + +typedef OnClickExpandMailboxNodeAction = void Function(MailboxNode); +typedef OnClickOpenMailboxNodeAction = void Function(MailboxNode); +typedef OnSelectMailboxNodeAction = void Function(MailboxNode); +typedef OnClickOpenMenuMailboxNodeAction = void Function(RelativeRect, MailboxNode); +typedef OnLongPressMailboxNodeAction = void Function(MailboxNode); \ No newline at end of file diff --git a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart index ce832b697..0ee040179 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -8,15 +8,9 @@ import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_ma import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; -typedef OnExpandFolderActionClick = void Function(MailboxNode); -typedef OnOpenMailboxFolderClick = void Function(MailboxNode); -typedef OnSelectMailboxFolderClick = void Function(MailboxNode); -typedef OnMenuActionClick = void Function(RelativeRect, MailboxNode); -typedef OnDragItemAccepted = void Function(List, PresentationMailbox); -typedef OnLongPressMailboxFolderClick = void Function(MailboxNode); - class MailBoxFolderTileBuilder { final _responsiveUtils = Get.find(); @@ -31,13 +25,13 @@ class MailBoxFolderTileBuilder { final MailboxActions? mailboxActions; final MailboxId? mailboxIdAlreadySelected; - OnExpandFolderActionClick? _onExpandFolderActionClick; - OnOpenMailboxFolderClick? _onOpenMailboxFolderClick; - OnSelectMailboxFolderClick? _onSelectMailboxFolderClick; - OnMenuActionClick? _onMenuActionClick; - OnDragItemAccepted? _onDragItemAccepted; - OnLongPressMailboxFolderClick? _onLongPressMailboxFolderClick; - + OnClickExpandMailboxNodeAction? _onExpandFolderActionClick; + OnClickOpenMailboxNodeAction? _onOpenMailboxFolderClick; + OnSelectMailboxNodeAction? _onSelectMailboxFolderClick; + OnClickOpenMenuMailboxNodeAction? _onMenuActionClick; + OnDragEmailToMailboxAccepted? _onDragItemAccepted; + OnLongPressMailboxNodeAction? _onLongPressSpamReport; + bool isHoverItem = false; MailBoxFolderTileBuilder( @@ -54,28 +48,28 @@ class MailBoxFolderTileBuilder { } ); - void addOnExpandFolderActionClick(OnExpandFolderActionClick onExpandFolderActionClick) { + void addOnClickExpandMailboxNodeAction(OnClickExpandMailboxNodeAction onExpandFolderActionClick) { _onExpandFolderActionClick = onExpandFolderActionClick; } - void addOnOpenMailboxFolderClick(OnOpenMailboxFolderClick onOpenMailboxFolderClick) { + void addOnClickOpenMailboxNodeAction(OnClickOpenMailboxNodeAction onOpenMailboxFolderClick) { _onOpenMailboxFolderClick = onOpenMailboxFolderClick; } - void addOnSelectMailboxFolderClick(OnSelectMailboxFolderClick onSelectMailboxFolderClick) { + void addOnSelectMailboxNodeAction(OnSelectMailboxNodeAction onSelectMailboxFolderClick) { _onSelectMailboxFolderClick = onSelectMailboxFolderClick; } - void addOnMenuActionClick(OnMenuActionClick onMenuActionClick) { + void addOnClickOpenMenuMailboxNodeAction(OnClickOpenMenuMailboxNodeAction onMenuActionClick) { _onMenuActionClick = onMenuActionClick; } - void addOnDragItemAccepted(OnDragItemAccepted onDragItemAccepted) { + void addOnDragEmailToMailboxAccepted(OnDragEmailToMailboxAccepted onDragItemAccepted) { _onDragItemAccepted = onDragItemAccepted; } - void addOnLongPressMailboxFolderClick(OnLongPressMailboxFolderClick onLongPressMailboxFolderClick) { - _onLongPressMailboxFolderClick = onLongPressMailboxFolderClick; + void addOnLongPressMailboxNodeAction(OnLongPressMailboxNodeAction onLongPressSpamReport) { + _onLongPressSpamReport = onLongPressSpamReport; } Widget build() => DragTarget>( diff --git a/lib/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart index 63667c8a8..26c426a34 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart @@ -6,11 +6,7 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_displayed.dart'; - -typedef OnOpenMailboxActionClick = void Function(PresentationMailbox); -typedef OnSelectMailboxActionClick = void Function(PresentationMailbox); -typedef OnOpenMenuActionClick = void Function(RelativeRect, PresentationMailbox); -typedef OnDragItemAccepted = void Function(List, PresentationMailbox); +import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_method_action_define.dart'; class MailboxSearchTileBuilder { @@ -27,10 +23,10 @@ class MailboxSearchTileBuilder { bool isHoverItem = false; - OnOpenMailboxActionClick? _onOpenMailboxActionClick; - OnSelectMailboxActionClick? _onSelectMailboxActionClick; - OnOpenMenuActionClick? _onMenuActionClick; - OnDragItemAccepted? _onDragItemAccepted; + OnClickOpenMailboxAction? _onOpenMailboxActionClick; + OnSelectMailboxAction? _onSelectMailboxActionClick; + OnClickOpenMenuMailboxAction? _onMenuActionClick; + OnDragEmailToMailboxAccepted? _onDragItemAccepted; MailboxSearchTileBuilder( this._context, @@ -47,19 +43,19 @@ class MailboxSearchTileBuilder { } ); - void addOnOpenMailboxAction(OnOpenMailboxActionClick onOpenMailboxActionClick) { + void addOnOpenMailboxAction(OnClickOpenMailboxAction onOpenMailboxActionClick) { _onOpenMailboxActionClick = onOpenMailboxActionClick; } - void addOnSelectMailboxActionClick(OnSelectMailboxActionClick onSelectMailboxActionClick) { + void addOnSelectMailboxAction(OnSelectMailboxAction onSelectMailboxActionClick) { _onSelectMailboxActionClick = onSelectMailboxActionClick; } - void addOnMenuActionClick(OnOpenMenuActionClick onOpenMenuActionClick) { + void addOnMenuActionClick(OnClickOpenMenuMailboxAction onOpenMenuActionClick) { _onMenuActionClick = onOpenMenuActionClick; } - void addOnDragItemAccepted(OnDragItemAccepted onDragItemAccepted) { + void addOnDragEmailToMailboxAccepted(OnDragEmailToMailboxAccepted onDragItemAccepted) { _onDragItemAccepted = onDragItemAccepted; } diff --git a/lib/features/mailbox_creator/domain/state/verify_name_view_state.dart b/lib/features/mailbox_creator/domain/state/verify_name_view_state.dart index 1522423d0..f0b668d15 100644 --- a/lib/features/mailbox_creator/domain/state/verify_name_view_state.dart +++ b/lib/features/mailbox_creator/domain/state/verify_name_view_state.dart @@ -9,7 +9,7 @@ class VerifyNameViewState extends UIState { } class VerifyNameFailure extends FeatureFailure { - final exception; + final dynamic exception; VerifyNameFailure(this.exception); @override diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart index 93581a786..5dee9046a 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart @@ -34,9 +34,9 @@ class RulesFilterCreatorBindings extends BaseBindings { @override void bindingsController() { Get.lazyPut(() => RulesFilterCreatorController( - Get.find(), Get.find(), - Get.find() + Get.find(), + Get.find() )); } 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 f29609616..885cb2435 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 @@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/destination_picker/presentation/model/des import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; @@ -44,7 +45,6 @@ class RulesFilterCreatorController extends BaseMailboxController { final _appToast = Get.find(); - final VerifyNameInteractor _verifyNameInteractor; final GetAllMailboxInteractor _getAllMailboxInteractor; GetAllRulesInteractor? _getAllRulesInteractor; @@ -76,10 +76,10 @@ class RulesFilterCreatorController extends BaseMailboxController { List? _listEmailRule; RulesFilterCreatorController( - this._verifyNameInteractor, this._getAllMailboxInteractor, - treeBuilder - ) : super(treeBuilder); + TreeBuilder treeBuilder, + VerifyNameInteractor verifyNameInteractor, + ) : super(treeBuilder, verifyNameInteractor); @override void onInit() { @@ -206,7 +206,7 @@ class RulesFilterCreatorController extends BaseMailboxController { } String? _getErrorStringByInputValue(BuildContext context, String? inputValue) { - return _verifyNameInteractor.execute(inputValue, [EmptyNameValidator()]).fold( + return verifyNameInteractor.execute(inputValue, [EmptyNameValidator()]).fold( (failure) { if (failure is VerifyNameFailure) { return failure.getMessageRulesFilter(context);