TF-1311: [Presentation] Implement hide mailbox in presentation

This commit is contained in:
HuyNguyen
2023-02-07 13:23:33 +07:00
committed by Dat Vu
parent 2f3b1b6a87
commit 6f32bf4ba3
11 changed files with 102 additions and 43 deletions
@@ -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
})
});
@@ -1,13 +1,4 @@
enum MailboxSubscribeState {
enabled,
disabled;
String get keyValue {
switch(this) {
case MailboxSubscribeState.enabled:
return 'enabled';
case MailboxSubscribeState.disabled:
return 'disabled';
}
}
disabled
}
@@ -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<Object?> get props => [subscribeMailbox];
List<Object?> get props => [];
}
class SubscribeMailboxFailure extends FeatureFailure {
@@ -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<Either<Failure, Success>> execute(AccountId accountId, SubscribeMailboxRequest request) async* {
try {
yield Right<Failure, Success>(LoadingSubscribeMailbox());
final resultList = await _mailboxRepository.subscribeMailbox(accountId, request);
final currentMailboxState = await _mailboxRepository.getMailboxState();
final result = await _mailboxRepository.subscribeMailbox(accountId, request);
if (result) {
yield Right<Failure, Success>(SubscribeMailboxSuccess(currentMailboxState: currentMailboxState));
} else {
yield Left<Failure, Success>(SubscribeMailboxFailure(null));
}
yield Right<Failure, Success>(SubscribeMailboxSuccess(resultList));
} catch (exception) {
yield Left<Failure, Success>(SubscribeMailboxFailure(exception));
}
@@ -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<VerifyNameInteractor>(),
Get.find<RenameMailboxInteractor>(),
Get.find<MoveMailboxInteractor>(),
Get.find<SubscribeMailboxInteractor>(),
Get.find<TreeBuilder>(),
));
}
@@ -96,6 +98,7 @@ class MailboxBindings extends BaseBindings {
Get.lazyPut(() => VerifyNameInteractor());
Get.lazyPut(() => RenameMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => MoveMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => SubscribeMailboxInteractor(Get.find<MailboxRepository>()));
}
@override
@@ -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 = <PresentationMailbox>[].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<PresentationMailbox> 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,
)));
}
}
}
@@ -331,11 +331,15 @@ class MailboxView extends GetWidget<MailboxController> {
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<MailboxController> {
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<MailboxController> {
).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())
@@ -205,14 +205,22 @@ class MailboxView extends GetWidget<MailboxController> 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<MailboxController> 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,
@@ -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
@@ -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<PresentationEmail>, 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<List<PresentationEmail>>(
@@ -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 {
@@ -101,6 +101,8 @@ class PresentationMailbox with EquatableMixin {
(namespace?.value.indexOf('[') ?? 0) + 1,
namespace?.value.indexOf(']'));
bool get isShowDisableMailbox => isTeamMailboxes || hasRole() || !hasParentId();
@override
List<Object?> get props => [
id,