diff --git a/lib/features/mailbox/presentation/mailbox_bindings.dart b/lib/features/mailbox/presentation/mailbox_bindings.dart index d00a210b5..76108a026 100644 --- a/lib/features/mailbox/presentation/mailbox_bindings.dart +++ b/lib/features/mailbox/presentation/mailbox_bindings.dart @@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailb import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; @@ -57,6 +58,7 @@ class MailboxBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), Get.find(), )); } @@ -99,6 +101,7 @@ class MailboxBindings extends BaseBindings { Get.lazyPut(() => RenameMailboxInteractor(Get.find())); Get.lazyPut(() => MoveMailboxInteractor(Get.find())); Get.lazyPut(() => SubscribeMailboxInteractor(Get.find())); + Get.lazyPut(() => SubscribeMultipleMailboxInteractor(Get.find())); } @override diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 2ec031b09..6fc2d84f1 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -32,6 +32,8 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_st import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; @@ -41,6 +43,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_ import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/search_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_mailbox_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart'; @@ -49,7 +52,9 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailb import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/extensions/list_mailbox_node_extension.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; 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'; @@ -98,6 +103,7 @@ class MailboxController extends BaseMailboxController { final RenameMailboxInteractor _renameMailboxInteractor; final MoveMailboxInteractor _moveMailboxInteractor; final SubscribeMailboxInteractor _subscribeMailboxInteractor; + final SubscribeMultipleMailboxInteractor _subscribeMultipleMailboxInteractor; final listMailboxSearched = [].obs; final searchState = SearchState.initial().obs; @@ -125,6 +131,7 @@ class MailboxController extends BaseMailboxController { this._renameMailboxInteractor, this._moveMailboxInteractor, this._subscribeMailboxInteractor, + this._subscribeMultipleMailboxInteractor, treeBuilder, ) : super(treeBuilder); @@ -200,7 +207,11 @@ class MailboxController extends BaseMailboxController { } else if (success is MoveMailboxSuccess) { _moveMailboxSuccess(success); } else if (success is SubscribeMailboxSuccess) { - subscribeMailboxSuccess(success); + _handleUnsubscribeMailboxSuccess(success); + } else if (success is SubscribeMultipleMailboxAllSuccess) { + _handleUnsubscribeMultipleMailboxAllSuccess(success); + } else if (success is SubscribeMultipleMailboxHasSomeSuccess) { + _handleUnsubscribeMultipleMailboxHasSomeSuccess(success); } } ); @@ -1154,10 +1165,7 @@ class MailboxController extends BaseMailboxController { mailboxDashBoardController.storeSpamReportStateAction(); break; case MailboxActions.disableMailbox: - subscribeMailboxAction(SubscribeMailboxRequest( - mailbox.id, - MailboxSubscribeState.disabled, - MailboxSubscribeAction.unSubscribe)); + _unsubscribeMailboxAction(mailbox.id); break; default: break; @@ -1228,43 +1236,137 @@ class MailboxController extends BaseMailboxController { await refreshTree(_mailboxList); } - void subscribeMailboxAction(SubscribeMailboxRequest subscribeMailboxRequest) { + SubscribeRequest? _generateSubscribeRequest( + MailboxId mailboxId, + MailboxSubscribeState subscribeState, + MailboxSubscribeAction subscribeAction + ) { + final mailboxNode = findMailboxNodeById(mailboxId); + + if (mailboxNode != null) { + if (mailboxNode.hasChildren()) { + final listDescendantMailboxIds = mailboxNode.descendantsAsList().mailboxIds; + return SubscribeMultipleMailboxRequest(mailboxId, listDescendantMailboxIds, subscribeState, subscribeAction); + } else { + return SubscribeMailboxRequest(mailboxId, subscribeState, subscribeAction); + } + } + return null; + } + + void _unsubscribeMailboxAction(MailboxId mailboxId) { final _accountId = mailboxDashBoardController.accountId.value; + if (_accountId != null) { - consumeState(_subscribeMailboxInteractor.execute( - _accountId, - subscribeMailboxRequest - )); + final subscribeRequest = _generateSubscribeRequest( + mailboxId, + MailboxSubscribeState.disabled, + MailboxSubscribeAction.unSubscribe + ); + + if (subscribeRequest is SubscribeMultipleMailboxRequest) { + consumeState(_subscribeMultipleMailboxInteractor.execute(_accountId, subscribeRequest)); + } else if (subscribeRequest is SubscribeMailboxRequest) { + consumeState(_subscribeMailboxInteractor.execute(_accountId, subscribeRequest)); + } } } - void subscribeMailboxSuccess(SubscribeMailboxSuccess subscribeMailboxSuccess) { - if(subscribeMailboxSuccess.mailboxSubscribeStateAction == MailboxSubscribeAction.unSubscribe - && currentOverlayContext != null - && currentContext != null) { - _appToast.showBottomToast( - currentOverlayContext!, - AppLocalizations.of(currentContext!).toastMsgHideMailboxSuccess, - actionName: AppLocalizations.of(currentContext!).undo, - onActionClick: () { - subscribeMailboxAction(SubscribeMailboxRequest( - subscribeMailboxSuccess.mailboxId, - MailboxSubscribeState.enabled, - MailboxSubscribeAction.undo)); - }, - leadingIcon: SvgPicture.asset( - _imagePaths.icFolderMailbox, - width: 24, - height: 24, - color: Colors.white, - fit: BoxFit.fill), - backgroundColor: AppColor.toastSuccessBackgroundColor, - textColor: Colors.white, - textActionColor: Colors.white, - actionIcon: SvgPicture.asset(_imagePaths.icUndo), - maxWidth: _responsiveUtils.getMaxWidthToast(currentContext!)); + void _handleUnsubscribeMailboxSuccess(SubscribeMailboxSuccess success) { + if (success.subscribeAction == MailboxSubscribeAction.unSubscribe) { + _showToastSubscribeMailboxSuccess(success.mailboxId); + + if (success.mailboxId == selectedMailbox?.id) { + _switchBackToMailboxDefault(); + } } - refreshMailboxChanges(currentMailboxState: subscribeMailboxSuccess.currentMailboxState); + refreshMailboxChanges(currentMailboxState: success.currentMailboxState); + } + + void _handleUnsubscribeMultipleMailboxAllSuccess(SubscribeMultipleMailboxAllSuccess success) { + if(success.subscribeAction == MailboxSubscribeAction.unSubscribe) { + _showToastSubscribeMailboxSuccess(success.parentMailboxId); + + if (success.mailboxIdsSubscribe.contains(selectedMailbox?.id)) { + _switchBackToMailboxDefault(); + } + } + + refreshMailboxChanges(currentMailboxState: success.currentMailboxState); + } + + void _handleUnsubscribeMultipleMailboxHasSomeSuccess(SubscribeMultipleMailboxHasSomeSuccess success) { + if(success.subscribeAction == MailboxSubscribeAction.unSubscribe) { + _showToastSubscribeMailboxSuccess(success.parentMailboxId); + + if (success.mailboxIdsSubscribe.contains(selectedMailbox?.id)) { + _switchBackToMailboxDefault(); + } + } + + refreshMailboxChanges(currentMailboxState: success.currentMailboxState); + } + + void _showToastSubscribeMailboxSuccess(MailboxId mailboxId) { + if (currentOverlayContext != null && currentContext != null) { + _appToast.showBottomToast( + currentOverlayContext!, + AppLocalizations.of(currentContext!).toastMsgHideMailboxSuccess, + actionName: AppLocalizations.of(currentContext!).undo, + onActionClick: () => _undoUnsubscribeMailboxAction(mailboxId), + leadingIcon: SvgPicture.asset( + _imagePaths.icFolderMailbox, + width: 24, + height: 24, + color: Colors.white, + fit: BoxFit.fill + ), + backgroundColor: AppColor.toastSuccessBackgroundColor, + textColor: Colors.white, + textActionColor: Colors.white, + actionIcon: SvgPicture.asset(_imagePaths.icUndo), + maxWidth: _responsiveUtils.getMaxWidthToast(currentContext!) + ); + } + } + + void _undoUnsubscribeMailboxAction(MailboxId mailboxId) { + final _accountId = mailboxDashBoardController.accountId.value; + + if (_accountId != null) { + final subscribeRequest = _generateSubscribeRequest( + mailboxId, + MailboxSubscribeState.enabled, + MailboxSubscribeAction.undo + ); + + if (subscribeRequest is SubscribeMultipleMailboxRequest) { + consumeState(_subscribeMultipleMailboxInteractor.execute(_accountId, subscribeRequest)); + } else if (subscribeRequest is SubscribeMailboxRequest) { + consumeState(_subscribeMailboxInteractor.execute(_accountId, subscribeRequest)); + } + } + } + + MailboxActions _mailboxActionForSpam() { + return mailboxDashBoardController.enableSpamReport + ? MailboxActions.disableSpamReport + : MailboxActions.enableSpamReport; + } + + List listActionForMailbox(PresentationMailbox mailbox) { + return [ + if (BuildUtils.isWeb) + MailboxActions.openInNewTab, + if (mailbox.isSpam) + _mailboxActionForSpam(), + MailboxActions.markAsRead, + MailboxActions.move, + MailboxActions.rename, + MailboxActions.delete, + if (mailbox.isSupportedDisableMailbox) + MailboxActions.disableMailbox + ]; } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index 607056d29..151ec5b8f 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -329,51 +329,70 @@ class MailboxView extends GetWidget { ]); } - void _openBottomSheetSpamMenuAction(BuildContext context, PresentationMailbox mailbox) { - final _mailboxActionsSupported = [ - MailboxActions.disableMailbox + MailboxActions _mailboxActionForSpam() { + return controller.mailboxDashBoardController.enableSpamReport + ? MailboxActions.disableSpamReport + : MailboxActions.enableSpamReport; + } + + List _listActionForMailbox(PresentationMailbox mailbox) { + return [ + if (BuildUtils.isWeb) + MailboxActions.openInNewTab, + if (mailbox.isSpam) + _mailboxActionForSpam(), + MailboxActions.markAsRead, + MailboxActions.move, + MailboxActions.rename, + MailboxActions.delete, + if (mailbox.isSupportedDisableMailbox) + MailboxActions.disableMailbox ]; + } - if (mailbox.isSpam) { - _mailboxActionsSupported.add(controller.mailboxDashBoardController.enableSpamReport - ? MailboxActions.disableSpamReport - : MailboxActions.enableSpamReport); - } + void _openBottomSheetMailboxMenuAction(BuildContext context, PresentationMailbox mailbox) { + final mailboxActionsSupported = _listActionForMailbox(mailbox); - final listContextMailboxPopupMenuItemAction = _mailboxActionsSupported - .map((action) => ContextMenuItemMailboxAction(action, action.getContextMenuItemState(mailbox))) - .toList(); + final listContextMailboxPopupMenuItemAction = mailboxActionsSupported + .map((action) => ContextMenuItemMailboxAction(action, action.getContextMenuItemState(mailbox))) + .toList(); controller.openContextMenuAction( + context, + _bottomSheetMailboxActionTiles( context, - _bottomSheetIdentityActionTiles(context, mailbox, listContextMailboxPopupMenuItemAction)); + mailbox, + listContextMailboxPopupMenuItemAction + ) + ); } - List _bottomSheetIdentityActionTiles( - BuildContext context, - PresentationMailbox mailbox, - List contextMenuActions) { + List _bottomSheetMailboxActionTiles( + BuildContext context, + PresentationMailbox mailbox, + List contextMenuActions + ) { return contextMenuActions - .map((action) => _openBottomSheetSpamMenuActionTile(context, action, mailbox)) - .toList(); + .map((action) => _openBottomSheetMailboxMenuActionTile(context, action, mailbox)) + .toList(); } - Widget _openBottomSheetSpamMenuActionTile( - BuildContext context, - ContextMenuItemMailboxAction contextMenuItem, - PresentationMailbox mailbox) { + Widget _openBottomSheetMailboxMenuActionTile( + BuildContext context, + ContextMenuItemMailboxAction contextMenuItem, + PresentationMailbox mailbox + ) { return (MailboxBottomSheetActionTileBuilder( - Key('${contextMenuItem.action.name}_action'), - SvgPicture.asset( - contextMenuItem.action.getContextMenuIcon(_imagePaths), - color: AppColor.primaryColor), - contextMenuItem.action.getTitleContextMenu(context), - mailbox, - absorbing: !contextMenuItem.isActivated, - opacity: !contextMenuItem.isActivated) - ..onActionClick((mailbox) => controller.handleMailboxAction( - context, contextMenuItem.action, mailbox))) - .build(); + Key('${contextMenuItem.action.name}_action'), + SvgPicture.asset( + contextMenuItem.action.getContextMenuIcon(_imagePaths), + color: AppColor.primaryColor), + contextMenuItem.action.getTitleContextMenu(context), + mailbox, + absorbing: !contextMenuItem.isActivated, + opacity: !contextMenuItem.isActivated) + ..onActionClick((mailbox) => controller.handleMailboxAction(context, contextMenuItem.action, mailbox))) + .build(); } List _buildListChildTileWidget(BuildContext context, MailboxNode parentNode, {MailboxNode? lastNode}) { @@ -385,7 +404,7 @@ class MailboxView extends GetWidget { isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND, parent: Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, allSelectMode: controller.currentSelectMode.value) - ..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetSpamMenuAction(context, mailboxNode.item)) + ..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item)) ..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) ..addOnExpandFolderActionClick((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) ..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode))) @@ -394,7 +413,7 @@ class MailboxView extends GetWidget { ).build() : Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, allSelectMode: controller.currentSelectMode.value) - ..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetSpamMenuAction(context, mailboxNode.item)) + ..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetMailboxMenuAction(context, mailboxNode.item)) ..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) ..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode))) .build()) diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index c0ff3f1cc..63721a8d6 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -449,25 +449,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu RelativeRect position, PresentationMailbox mailbox ) { - final mailboxActionsSupported = [ - MailboxActions.openInNewTab, - MailboxActions.markAsRead, - MailboxActions.move, - MailboxActions.rename, - MailboxActions.delete, - ]; - - if (mailbox.isShowDisableMailbox) { - mailboxActionsSupported.add(MailboxActions.disableMailbox); - } - - if (mailbox.isSpam) { - mailboxActionsSupported.insert( - 1, - controller.mailboxDashBoardController.enableSpamReport - ? MailboxActions.disableSpamReport - : MailboxActions.enableSpamReport); - } + final mailboxActionsSupported = controller.listActionForMailbox(mailbox); final listContextMenuItemAction = mailboxActionsSupported .map((action) => ContextMenuItemMailboxAction( diff --git a/lib/features/mailbox/presentation/model/mailbox_actions.dart b/lib/features/mailbox/presentation/model/mailbox_actions.dart index f65d657b0..9992fc01a 100644 --- a/lib/features/mailbox/presentation/model/mailbox_actions.dart +++ b/lib/features/mailbox/presentation/model/mailbox_actions.dart @@ -146,21 +146,23 @@ extension MailboxActionsExtension on MailboxActions { case MailboxActions.openInNewTab: case MailboxActions.disableSpamReport: case MailboxActions.enableSpamReport: - return ContextMenuItemState.activated; + return mailbox.isPersonal + ? ContextMenuItemState.activated + : ContextMenuItemState.deactivated; case MailboxActions.disableMailbox: return mailbox.hasRole() - ? ContextMenuItemState.deactivated - : ContextMenuItemState.activated; + ? ContextMenuItemState.deactivated + : ContextMenuItemState.activated; case MailboxActions.markAsRead: return mailbox.getCountUnReadEmails().isNotEmpty - ? ContextMenuItemState.activated - : ContextMenuItemState.deactivated; + ? ContextMenuItemState.activated + : ContextMenuItemState.deactivated; case MailboxActions.move: case MailboxActions.rename: case MailboxActions.delete: - return mailbox.hasRole() - ? ContextMenuItemState.deactivated - : ContextMenuItemState.activated; + return !mailbox.hasRole() && mailbox.isPersonal + ? ContextMenuItemState.activated + : ContextMenuItemState.deactivated; default: return ContextMenuItemState.deactivated; } 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 45521ee12..ce832b697 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -131,11 +131,7 @@ class MailBoxFolderTileBuilder { child: Opacity( opacity: _mailboxNode.isActivated ? 1.0 : 0.3, child: InkWell( - onLongPress: () { - if(_mailboxNode.item.isShowDisableMailbox || _mailboxNode.item.isSpam) { - _onLongPressMailboxFolderClick?.call(_mailboxNode); - } - }, + onLongPress: () => _onLongPressMailboxFolderClick?.call(_mailboxNode), onTap: () => allSelectMode == SelectMode.ACTIVE ? _onSelectMailboxFolderClick?.call(_mailboxNode) : _onOpenMailboxFolderClick?.call(_mailboxNode),