diff --git a/lib/features/mailbox/data/network/mailbox_api.dart b/lib/features/mailbox/data/network/mailbox_api.dart index 4b9d5b286..f90e3a27e 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -296,7 +296,7 @@ class MailboxAPI with HandleSetErrorMixin { final setMailboxMethod = SetMailboxMethod(accountId) ..addUpdates({ request.mailboxId.id : PatchObject({ - 'isSubscribed': request.newState == MailboxSubscribeState.disabled ? true : false + 'isSubscribed': request.newState == MailboxSubscribeState.disabled ? false : true }) }); diff --git a/lib/features/mailbox/domain/model/mailbox_subscribe_state.dart b/lib/features/mailbox/domain/model/mailbox_subscribe_state.dart index a68b043b8..6d775c4f2 100644 --- a/lib/features/mailbox/domain/model/mailbox_subscribe_state.dart +++ b/lib/features/mailbox/domain/model/mailbox_subscribe_state.dart @@ -1,13 +1,4 @@ enum MailboxSubscribeState { enabled, - disabled; - - String get keyValue { - switch(this) { - case MailboxSubscribeState.enabled: - return 'enabled'; - case MailboxSubscribeState.disabled: - return 'disabled'; - } - } + disabled } \ No newline at end of file diff --git a/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart b/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart index ca04eeb34..5c6e91fd3 100644 --- a/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart @@ -1,15 +1,19 @@ import 'package:core/core.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; + class LoadingSubscribeMailbox extends UIState {} -class SubscribeMailboxSuccess extends UIState { +class SubscribeMailboxSuccess extends UIActionState { - final bool subscribeMailbox; - - SubscribeMailboxSuccess(this.subscribeMailbox); + SubscribeMailboxSuccess({ + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + }) : super(currentEmailState, currentMailboxState); @override - List get props => [subscribeMailbox]; + List get props => []; } class SubscribeMailboxFailure extends FeatureFailure { diff --git a/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart index 5b5d04bcc..7903e2470 100644 --- a/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart @@ -6,18 +6,25 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_re import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_mailbox_state.dart'; -class SearchMailboxInteractor { +class SubscribeMailboxInteractor { final MailboxRepository _mailboxRepository; - SearchMailboxInteractor(this._mailboxRepository); + SubscribeMailboxInteractor(this._mailboxRepository); Stream> execute(AccountId accountId, SubscribeMailboxRequest request) async* { try { yield Right(LoadingSubscribeMailbox()); - final resultList = await _mailboxRepository.subscribeMailbox(accountId, request); + final currentMailboxState = await _mailboxRepository.getMailboxState(); + + final result = await _mailboxRepository.subscribeMailbox(accountId, request); + + if (result) { + yield Right(SubscribeMailboxSuccess(currentMailboxState: currentMailboxState)); + } else { + yield Left(SubscribeMailboxFailure(null)); + } - yield Right(SubscribeMailboxSuccess(resultList)); } catch (exception) { yield Left(SubscribeMailboxFailure(exception)); } diff --git a/lib/features/mailbox/presentation/mailbox_bindings.dart b/lib/features/mailbox/presentation/mailbox_bindings.dart index 942150ab7..d00a210b5 100644 --- a/lib/features/mailbox/presentation/mailbox_bindings.dart +++ b/lib/features/mailbox/presentation/mailbox_bindings.dart @@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_inte import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart'; 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/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'; @@ -55,6 +56,7 @@ class MailboxBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), Get.find(), )); } @@ -96,6 +98,7 @@ class MailboxBindings extends BaseBindings { Get.lazyPut(() => VerifyNameInteractor()); Get.lazyPut(() => RenameMailboxInteractor(Get.find())); Get.lazyPut(() => MoveMailboxInteractor(Get.find())); + Get.lazyPut(() => SubscribeMailboxInteractor(Get.find())); } @override diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 467f46063..b948ebcad 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -27,8 +27,10 @@ import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart'; 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/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'; @@ -37,6 +39,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.d import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart'; 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/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'; @@ -44,6 +47,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_inte import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart'; 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/presentation/action/mailbox_ui_action.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart'; @@ -92,6 +96,7 @@ class MailboxController extends BaseMailboxController { final VerifyNameInteractor _verifyNameInteractor; final RenameMailboxInteractor _renameMailboxInteractor; final MoveMailboxInteractor _moveMailboxInteractor; + final SubscribeMailboxInteractor _subscribeMailboxInteractor; final listMailboxSearched = [].obs; final searchState = SearchState.initial().obs; @@ -118,6 +123,7 @@ class MailboxController extends BaseMailboxController { this._verifyNameInteractor, this._renameMailboxInteractor, this._moveMailboxInteractor, + this._subscribeMailboxInteractor, treeBuilder, ) : super(treeBuilder); @@ -156,7 +162,7 @@ class MailboxController extends BaseMailboxController { _buildMailboxTreeHasSubscribed(success.mailboxList); } else if (success is RefreshChangesAllMailboxSuccess) { _currentMailboxState = success.currentMailboxState; - await refreshTree(success.mailboxList); + _refreshMailboxTreeHasSubscribed(success.mailboxList); } }); } @@ -192,6 +198,8 @@ class MailboxController extends BaseMailboxController { refreshMailboxChanges(currentMailboxState: success.currentMailboxState); } else if (success is MoveMailboxSuccess) { _moveMailboxSuccess(success); + } else if (success is SubscribeMailboxSuccess){ + refreshMailboxChanges(currentMailboxState: success.currentMailboxState); } } ); @@ -1142,7 +1150,10 @@ class MailboxController extends BaseMailboxController { case MailboxActions.disableSpamReport: case MailboxActions.enableSpamReport: mailboxDashBoardController.storeSpamReportStateAction(); - return; + break; + case MailboxActions.disableMailbox: + subscribeMailboxAction(mailbox); + break; default: break; } @@ -1206,4 +1217,19 @@ class MailboxController extends BaseMailboxController { final _mailboxList = mailboxList.where((mailbox) => mailbox.isSubscribed?.value == true).toList(); await buildTree(_mailboxList); } + + void _refreshMailboxTreeHasSubscribed(List mailboxList) async { + final _mailboxList = mailboxList.where((mailbox) => mailbox.isSubscribed?.value == true).toList(); + await refreshTree(_mailboxList); + } + + void subscribeMailboxAction(PresentationMailbox mailboxSelected) { + final _accountId = mailboxDashBoardController.accountId.value; + if(_accountId != null) { + consumeState(_subscribeMailboxInteractor.execute(_accountId, SubscribeMailboxRequest( + mailboxSelected.id, + MailboxSubscribeState.disabled, + ))); + } + } } \ 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 3036f4955..be9edd265 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -331,11 +331,15 @@ class MailboxView extends GetWidget { void _openBottomSheetSpamMenuAction(BuildContext context, PresentationMailbox mailbox) { final _spamActionsSupported = [ - controller.mailboxDashBoardController.enableSpamReport - ? MailboxActions.disableSpamReport - : MailboxActions.enableSpamReport + MailboxActions.disableMailbox ]; + if (mailbox.isSpam) { + _spamActionsSupported.add(controller.mailboxDashBoardController.enableSpamReport + ? MailboxActions.disableSpamReport + : MailboxActions.enableSpamReport); + } + final listContextSpamPopupMenuItemAction = _spamActionsSupported .map((action) => ContextMenuItemMailboxAction(action, action.getContextMenuItemState(mailbox))) .toList(); @@ -381,6 +385,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)) ..addOnOpenMailboxFolderClick((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) ..addOnExpandFolderActionClick((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) ..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode))) @@ -389,7 +394,7 @@ class MailboxView extends GetWidget { ).build() : Obx(() => (MailBoxFolderTileBuilder(context, _imagePaths, mailboxNode, lastNode: lastNode, allSelectMode: controller.currentSelectMode.value) - ..addOnLongPressSpamReport((mailboxNode) => _openBottomSheetSpamMenuAction(context, mailboxNode.item)) + ..addOnLongPressMailboxFolderClick((mailboxNode) => _openBottomSheetSpamMenuAction(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 ef3a34992..a75d52567 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -205,14 +205,22 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu ]), ), const SizedBox(height: 8), - _buildHeaderMailboxCategory(context, MailboxCategories.personalMailboxes), Obx(() => controller.personalMailboxHasChild - ? _buildMailboxCategory(context, MailboxCategories.personalMailboxes, controller.personalRootNode) + ? Column( + children: [ + _buildHeaderMailboxCategory(context, MailboxCategories.personalMailboxes), + _buildMailboxCategory(context, MailboxCategories.personalMailboxes, controller.personalRootNode), + ], + ) : const SizedBox.shrink()), const SizedBox(height: 8), - _buildHeaderMailboxCategory(context, MailboxCategories.teamMailboxes), Obx(() => controller.teamMailboxesHasChild - ? _buildMailboxCategory(context, MailboxCategories.teamMailboxes, controller.teamMailboxesRootNode) + ? Column( + children: [ + _buildHeaderMailboxCategory(context, MailboxCategories.teamMailboxes), + _buildMailboxCategory(context, MailboxCategories.teamMailboxes, controller.teamMailboxesRootNode), + ], + ) : const SizedBox.shrink()), ]) ), @@ -446,9 +454,13 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu MailboxActions.markAsRead, MailboxActions.move, MailboxActions.rename, - MailboxActions.delete + MailboxActions.delete, ]; + if(mailbox.isShowDisableMailbox) { + mailboxActionsSupported.add(MailboxActions.disableMailbox); + } + if (mailbox.isSpam) { mailboxActionsSupported.insert( 1, diff --git a/lib/features/mailbox/presentation/model/mailbox_actions.dart b/lib/features/mailbox/presentation/model/mailbox_actions.dart index 9d15554f2..81070f22a 100644 --- a/lib/features/mailbox/presentation/model/mailbox_actions.dart +++ b/lib/features/mailbox/presentation/model/mailbox_actions.dart @@ -16,7 +16,8 @@ enum MailboxActions { selectForRuleAction, openInNewTab, disableSpamReport, - enableSpamReport + enableSpamReport, + disableMailbox } extension MailboxActionsExtension on MailboxActions { @@ -52,6 +53,8 @@ extension MailboxActionsExtension on MailboxActions { return AppLocalizations.of(context).rename_mailbox; case MailboxActions.delete: return AppLocalizations.of(context).deleteMailbox; + case MailboxActions.disableMailbox: + return AppLocalizations.of(context).hideMailBoxes; default: return ''; } @@ -73,6 +76,8 @@ extension MailboxActionsExtension on MailboxActions { return imagePaths.icRenameMailbox; case MailboxActions.delete: return imagePaths.icDelete; + case MailboxActions.disableMailbox: + return imagePaths.icEyeOff; default: return ''; } @@ -93,6 +98,7 @@ extension MailboxActionsExtension on MailboxActions { return AppColor.colorActionDeleteConfirmDialog; case MailboxActions.disableSpamReport: case MailboxActions.enableSpamReport: + case MailboxActions.disableMailbox: return AppColor.primaryColor; default: return Colors.black; @@ -140,6 +146,7 @@ extension MailboxActionsExtension on MailboxActions { case MailboxActions.openInNewTab: case MailboxActions.disableSpamReport: case MailboxActions.enableSpamReport: + case MailboxActions.disableMailbox: return ContextMenuItemState.activated; case MailboxActions.markAsRead: return mailbox.getCountUnReadEmails().isNotEmpty 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 a24d3bf24..67ce3a61d 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -15,7 +15,7 @@ typedef OnOpenMailboxFolderClick = void Function(MailboxNode); typedef OnSelectMailboxFolderClick = void Function(MailboxNode); typedef OnMenuActionClick = void Function(RelativeRect, MailboxNode); typedef OnDragItemAccepted = void Function(List, PresentationMailbox); -typedef OnLongPressSpamReport = void Function(MailboxNode); +typedef OnLongPressMailboxFolderClick = void Function(MailboxNode); class MailBoxFolderTileBuilder { @@ -36,7 +36,7 @@ class MailBoxFolderTileBuilder { OnSelectMailboxFolderClick? _onSelectMailboxFolderClick; OnMenuActionClick? _onMenuActionClick; OnDragItemAccepted? _onDragItemAccepted; - OnLongPressSpamReport? _onLongPressSpamReport; + OnLongPressMailboxFolderClick? _onLongPressMailboxFolderClick; bool isHoverItem = false; @@ -74,8 +74,8 @@ class MailBoxFolderTileBuilder { _onDragItemAccepted = onDragItemAccepted; } - void addOnLongPressSpamReport(OnLongPressSpamReport onLongPressSpamReport) { - _onLongPressSpamReport = onLongPressSpamReport; + void addOnLongPressMailboxFolderClick(OnLongPressMailboxFolderClick onLongPressMailboxFolderClick) { + _onLongPressMailboxFolderClick = onLongPressMailboxFolderClick; } Widget build() => DragTarget>( @@ -127,9 +127,11 @@ class MailBoxFolderTileBuilder { child: Opacity( opacity: _mailboxNode.isActivated ? 1.0 : 0.3, child: InkWell( - onLongPress: _mailboxNode.item.isSpam ? () { - _onLongPressSpamReport?.call(_mailboxNode); - } : null, + onLongPress: () { + if(_mailboxNode.item.isShowDisableMailbox || _mailboxNode.item.isSpam) { + _onLongPressMailboxFolderClick?.call(_mailboxNode); + } + }, onTap: () => allSelectMode == SelectMode.ACTIVE ? _onSelectMailboxFolderClick?.call(_mailboxNode) : _onOpenMailboxFolderClick?.call(_mailboxNode), @@ -170,6 +172,7 @@ class MailBoxFolderTileBuilder { child: Material( color: Colors.transparent, child: InkWell( + onLongPress: () => print('123'), onTap: () => _onOpenMailboxFolderClick?.call(_mailboxNode), child: Container( padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 24), @@ -199,7 +202,7 @@ class MailBoxFolderTileBuilder { if (_mailboxNode.hasChildren()) Row( children: [ - const SizedBox(width: 8), + SizedBox(width: _mailboxNode.item.hasRole() ? 0 : 8), buildIconWeb( icon: SvgPicture.asset( _mailboxNode.expandMode == ExpandMode.EXPAND @@ -216,11 +219,10 @@ class MailBoxFolderTileBuilder { ? AppLocalizations.of(_context).collapse : AppLocalizations.of(_context).expand, onTap: () => _onExpandFolderActionClick?.call(_mailboxNode)), - const SizedBox(width: 4), ], ) else - SizedBox(width:_mailboxNode.item.hasRole() ? 0 : 24), + SizedBox(width: !_mailboxNode.item.hasRole() ? 32 : 24), Transform( transform: Matrix4.translationValues(-4.0, 0.0, 0.0), child: _buildLeadingIcon()), @@ -254,7 +256,7 @@ class MailBoxFolderTileBuilder { ], ) else - SizedBox(width: _mailboxNode.item.hasRole() ? 0 : 36), + const SizedBox(width: 36), _buildLeadingIcon(), ]); } else { diff --git a/model/lib/mailbox/presentation_mailbox.dart b/model/lib/mailbox/presentation_mailbox.dart index a40e35805..68a2f64ee 100644 --- a/model/lib/mailbox/presentation_mailbox.dart +++ b/model/lib/mailbox/presentation_mailbox.dart @@ -101,6 +101,8 @@ class PresentationMailbox with EquatableMixin { (namespace?.value.indexOf('[') ?? 0) + 1, namespace?.value.indexOf(']')); + bool get isShowDisableMailbox => isTeamMailboxes || hasRole() || !hasParentId(); + @override List get props => [ id,