From 5016f891c7e931f38e619a4b7f8f2257816fad39 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 4 May 2023 17:01:55 +0700 Subject: [PATCH] TF-1792 Add option `EmptyTrash` for mailbox menu (cherry picked from commit 9c7a2c465e57d19d80f33a9cb916923f177ae129) --- .../mixin/mailbox_action_handler_mixin.dart | 49 +++++++++++++++++++ .../presentation/mailbox_controller.dart | 3 ++ .../mixin/mailbox_widget_mixin.dart | 4 +- .../presentation/model/mailbox_actions.dart | 8 ++- .../mailbox_dashboard_controller.dart | 6 +-- lib/main/localizations/app_localizations.dart | 12 +++++ 6 files changed, 77 insertions(+), 5 deletions(-) diff --git a/lib/features/base/mixin/mailbox_action_handler_mixin.dart b/lib/features/base/mixin/mailbox_action_handler_mixin.dart index ec629da2e..da5d3eea5 100644 --- a/lib/features/base/mixin/mailbox_action_handler_mixin.dart +++ b/lib/features/base/mixin/mailbox_action_handler_mixin.dart @@ -1,8 +1,16 @@ +import 'package:core/core.dart'; +import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart'; mixin MailboxActionHandlerMixin { @@ -36,4 +44,45 @@ mixin MailboxActionHandlerMixin { onCallbackAction?.call(context); } } + + void emptyTrashAction( + BuildContext context, + MailboxId mailboxId, + MailboxDashBoardController dashboardController + ) { + final responsiveUtils = Get.find(); + final imagePaths = Get.find(); + + if (responsiveUtils.isScreenWithShortestSide(context)) { + (ConfirmationDialogActionSheetBuilder(context) + ..messageText(AppLocalizations.of(context).emptyTrashMessageDialog) + ..onCancelAction(AppLocalizations.of(context).cancel, popBack) + ..onConfirmAction(AppLocalizations.of(context).delete, () { + popBack(); + dashboardController.emptyTrashFolderAction(trashFolderId: mailboxId); + })) + .show(); + } else { + showDialog( + context: context, + barrierColor: AppColor.colorDefaultCupertinoActionSheet, + builder: (context) => PointerInterceptor(child: (ConfirmDialogBuilder(imagePaths) + ..key(const Key('confirm_dialog_empty_trash')) + ..title(AppLocalizations.of(context).emptyTrash) + ..content(AppLocalizations.of(context).emptyTrashMessageDialog) + ..addIcon(SvgPicture.asset(imagePaths.icRemoveDialog, fit: BoxFit.fill)) + ..colorConfirmButton(AppColor.colorConfirmActionDialog) + ..styleTextConfirmButton(const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w500, + color: AppColor.colorActionDeleteConfirmDialog)) + ..onCloseButtonAction(popBack) + ..onConfirmButtonAction(AppLocalizations.of(context).delete, () { + popBack(); + dashboardController.emptyTrashFolderAction(trashFolderId: mailboxId); + }) + ..onCancelButtonAction(AppLocalizations.of(context).cancel, popBack)) + .build())); + } + } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 6664c884b..eba944adc 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -939,6 +939,9 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM case MailboxActions.disableMailbox: _unsubscribeMailboxAction(mailbox.id); break; + case MailboxActions.emptyTrash: + emptyTrashAction(context, mailbox.id, mailboxDashBoardController); + break; default: break; } diff --git a/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart b/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart index f197627c2..9b207beb7 100644 --- a/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart +++ b/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart @@ -39,7 +39,9 @@ mixin MailboxWidgetMixin { if (mailbox.isSpam) _mailboxActionForSpam(spamReportEnabled), if (mailbox.getCountUnReadEmails().isNotEmpty) - MailboxActions.markAsRead + MailboxActions.markAsRead, + if (mailbox.isTrash) + MailboxActions.emptyTrash ]; } diff --git a/lib/features/mailbox/presentation/model/mailbox_actions.dart b/lib/features/mailbox/presentation/model/mailbox_actions.dart index f607f3d88..a847b7124 100644 --- a/lib/features/mailbox/presentation/model/mailbox_actions.dart +++ b/lib/features/mailbox/presentation/model/mailbox_actions.dart @@ -18,7 +18,8 @@ enum MailboxActions { disableSpamReport, enableSpamReport, disableMailbox, - enableMailbox + enableMailbox, + emptyTrash; } extension MailboxActionsExtension on MailboxActions { @@ -58,6 +59,8 @@ extension MailboxActionsExtension on MailboxActions { return AppLocalizations.of(context).hideMailBoxes; case MailboxActions.enableMailbox: return AppLocalizations.of(context).showMailbox; + case MailboxActions.emptyTrash: + return AppLocalizations.of(context).emptyTrash; default: return ''; } @@ -83,6 +86,8 @@ extension MailboxActionsExtension on MailboxActions { return imagePaths.icHideMailbox; case MailboxActions.enableMailbox: return imagePaths.icShowMailbox; + case MailboxActions.emptyTrash: + return imagePaths.icMailboxTrash; default: return ''; } @@ -152,6 +157,7 @@ extension MailboxActionsExtension on MailboxActions { case MailboxActions.move: case MailboxActions.rename: case MailboxActions.delete: + case MailboxActions.emptyTrash: return ContextMenuItemState.activated; case MailboxActions.markAsRead: return mailbox.getCountUnReadEmails().isNotEmpty diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 8b6c78a6f..358214410 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1076,7 +1076,7 @@ class MailboxDashBoardController extends ReloadableController { switch(actionType) { case DeleteActionType.all: - _emptyTrashFolderAction(onCancelSelectionEmail: onCancelSelectionEmail); + emptyTrashFolderAction(onCancelSelectionEmail: onCancelSelectionEmail); break; case DeleteActionType.multiple: _deleteMultipleEmailsPermanently(listEmails ?? [], onCancelSelectionEmail: onCancelSelectionEmail); @@ -1086,10 +1086,10 @@ class MailboxDashBoardController extends ReloadableController { } } - void _emptyTrashFolderAction({Function? onCancelSelectionEmail}) { + void emptyTrashFolderAction({Function? onCancelSelectionEmail, MailboxId? trashFolderId}) { onCancelSelectionEmail?.call(); - final trashMailboxId = mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash]; + final trashMailboxId = trashFolderId ?? mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash]; if (sessionCurrent != null && accountId.value != null && trashMailboxId != null) { consumeState(_emptyTrashFolderInteractor.execute(sessionCurrent!, accountId.value!, trashMailboxId)); } diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index c67ca4a01..6a0785862 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -2851,4 +2851,16 @@ class AppLocalizations { 'Replied and Forwarded message', name: 'repliedAndForwardedMessage'); } + + String get emptyTrash { + return Intl.message( + 'Empty Trash', + name: 'emptyTrash'); + } + + String get emptyTrashMessageDialog { + return Intl.message( + 'You are about to permanently delete all items in Trash . Do you want to continue?', + name: 'emptyTrashMessageDialog'); + } } \ No newline at end of file