From b2af55879000af8b30772ecf45a7df7f01d2141e Mon Sep 17 00:00:00 2001 From: HuyNguyen Date: Wed, 8 Feb 2023 11:09:29 +0700 Subject: [PATCH] TF-1311: [Presentation]: Handle show toastMsg when hide mailbox --- .../base/base_mailbox_controller.dart | 3 +- .../mailbox/data/network/mailbox_api.dart | 2 +- .../model/mailbox_subscribe_action_state.dart | 4 ++ .../model/subscribe_mailbox_request.dart | 13 +++-- .../domain/state/subscribe_mailbox_state.dart | 24 +++++++--- .../subscribe_mailbox_interactor.dart | 5 +- .../presentation/mailbox_controller.dart | 48 +++++++++++++++---- .../mailbox/presentation/mailbox_view.dart | 12 ++--- .../presentation/mailbox_view_web.dart | 2 +- .../presentation/model/mailbox_actions.dart | 5 +- .../widgets/mailbox_folder_tile_builder.dart | 30 +++++++++--- lib/main/localizations/app_localizations.dart | 6 +++ 12 files changed, 118 insertions(+), 36 deletions(-) create mode 100644 lib/features/mailbox/domain/model/mailbox_subscribe_action_state.dart diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index 61e9cd63c..589dbbd1a 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -149,7 +149,8 @@ abstract class BaseMailboxController extends BaseController { personalMailboxTree.value.root.childrenItems?.isNotEmpty ?? false; bool get teamMailboxesHasChild => - teamMailboxesTree.value.root.childrenItems?.isNotEmpty ?? false; + (teamMailboxesTree.value.root.childrenItems?.isNotEmpty ?? false ) + && !teamMailboxesTree.value.root.item.isTeamMailboxes; MailboxNode get defaultRootNode => defaultMailboxTree.value.root; diff --git a/lib/features/mailbox/data/network/mailbox_api.dart b/lib/features/mailbox/data/network/mailbox_api.dart index f90e3a27e..a8f29de67 100644 --- a/lib/features/mailbox/data/network/mailbox_api.dart +++ b/lib/features/mailbox/data/network/mailbox_api.dart @@ -295,7 +295,7 @@ class MailboxAPI with HandleSetErrorMixin { Future subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request) async { final setMailboxMethod = SetMailboxMethod(accountId) ..addUpdates({ - request.mailboxId.id : PatchObject({ + request.mailbox.id.id : PatchObject({ 'isSubscribed': request.newState == MailboxSubscribeState.disabled ? false : true }) }); diff --git a/lib/features/mailbox/domain/model/mailbox_subscribe_action_state.dart b/lib/features/mailbox/domain/model/mailbox_subscribe_action_state.dart new file mode 100644 index 000000000..0a68b883d --- /dev/null +++ b/lib/features/mailbox/domain/model/mailbox_subscribe_action_state.dart @@ -0,0 +1,4 @@ +enum MailboxSubscribeStateAction { + subscribing, + undo +} \ No newline at end of file diff --git a/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart b/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart index d0bd5eedc..ad9ec042f 100644 --- a/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart +++ b/lib/features/mailbox/domain/model/subscribe_mailbox_request.dart @@ -1,14 +1,19 @@ import 'package:equatable/equatable.dart'; -import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart'; class SubscribeMailboxRequest with EquatableMixin { - final MailboxId mailboxId; + final PresentationMailbox mailbox; final MailboxSubscribeState newState; + final MailboxSubscribeStateAction mailboxSubscribeStateAction; - SubscribeMailboxRequest(this.mailboxId, this.newState); + SubscribeMailboxRequest( + this.mailbox, + this.newState, + this.mailboxSubscribeStateAction); @override - List get props => [mailboxId, newState]; + List get props => [mailbox, newState, mailboxSubscribeStateAction]; } diff --git a/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart b/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart index 5c6e91fd3..1af1488a9 100644 --- a/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/subscribe_mailbox_state.dart @@ -1,19 +1,31 @@ import 'package:core/core.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; - +import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart'; class LoadingSubscribeMailbox extends UIState {} class SubscribeMailboxSuccess extends UIActionState { + final PresentationMailbox mailbox; + final MailboxSubscribeStateAction mailboxSubscribeStateAction; - SubscribeMailboxSuccess({ - jmap.State? currentEmailState, - jmap.State? currentMailboxState, - }) : super(currentEmailState, currentMailboxState); + SubscribeMailboxSuccess( + this.mailbox, + this.mailboxSubscribeStateAction, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override - List get props => []; + List get props => [ + mailbox, + currentEmailState, + currentMailboxState, + mailboxSubscribeStateAction + ]; } 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 7903e2470..3476416b7 100644 --- a/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart @@ -20,7 +20,10 @@ class SubscribeMailboxInteractor { final result = await _mailboxRepository.subscribeMailbox(accountId, request); if (result) { - yield Right(SubscribeMailboxSuccess(currentMailboxState: currentMailboxState)); + yield Right(SubscribeMailboxSuccess( + request.mailbox, + currentMailboxState: currentMailboxState, + request.mailboxSubscribeStateAction)); } else { yield Left(SubscribeMailboxFailure(null)); } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index b948ebcad..acfdde150 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -27,6 +27,7 @@ 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_action_state.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'; @@ -198,8 +199,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); + } else if (success is SubscribeMailboxSuccess) { + subscribeMailboxSuccess(success); } } ); @@ -1152,7 +1153,10 @@ class MailboxController extends BaseMailboxController { mailboxDashBoardController.storeSpamReportStateAction(); break; case MailboxActions.disableMailbox: - subscribeMailboxAction(mailbox); + subscribeMailboxAction(SubscribeMailboxRequest( + mailbox, + MailboxSubscribeState.disabled, + MailboxSubscribeStateAction.subscribing)); break; default: break; @@ -1223,13 +1227,41 @@ class MailboxController extends BaseMailboxController { await refreshTree(_mailboxList); } - void subscribeMailboxAction(PresentationMailbox mailboxSelected) { + void subscribeMailboxAction(SubscribeMailboxRequest subscribeMailboxRequest) { final _accountId = mailboxDashBoardController.accountId.value; if(_accountId != null) { - consumeState(_subscribeMailboxInteractor.execute(_accountId, SubscribeMailboxRequest( - mailboxSelected.id, - MailboxSubscribeState.disabled, - ))); + consumeState(_subscribeMailboxInteractor.execute( + _accountId, subscribeMailboxRequest)); } } + + void subscribeMailboxSuccess(SubscribeMailboxSuccess subscribeMailboxSuccess) { + if(subscribeMailboxSuccess.mailboxSubscribeStateAction == MailboxSubscribeStateAction.subscribing + && currentOverlayContext != null + && currentContext != null) { + _appToast.showBottomToast( + currentOverlayContext!, + AppLocalizations.of(currentContext!).toastMsgHideMailboxSuccess, + actionName: AppLocalizations.of(currentContext!).undo, + onActionClick: () { + subscribeMailboxAction(SubscribeMailboxRequest( + subscribeMailboxSuccess.mailbox, + MailboxSubscribeState.enabled, + MailboxSubscribeStateAction.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!)); + } + + refreshMailboxChanges(currentMailboxState: subscribeMailboxSuccess.currentMailboxState); + } } \ 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 be9edd265..607056d29 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -281,7 +281,7 @@ class MailboxView extends GetWidget { return Padding( padding: EdgeInsets.only( right: _responsiveUtils.isLandscapeMobile(context) ? 8 : 28, - left: 16), + left: 4), child: Row(children: [ buildIconWeb( minSize: 40, @@ -307,7 +307,7 @@ class MailboxView extends GetWidget { return Container( margin: EdgeInsets.only( - left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 16, + left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 8, right: 16), padding: const EdgeInsets.only(left: 12), child: TreeView( @@ -330,23 +330,23 @@ class MailboxView extends GetWidget { } void _openBottomSheetSpamMenuAction(BuildContext context, PresentationMailbox mailbox) { - final _spamActionsSupported = [ + final _mailboxActionsSupported = [ MailboxActions.disableMailbox ]; if (mailbox.isSpam) { - _spamActionsSupported.add(controller.mailboxDashBoardController.enableSpamReport + _mailboxActionsSupported.add(controller.mailboxDashBoardController.enableSpamReport ? MailboxActions.disableSpamReport : MailboxActions.enableSpamReport); } - final listContextSpamPopupMenuItemAction = _spamActionsSupported + final listContextMailboxPopupMenuItemAction = _mailboxActionsSupported .map((action) => ContextMenuItemMailboxAction(action, action.getContextMenuItemState(mailbox))) .toList(); controller.openContextMenuAction( context, - _bottomSheetIdentityActionTiles(context, mailbox, listContextSpamPopupMenuItemAction)); + _bottomSheetIdentityActionTiles(context, mailbox, listContextMailboxPopupMenuItemAction)); } List _bottomSheetIdentityActionTiles( diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index a75d52567..c0ff3f1cc 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -457,7 +457,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu MailboxActions.delete, ]; - if(mailbox.isShowDisableMailbox) { + if (mailbox.isShowDisableMailbox) { mailboxActionsSupported.add(MailboxActions.disableMailbox); } diff --git a/lib/features/mailbox/presentation/model/mailbox_actions.dart b/lib/features/mailbox/presentation/model/mailbox_actions.dart index 81070f22a..f65d657b0 100644 --- a/lib/features/mailbox/presentation/model/mailbox_actions.dart +++ b/lib/features/mailbox/presentation/model/mailbox_actions.dart @@ -146,8 +146,11 @@ extension MailboxActionsExtension on MailboxActions { case MailboxActions.openInNewTab: case MailboxActions.disableSpamReport: case MailboxActions.enableSpamReport: - case MailboxActions.disableMailbox: return ContextMenuItemState.activated; + case MailboxActions.disableMailbox: + return mailbox.hasRole() + ? ContextMenuItemState.deactivated + : ContextMenuItemState.activated; case MailboxActions.markAsRead: return mailbox.getCountUnReadEmails().isNotEmpty ? ContextMenuItemState.activated 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 67ce3a61d..98cea9690 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -103,7 +103,11 @@ class MailBoxFolderTileBuilder { decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: backgroundColorItem), - padding: const EdgeInsets.only(left: 4, right: 4, top: 8, bottom: 8), + padding: EdgeInsets.only( + left: _mailboxNode.item.hasRole() ? 0 : 4, + right: 4, + top: 8, + bottom: 8), margin: const EdgeInsets.only(bottom: 4), child: Row( crossAxisAlignment: _mailboxNode.item.isTeamMailboxes @@ -195,6 +199,18 @@ class MailBoxFolderTileBuilder { } } + // double _buildSizedBoxWhenHasNotChildren() { + // if (_mailboxNode.item.hasRole()) { + // if (!_mailboxNode.item.hasParentId()) { + // return 32; + // } else { + // return 8; + // } + // } else { + // return 32; + // } + // } + Widget _buildLeadingMailboxItem() { if (BuildUtils.isWeb) { if (mailboxDisplayed == MailboxDisplayed.mailbox) { @@ -202,7 +218,7 @@ class MailBoxFolderTileBuilder { if (_mailboxNode.hasChildren()) Row( children: [ - SizedBox(width: _mailboxNode.item.hasRole() ? 0 : 8), + const SizedBox(width: 8), buildIconWeb( icon: SvgPicture.asset( _mailboxNode.expandMode == ExpandMode.EXPAND @@ -222,7 +238,7 @@ class MailBoxFolderTileBuilder { ], ) else - SizedBox(width: !_mailboxNode.item.hasRole() ? 32 : 24), + const SizedBox(width: 32), Transform( transform: Matrix4.translationValues(-4.0, 0.0, 0.0), child: _buildLeadingIcon()), @@ -236,7 +252,7 @@ class MailBoxFolderTileBuilder { if (_mailboxNode.hasChildren()) Row( children: [ - const SizedBox(width: 12), + SizedBox(width: _mailboxNode.item.hasRole() ? 0 : 0), buildIconWeb( icon: SvgPicture.asset( _mailboxNode.expandMode == ExpandMode.EXPAND @@ -256,7 +272,7 @@ class MailBoxFolderTileBuilder { ], ) else - const SizedBox(width: 36), + const SizedBox(width: 24), _buildLeadingIcon(), ]); } else { @@ -335,7 +351,7 @@ class MailBoxFolderTileBuilder { } Widget _buildLeadingIconTeamMailboxes() { - if(!_mailboxNode.item.isPersonal) { + if (!_mailboxNode.item.isPersonal) { return _buildLeadingIconForChildOfTeamMailboxes(); } else { return _buildMailboxIcon(); @@ -343,7 +359,7 @@ class MailBoxFolderTileBuilder { } Widget _buildLeadingIconForChildOfTeamMailboxes() { - if(_mailboxNode.item.hasParentId()) { + if (_mailboxNode.item.hasParentId()) { return _buildMailboxIcon(); } else { return const SizedBox(); diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 94eafd9e0..d45b14989 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -2779,4 +2779,10 @@ class AppLocalizations { name: 'thisImageCannotBeAdded' ); } + + String get toastMsgHideMailboxSuccess { + return Intl.message( + 'This mailbox has been hidden from your primary mailbox', + name: 'toastMsgHideMailboxSuccess'); + } } \ No newline at end of file