diff --git a/lib/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_interactor_bindings.dart b/lib/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_interactor_bindings.dart index 176e8774b..31b12c149 100644 --- a/lib/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_interactor_bindings.dart +++ b/lib/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_interactor_bindings.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/interactors_bindings.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; import 'package:tmail_ui_user/features/caching/state_cache_client.dart'; @@ -29,12 +30,12 @@ class MailboxVisibilityInteractorBindings extends InteractorsBindings { @override void bindingsDataSourceImpl() { Get.lazyPut(() => MailboxDataSourceImpl( - Get.find(), - Get.find(), - Get.find())); + Get.find(), + Get.find(), + Get.find())); Get.lazyPut(() => MailboxCacheDataSourceImpl( - Get.find(), - Get.find())); + Get.find(), + Get.find())); Get.lazyPut(() => StateDataSourceImpl(Get.find(), Get.find())); } @@ -43,6 +44,7 @@ class MailboxVisibilityInteractorBindings extends InteractorsBindings { Get.lazyPut(() => GetAllMailboxInteractor(Get.find())); Get.lazyPut(() => RefreshAllMailboxInteractor(Get.find())); Get.lazyPut(() => SubscribeMailboxInteractor(Get.find())); + Get.lazyPut(() => SubscribeMultipleMailboxInteractor(Get.find())); } @override diff --git a/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_controller.dart b/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_controller.dart index 07e9b6a05..71518ad26 100644 --- a/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_controller.dart +++ b/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_controller.dart @@ -16,12 +16,15 @@ import 'package:tmail_ui_user/features/base/base_mailbox_controller.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/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/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_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/get_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_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/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'; @@ -35,6 +38,7 @@ class MailboxVisibilityController extends BaseMailboxController { GetAllMailboxInteractor? _getAllMailboxInteractor; RefreshAllMailboxInteractor? _refreshAllMailboxInteractor; SubscribeMailboxInteractor? _subscribeMailboxInteractor; + SubscribeMultipleMailboxInteractor? _subscribeMultipleMailboxInteractor; final _accountDashBoardController = Get.find(); final _appToast = Get.find(); final _imagePaths = Get.find(); @@ -60,6 +64,7 @@ class MailboxVisibilityController extends BaseMailboxController { _getAllMailboxInteractor = Get.find(); _refreshAllMailboxInteractor = Get.find(); _subscribeMailboxInteractor = Get.find(); + _subscribeMultipleMailboxInteractor = Get.find(); } catch (e) { logError('MailboxVisibilityController::onInit(): ${e.toString()}'); } @@ -76,6 +81,10 @@ class MailboxVisibilityController extends BaseMailboxController { _refreshMailboxTreeHasSubscribed(success.mailboxList); } else if (success is SubscribeMailboxSuccess) { _subscribeMailboxSuccess(success); + } else if (success is SubscribeMultipleMailboxAllSuccess) { + _handleUnsubscribeMultipleMailboxAllSuccess(success); + } else if (success is SubscribeMultipleMailboxHasSomeSuccess) { + _handleUnsubscribeMultipleMailboxHasSomeSuccess(success); } }); @@ -123,21 +132,29 @@ class MailboxVisibilityController extends BaseMailboxController { ? MailboxSubscribeState.disabled : MailboxSubscribeState.enabled; final _mailboxSubscribeStateAction = mailboxNode.item.isSubscribedMailbox ? MailboxSubscribeAction.unSubscribe : MailboxSubscribeAction.subscribe; - if (mailboxNode.item.isSubscribedMailbox) { - _subscribeMailboxAction( - SubscribeMailboxRequest( - mailboxNode.item.id, - _mailboxSubscribeState, - _mailboxSubscribeStateAction, - ) - ); - } + _subscribeMailboxAction( + SubscribeMailboxRequest( + mailboxNode.item.id, + _mailboxSubscribeState, + _mailboxSubscribeStateAction, + ) + ); } void _subscribeMailboxAction(SubscribeMailboxRequest subscribeMailboxRequest) { final _accountId = _accountDashBoardController.accountId.value; if (_accountId != null) { - consumeState(_subscribeMailboxInteractor!.execute(_accountId, subscribeMailboxRequest)); + final subscribeRequest = generateSubscribeRequest( + subscribeMailboxRequest.mailboxId, + subscribeMailboxRequest.subscribeState, + subscribeMailboxRequest.subscribeAction + ); + + if (subscribeRequest is SubscribeMultipleMailboxRequest) { + consumeState(_subscribeMultipleMailboxInteractor!.execute(_accountId, subscribeRequest)); + } else if (subscribeRequest is SubscribeMailboxRequest) { + consumeState(_subscribeMailboxInteractor!.execute(_accountId, subscribeRequest)); + } } } @@ -167,31 +184,63 @@ class MailboxVisibilityController extends BaseMailboxController { if (subscribeMailboxSuccess.subscribeAction == MailboxSubscribeAction.unSubscribe && currentOverlayContext != null && currentContext != null) { + _showToastSubscribeMailboxSuccess(subscribeMailboxSuccess.mailboxId); + } + + refreshMailboxChanges(currentMailboxState: subscribeMailboxSuccess.currentMailboxState); + } + + void _handleUnsubscribeMultipleMailboxHasSomeSuccess(SubscribeMultipleMailboxHasSomeSuccess subscribeMailboxSuccess) { + if(subscribeMailboxSuccess.subscribeAction == MailboxSubscribeAction.unSubscribe) { + _showToastSubscribeMailboxSuccess( + subscribeMailboxSuccess.parentMailboxId, + listDescendantMailboxIds: subscribeMailboxSuccess.mailboxIdsSubscribe + ); + } + + refreshMailboxChanges(currentMailboxState: subscribeMailboxSuccess.currentMailboxState); + } + + void _handleUnsubscribeMultipleMailboxAllSuccess(SubscribeMultipleMailboxAllSuccess subscribeMailboxSuccess) { + if(subscribeMailboxSuccess.subscribeAction == MailboxSubscribeAction.unSubscribe) { + _showToastSubscribeMailboxSuccess( + subscribeMailboxSuccess.parentMailboxId, + listDescendantMailboxIds: subscribeMailboxSuccess.mailboxIdsSubscribe + ); + } + + refreshMailboxChanges(currentMailboxState: subscribeMailboxSuccess.currentMailboxState); + } + + void _showToastSubscribeMailboxSuccess( + MailboxId mailboxIdSubscribed, + {List? listDescendantMailboxIds} + ) { + if (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) - ); - }, + onActionClick: () => _subscribeMailboxAction( + SubscribeMailboxRequest( + mailboxIdSubscribed, + MailboxSubscribeState.enabled, + MailboxSubscribeAction.subscribe + ) + ), leadingIcon: SvgPicture.asset( _imagePaths.icFolderMailbox, width: 24, height: 24, color: Colors.white, - fit: BoxFit.fill), + fit: BoxFit.fill + ), backgroundColor: AppColor.toastSuccessBackgroundColor, textColor: Colors.white, textActionColor: Colors.white, actionIcon: SvgPicture.asset(_imagePaths.icUndo), - maxWidth: _responsiveUtils.getMaxWidthToast(currentContext!)); + maxWidth: _responsiveUtils.getMaxWidthToast(currentContext!) + ); } - - refreshMailboxChanges(currentMailboxState: subscribeMailboxSuccess.currentMailboxState); } } diff --git a/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart b/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart index 8bcd7762c..dde620d78 100644 --- a/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart +++ b/lib/features/manage_account/presentation/mailbox_visibility/widgets/mailbox_visibility_folder_tile_builder.dart @@ -43,29 +43,29 @@ class MailBoxVisibilityFolderTileBuilder { if (BuildUtils.isWeb) { return Theme( data: ThemeData( - splashColor: Colors.transparent, - highlightColor: Colors.transparent), + splashColor: Colors.transparent, + highlightColor: Colors.transparent), child: StatefulBuilder( - builder: (BuildContext context, StateSetter setState) { - return InkWell( - onTap: () {}, - onHover: (value) => setState(() => isHoverItem = value), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: backgroundColorItem), - padding: EdgeInsets.only( - left: _mailboxNode.item.hasRole() ? 0 : 4, - right: 4, - top: 8, - bottom: 8), - margin: const EdgeInsets.only(bottom: 4), + builder: (BuildContext context, StateSetter setState) { + return InkWell( + onTap: () {}, + onHover: (value) => setState(() => isHoverItem = value), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: backgroundColorItem), + padding: EdgeInsets.only( + left: _mailboxNode.item.hasRole() ? 0 : 4, + right: 4, + top: 8, + bottom: 8), + margin: const EdgeInsets.only(bottom: 4), child: Row( children: [ _buildLeadingMailboxItem(), const SizedBox(width: 4), Expanded(child: _buildTitleFolderItem()), - if (!_mailboxNode.item.hasRole()) + if (!_mailboxNode.item.hasRole() || !_mailboxNode.item.isSubscribedMailbox) _buildSubscribeMailboxItem(context, _mailboxNode), const SizedBox(width: 32), ]), @@ -75,30 +75,30 @@ class MailBoxVisibilityFolderTileBuilder { ); } else { return ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(14)), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: EdgeInsets.symmetric( - vertical: _mailboxNode.hasChildren() ? 8 : 15), - child: Row( - crossAxisAlignment: - _mailboxNode.item.isTeamMailboxes - ? CrossAxisAlignment.start - : CrossAxisAlignment.center, - children: [ - if (_mailboxNode.item.isTeamMailboxes) - const SizedBox(width: 16), - _buildLeadingMailboxItem(), - const SizedBox(width: 8), - Expanded(child: _buildTitleFolderItem()), - if (!_mailboxNode.item.hasRole()) - _buildSubscribeMailboxItem(context, _mailboxNode), - ]), + borderRadius: const BorderRadius.all(Radius.circular(14)), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.symmetric( + vertical: _mailboxNode.hasChildren() ? 8 : 15), + child: Row( + crossAxisAlignment: + _mailboxNode.item.isTeamMailboxes + ? CrossAxisAlignment.start + : CrossAxisAlignment.center, + children: [ + if (_mailboxNode.item.isTeamMailboxes) + const SizedBox(width: 16), + _buildLeadingMailboxItem(), + const SizedBox(width: 8), + Expanded(child: _buildTitleFolderItem()), + if (!_mailboxNode.item.hasRole() || !_mailboxNode.item.isSubscribedMailbox) + _buildSubscribeMailboxItem(context, _mailboxNode), + ]), ), - ])); + ])); } } @@ -110,14 +110,14 @@ class MailBoxVisibilityFolderTileBuilder { children: [ const SizedBox(width: 8), buildIconWeb( - icon: SvgPicture.asset( - _mailboxNode.expandMode == ExpandMode.EXPAND - ? _imagePaths.icExpandFolder - : _imagePaths.icCollapseFolder, - color: _mailboxNode.expandMode == ExpandMode.EXPAND - ? AppColor.colorExpandMailbox - : AppColor.colorCollapseMailbox, - fit: BoxFit.fill), + icon: SvgPicture.asset( + _mailboxNode.expandMode == ExpandMode.EXPAND + ? _imagePaths.icExpandFolder + : _imagePaths.icCollapseFolder, + color: _mailboxNode.expandMode == ExpandMode.EXPAND + ? AppColor.colorExpandMailbox + : AppColor.colorCollapseMailbox, + fit: BoxFit.fill), minSize: 12, splashRadius: 10, iconPadding: EdgeInsets.zero, @@ -130,8 +130,8 @@ class MailBoxVisibilityFolderTileBuilder { else SizedBox(width: _mailboxNode.item.isPersonal ? 32 : 24), Transform( - transform: Matrix4.translationValues(-4.0, 0.0, 0.0), - child: _buildLeadingIconTeamMailboxes()), + transform: Matrix4.translationValues(-4.0, 0.0, 0.0), + child: _buildLeadingIconTeamMailboxes()), ]); } else { return Row(mainAxisSize: MainAxisSize.min, children: [ @@ -234,7 +234,7 @@ class MailBoxVisibilityFolderTileBuilder { return SvgPicture.asset(_mailboxNode.item.getMailboxIcon(_imagePaths), width: BuildUtils.isWeb ? 20 : 24, height: BuildUtils.isWeb ? 20 : 24, - color: !_mailboxNode.item.isSubscribedMailbox + color: (!_mailboxNode.item.isSubscribedMailbox) ? AppColor.colorDeleteContactIcon : null, fit: BoxFit.fill);