From f44118af48952a2d589e00a7049d59b2219a2c4c Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 5 Aug 2025 16:25:02 +0700 Subject: [PATCH] TF-3939 Handle archive selection email on mobile view Signed-off-by: dab246 --- .../email_action_type_extension.dart | 1 + .../data/exceptions/session_exceptions.dart | 4 +- .../mailbox_dashboard_controller.dart | 195 +++++++----------- ...andle_action_type_for_email_selection.dart | 107 ++++++++++ .../presentation/search_email_controller.dart | 17 +- .../move_multiple_email_to_mailbox_state.dart | 6 - ..._multiple_email_to_mailbox_interactor.dart | 2 - .../mixin/email_action_controller.dart | 35 +++- .../presentation/thread_controller.dart | 26 +-- lib/l10n/intl_messages.arb | 6 + lib/main/localizations/app_localizations.dart | 7 + lib/main/utils/toast_manager.dart | 8 + .../presentation_email_extension.dart | 4 + 13 files changed, 240 insertions(+), 178 deletions(-) create mode 100644 lib/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart diff --git a/lib/features/composer/presentation/extensions/email_action_type_extension.dart b/lib/features/composer/presentation/extensions/email_action_type_extension.dart index ceb948f84..fb84d708c 100644 --- a/lib/features/composer/presentation/extensions/email_action_type_extension.dart +++ b/lib/features/composer/presentation/extensions/email_action_type_extension.dart @@ -44,6 +44,7 @@ extension EmailActionTypeExtension on EmailActionType { String getToastMessageMoveToMailboxSuccess(BuildContext context, {String? destinationPath}) { switch(this) { + case EmailActionType.archiveMessage: case EmailActionType.moveToMailbox: return AppLocalizations.of(context).movedToFolder(destinationPath ?? ''); case EmailActionType.moveToTrash: diff --git a/lib/features/home/data/exceptions/session_exceptions.dart b/lib/features/home/data/exceptions/session_exceptions.dart index a3a2cc485..2e5b49b40 100644 --- a/lib/features/home/data/exceptions/session_exceptions.dart +++ b/lib/features/home/data/exceptions/session_exceptions.dart @@ -3,4 +3,6 @@ class NotFoundSessionException implements Exception {} class NotFoundAccountIdException implements Exception {} -class NotFoundContextException implements Exception {} \ No newline at end of file +class NotFoundContextException implements Exception {} + +class ParametersIsNullException implements Exception {} \ No newline at end of file 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 d0f187384..add07afc0 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -113,6 +113,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/cleanup_recent_search_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_clear_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_create_new_rule_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_preferences_setting_extension.dart'; @@ -1263,16 +1264,16 @@ class MailboxDashBoardController extends ReloadableController } } - void moveSelectedMultipleEmailToMailbox( - List listEmails, - PresentationMailbox currentMailbox - ) async { + Future moveEmailsToMailbox( + List listEmails, { + VoidCallback? onCallbackAction, + }) async { if (accountId.value != null) { final arguments = DestinationPickerArguments( accountId.value!, MailboxActions.moveEmail, sessionCurrent, - mailboxIdSelected: currentMailbox.mailboxId); + ); final destinationMailbox = PlatformInfo.isWeb ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments) @@ -1283,61 +1284,44 @@ class MailboxDashBoardController extends ReloadableController sessionCurrent != null && accountId.value != null ) { - _dispatchMoveToMultipleAction( - accountId.value!, - sessionCurrent!, - listEmails.listEmailIds, - currentMailbox, - destinationMailbox, - Map.fromEntries( - listEmails - .where((email) => email.id != null) - .map((email) => MapEntry(email.id!, email.hasRead)), - ), - ); - } - } - } + onCallbackAction?.call(); - void _dispatchMoveToMultipleAction( - AccountId accountId, - Session session, - List listEmailIds, - PresentationMailbox currentMailbox, - PresentationMailbox destinationMailbox, - Map emailIdsWithReadStatus, - ) { - if (destinationMailbox.isTrash) { - _moveSelectedEmailMultipleToMailboxAction( - session, - accountId, - MoveToMailboxRequest( - {currentMailbox.id: listEmailIds}, - destinationMailbox.id, - MoveAction.moving, - EmailActionType.moveToTrash), - emailIdsWithReadStatus); - } else if (destinationMailbox.isSpam) { - _moveSelectedEmailMultipleToMailboxAction( - session, - accountId, - MoveToMailboxRequest( - {currentMailbox.id: listEmailIds}, - destinationMailbox.id, - MoveAction.moving, - EmailActionType.moveToSpam), - emailIdsWithReadStatus); + if (destinationMailbox.isTrash) { + moveEmailsToFolder( + listEmails, + EmailActionType.moveToTrash, + selectedMailboxId: destinationMailbox.id, + ); + } else if (destinationMailbox.isSpam) { + moveEmailsToFolder( + listEmails, + EmailActionType.moveToSpam, + selectedMailboxId: destinationMailbox.id, + ); + } else if (destinationMailbox.isArchive) { + moveEmailsToFolder( + listEmails, + EmailActionType.archiveMessage, + selectedMailboxId: destinationMailbox.id, + ); + } else { + moveEmailsToFolder( + listEmails, + EmailActionType.moveToMailbox, + selectedMailboxId: destinationMailbox.id, + destinationFolderPath: destinationMailbox.mailboxPath, + ); + } + } } else { - _moveSelectedEmailMultipleToMailboxAction( - session, - accountId, - MoveToMailboxRequest( - {currentMailbox.id: listEmailIds}, - destinationMailbox.id, - MoveAction.moving, + onCallbackAction?.call(); + consumeState( + Stream.value(Left(MoveMultipleEmailToMailboxFailure( EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath), - emailIdsWithReadStatus); + MoveAction.moving, + ParametersIsNullException(), + ))), + ); } } @@ -1424,7 +1408,7 @@ class MailboxDashBoardController extends ReloadableController dispatchAction(CancelSelectionAllEmailAction()); } - void _moveSelectedEmailMultipleToMailboxAction( + void moveSelectedEmailMultipleToMailboxAction( Session session, AccountId accountId, MoveToMailboxRequest moveRequest, @@ -1446,34 +1430,52 @@ class MailboxDashBoardController extends ReloadableController MoveAction? moveAction; EmailActionType? emailActionType; Map? emailIdsWithReadStatus; + bool isUndoActionEnabled = false; if (success is MoveMultipleEmailToMailboxAllSuccess) { destinationPath = success.destinationPath; movedEmailIds = success.movedListEmailId; - currentMailboxId = success.currentMailboxId; + currentMailboxId = success.originalMailboxIdsWithEmailIds.keys.firstOrNull; destinationMailboxId = success.destinationMailboxId; moveAction = success.moveAction; emailActionType = success.emailActionType; emailIdsWithReadStatus = success.emailIdsWithReadStatus; + isUndoActionEnabled = success.originalMailboxIdsWithEmailIds.length == 1; } else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) { destinationPath = success.destinationPath; movedEmailIds = success.movedListEmailId; - currentMailboxId = success.currentMailboxId; + currentMailboxId = success.originalMailboxIdsWithMoveSucceededEmailIds.keys.firstOrNull; destinationMailboxId = success.destinationMailboxId; moveAction = success.moveAction; emailActionType = success.emailActionType; emailIdsWithReadStatus = success.moveSucceededEmailIdsWithReadStatus; + isUndoActionEnabled = success.originalMailboxIdsWithMoveSucceededEmailIds.length == 1; } - if (currentContext != null && - currentOverlayContext != null && - emailActionType != null && - moveAction == MoveAction.moving) { + if (currentMailboxId == null || + currentOverlayContext == null || + emailActionType == null || + moveAction != MoveAction.moving) { + return; + } + + if (!isUndoActionEnabled) { + appToast.showToastSuccessMessage( + currentOverlayContext!, + emailActionType.getToastMessageMoveToMailboxSuccess( + currentContext!, + destinationPath: destinationPath, + ), + leadingSVGIconColor: Colors.white, + leadingSVGIcon: imagePaths.icFolderMailbox, + ); + } else { appToast.showToastMessage( currentOverlayContext!, emailActionType.getToastMessageMoveToMailboxSuccess( currentContext!, - destinationPath: destinationPath), + destinationPath: destinationPath, + ), actionName: AppLocalizations.of(currentContext!).undo, onActionClick: () { final newCurrentMailboxId = destinationMailboxId; @@ -1484,7 +1486,7 @@ class MailboxDashBoardController extends ReloadableController newDestinationMailboxId, MoveAction.undo, emailActionType!, - destinationPath: destinationPath + destinationPath: destinationPath, ), emailIdsWithReadStatus ?? {}); } }, @@ -1510,65 +1512,6 @@ class MailboxDashBoardController extends ReloadableController } } - void moveSelectedMultipleEmailToTrash(List listEmails, PresentationMailbox mailboxCurrent) { - final trashMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash); - if (accountId.value != null && trashMailboxId != null && sessionCurrent != null) { - _moveSelectedEmailMultipleToMailboxAction( - sessionCurrent!, - accountId.value!, - MoveToMailboxRequest( - {mailboxCurrent.id: listEmails.listEmailIds}, - trashMailboxId, - MoveAction.moving, - EmailActionType.moveToTrash), - Map.fromEntries( - listEmails - .where((email) => email.id != null) - .map((email) => MapEntry(email.id!, email.hasRead)), - ), - ); - } - } - - void moveSelectedMultipleEmailToSpam(List listEmail, PresentationMailbox mailboxCurrent) { - if (accountId.value == null || sessionCurrent == null) { - consumeState(Stream.value( - Left(MoveMultipleEmailToMailboxFailure( - EmailActionType.moveToSpam, - MoveAction.moving, - NotFoundSessionException() - )) - )); - return; - } - - if (spamMailboxId == null) { - consumeState(Stream.value( - Left(MoveMultipleEmailToMailboxFailure( - EmailActionType.moveToSpam, - MoveAction.moving, - NotFoundSpamMailboxException() - )) - )); - return; - } - - _moveSelectedEmailMultipleToMailboxAction( - sessionCurrent!, - accountId.value!, - MoveToMailboxRequest( - {mailboxCurrent.id: listEmail.listEmailIds}, - spamMailboxId!, - MoveAction.moving, - EmailActionType.moveToSpam), - Map.fromEntries( - listEmail - .where((email) => email.id != null) - .map((email) => MapEntry(email.id!, email.hasRead)), - ), - ); - } - void unSpamSelectedMultipleEmail(List listEmail) { if (accountId.value == null || sessionCurrent == null) { consumeState(Stream.value( @@ -1604,7 +1547,7 @@ class MailboxDashBoardController extends ReloadableController return; } - _moveSelectedEmailMultipleToMailboxAction( + moveSelectedEmailMultipleToMailboxAction( sessionCurrent!, accountId.value!, MoveToMailboxRequest( diff --git a/lib/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart b/lib/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart new file mode 100644 index 000000000..4e0e585b6 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart @@ -0,0 +1,107 @@ +import 'package:core/utils/app_logger.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/email/email_action_type.dart'; +import 'package:model/email/presentation_email.dart'; +import 'package:model/extensions/list_presentation_email_extension.dart'; +import 'package:model/extensions/presentation_email_extension.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; +import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +extension HandleActionTypeForEmailSelection on MailboxDashBoardController { + void moveEmailsToFolder( + List emails, + EmailActionType actionType, + {MailboxId? selectedMailboxId, String? destinationFolderPath} + ) { + MailboxId? destinationMailboxId; + + if (actionType == EmailActionType.moveToMailbox) { + destinationMailboxId = selectedMailboxId; + } else if (actionType == EmailActionType.moveToSpam) { + destinationMailboxId = spamMailboxId; + } else if (actionType == EmailActionType.moveToTrash) { + destinationMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash); + } else if (actionType == EmailActionType.archiveMessage) { + destinationMailboxId = getMailboxIdByRole(PresentationMailbox.roleArchive); + } + + if (accountId.value == null || + destinationMailboxId == null || + sessionCurrent == null) { + consumeState( + Stream.value(Left(MoveMultipleEmailToMailboxFailure( + actionType, + MoveAction.moving, + ParametersIsNullException(), + ))), + ); + return; + } + + final mapEmailIdsByMailboxId = >{}; + + if (searchController.isSearchEmailRunning) { + for (final email in emails) { + final mailboxId = email.firstMailboxIdAvailable; + final emailId = email.id; + + if (mailboxId == null || + mailboxId == destinationMailboxId || + emailId == null) { + continue; + } + + mapEmailIdsByMailboxId.putIfAbsent(mailboxId, () => []).add(emailId); + } + } else { + final selectedId = selectedMailbox.value?.id; + if (selectedId != null) { + mapEmailIdsByMailboxId[selectedId] = emails.listEmailIds; + } + } + + log('$runtimeType::moveEmailsToFolder: MapEmailIdsByMailboxId = $mapEmailIdsByMailboxId'); + if (mapEmailIdsByMailboxId.isEmpty) { + consumeState( + Stream.value(Left(MoveMultipleEmailToMailboxFailure( + actionType, + MoveAction.moving, + ParametersIsNullException(), + ))), + ); + return; + } + + final emailIdsWithReadStatus = Map.fromEntries( + emails + .where((email) => email.id != null) + .map((email) => MapEntry(email.id!, email.hasRead)), + ); + + final destinationPath = destinationFolderPath ?? + (currentContext != null + ? destinationFolderPath ?? mapMailboxById[destinationMailboxId]?.getDisplayName(currentContext!) + : null); + + moveSelectedEmailMultipleToMailboxAction( + sessionCurrent!, + accountId.value!, + MoveToMailboxRequest( + mapEmailIdsByMailboxId, + destinationMailboxId, + MoveAction.moving, + actionType, + destinationPath: destinationPath, + ), + emailIdsWithReadStatus, + ); + } +} diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index 54899fa44..ea9ef1e5e 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -954,22 +954,14 @@ class SearchEmailController extends BaseController break; case EmailActionType.unMarkAsStarred: cancelSelectionMode(); - markAsStarSelectedMultipleEmail(listEmails, MarkStarAction.unMarkStar); break; case EmailActionType.moveToMailbox: - cancelSelectionMode(); - final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); - if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToMailbox(listEmails, mailboxContainCurrent); - } + moveEmailsToMailbox(listEmails, onCallbackAction: cancelSelectionMode); break; case EmailActionType.moveToTrash: cancelSelectionMode(); - final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); - if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToTrash(listEmails, mailboxContainCurrent); - } + moveEmailsToTrash(listEmails); break; case EmailActionType.deletePermanently: final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); @@ -984,10 +976,7 @@ class SearchEmailController extends BaseController break; case EmailActionType.moveToSpam: cancelSelectionMode(); - final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); - if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToSpam(listEmails, mailboxContainCurrent); - } + moveEmailsToSpam(listEmails); break; case EmailActionType.unSpam: cancelSelectionMode(); diff --git a/lib/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart b/lib/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart index 8d2ce732a..0ebe8e1b5 100644 --- a/lib/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart +++ b/lib/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart @@ -9,7 +9,6 @@ class LoadingMoveMultipleEmailToMailboxAll extends UIState {} class MoveMultipleEmailToMailboxAllSuccess extends UIState { final List movedListEmailId; - final MailboxId currentMailboxId; final MailboxId destinationMailboxId; final MoveAction moveAction; final EmailActionType emailActionType; @@ -19,7 +18,6 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState { MoveMultipleEmailToMailboxAllSuccess( this.movedListEmailId, - this.currentMailboxId, this.destinationMailboxId, this.moveAction, this.emailActionType, @@ -33,7 +31,6 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState { @override List get props => [ movedListEmailId, - currentMailboxId, destinationMailboxId, moveAction, emailActionType, @@ -55,7 +52,6 @@ class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure { class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { final List movedListEmailId; - final MailboxId currentMailboxId; final MailboxId destinationMailboxId; final MoveAction moveAction; final EmailActionType emailActionType; @@ -65,7 +61,6 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { MoveMultipleEmailToMailboxHasSomeEmailFailure( this.movedListEmailId, - this.currentMailboxId, this.destinationMailboxId, this.moveAction, this.emailActionType, @@ -79,7 +74,6 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { @override List get props => [ movedListEmailId, - currentMailboxId, destinationMailboxId, moveAction, emailActionType, diff --git a/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart b/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart index 4ba72049f..115f84424 100644 --- a/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart +++ b/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart @@ -29,7 +29,6 @@ class MoveMultipleEmailToMailboxInteractor { if (moveRequest.totalEmails == result.emailIdsSuccess.length) { yield Right(MoveMultipleEmailToMailboxAllSuccess( result.emailIdsSuccess, - moveRequest.currentMailboxes.keys.first, moveRequest.destinationMailboxId, moveRequest.moveAction, moveRequest.emailActionType, @@ -52,7 +51,6 @@ class MoveMultipleEmailToMailboxInteractor { .where((emailId, _) => result.emailIdsSuccess.contains(emailId)); yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure( result.emailIdsSuccess, - moveRequest.currentMailboxes.keys.first, moveRequest.destinationMailboxId, moveRequest.moveAction, moveRequest.emailActionType, diff --git a/lib/features/thread/presentation/mixin/email_action_controller.dart b/lib/features/thread/presentation/mixin/email_action_controller.dart index 2cce6a7eb..6ce185aaa 100644 --- a/lib/features/thread/presentation/mixin/email_action_controller.dart +++ b/lib/features/thread/presentation/mixin/email_action_controller.dart @@ -25,6 +25,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_reques import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -290,21 +291,35 @@ mixin EmailActionController { mailboxDashBoardController.markAsStarSelectedMultipleEmail(listEmails, markStarAction); } - void moveSelectedMultipleEmailToMailbox( - List listEmails, - PresentationMailbox mailboxCurrent - ) { - mailboxDashBoardController.moveSelectedMultipleEmailToMailbox( + void moveEmailsToMailbox( + List listEmails, { + VoidCallback? onCallbackAction, + }) { + mailboxDashBoardController.moveEmailsToMailbox( listEmails, - mailboxCurrent); + onCallbackAction: onCallbackAction, + ); } - void moveSelectedMultipleEmailToTrash(List listEmails, PresentationMailbox mailboxCurrent) { - mailboxDashBoardController.moveSelectedMultipleEmailToTrash(listEmails, mailboxCurrent); + void moveEmailsToTrash(List listEmails) { + mailboxDashBoardController.moveEmailsToFolder( + listEmails, + EmailActionType.moveToTrash, + ); } - void moveSelectedMultipleEmailToSpam(List listEmails, PresentationMailbox mailboxCurrent) { - mailboxDashBoardController.moveSelectedMultipleEmailToSpam(listEmails, mailboxCurrent); + void moveEmailsToArchive(List listEmails) { + mailboxDashBoardController.moveEmailsToFolder( + listEmails, + EmailActionType.archiveMessage, + ); + } + + void moveEmailsToSpam(List listEmails) { + mailboxDashBoardController.moveEmailsToFolder( + listEmails, + EmailActionType.moveToSpam, + ); } void unSpamSelectedMultipleEmail(List listEmails) { diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 6c220581e..64cf70bea 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -1109,22 +1109,11 @@ class ThreadController extends BaseController with EmailActionController { markAsStarSelectedMultipleEmail(selectionEmail, MarkStarAction.unMarkStar); break; case EmailActionType.moveToMailbox: - cancelSelectEmail(); - final mailboxContainCurrent = searchController.isSearchEmailRunning - ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) - : selectedMailbox; - if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToMailbox(selectionEmail, mailboxContainCurrent); - } + moveEmailsToMailbox(selectionEmail, onCallbackAction: cancelSelectEmail); break; case EmailActionType.moveToTrash: cancelSelectEmail(); - final mailboxContainCurrent = searchController.isSearchEmailRunning - ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) - : selectedMailbox; - if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToTrash(selectionEmail, mailboxContainCurrent); - } + moveEmailsToTrash(selectionEmail); break; case EmailActionType.deletePermanently: final mailboxContainCurrent = searchController.isSearchEmailRunning @@ -1141,17 +1130,16 @@ class ThreadController extends BaseController with EmailActionController { break; case EmailActionType.moveToSpam: cancelSelectEmail(); - final mailboxContainCurrent = searchController.isSearchEmailRunning - ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) - : selectedMailbox; - if (mailboxContainCurrent != null) { - moveSelectedMultipleEmailToSpam(selectionEmail, mailboxContainCurrent); - } + moveEmailsToSpam(selectionEmail); break; case EmailActionType.unSpam: cancelSelectEmail(); unSpamSelectedMultipleEmail(selectionEmail); break; + case EmailActionType.archiveMessage: + cancelSelectEmail(); + moveEmailsToArchive(selectionEmail); + break; default: break; } diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 8eb045361..2244a6467 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -4677,5 +4677,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "archiveMessagesFailed": "Archive messages failed", + "@archiveMessagesFailed": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 58fb1b9e8..98654555b 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -4934,4 +4934,11 @@ class AppLocalizations { name: 'showSignature', ); } + + String get archiveMessagesFailed { + return Intl.message( + 'Archive messages failed', + name: 'archiveMessagesFailed', + ); + } } diff --git a/lib/main/utils/toast_manager.dart b/lib/main/utils/toast_manager.dart index 3bd0c66ac..e7f689f12 100644 --- a/lib/main/utils/toast_manager.dart +++ b/lib/main/utils/toast_manager.dart @@ -155,6 +155,8 @@ class ToastManager { message = message ?? AppLocalizations.of(context).emptyTrashFolderFailed; } else if (_isMarkAsSpamFailure(failure)) { message = message ?? AppLocalizations.of(context).markAsSpamFailed; + } else if (_isArchiveMessagesFailure(failure)) { + message = message ?? AppLocalizations.of(context).archiveMessagesFailed; } else if (failure is SignInTwakeWorkplaceFailure) { message = message ?? AppLocalizations.of(context).sigInSaasFailed; } else if (failure is SignUpTwakeWorkplaceFailure) { @@ -204,6 +206,12 @@ class ToastManager { failure.moveAction == MoveAction.moving; } + bool _isArchiveMessagesFailure(FeatureFailure failure) { + return failure is MoveMultipleEmailToMailboxFailure && + failure.emailActionType == EmailActionType.archiveMessage && + failure.moveAction == MoveAction.moving; + } + void showMessageSuccess(Success success) { final context = currentContext; final overlayContext = currentOverlayContext; diff --git a/model/lib/extensions/presentation_email_extension.dart b/model/lib/extensions/presentation_email_extension.dart index 76d9c470c..41f633719 100644 --- a/model/lib/extensions/presentation_email_extension.dart +++ b/model/lib/extensions/presentation_email_extension.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:collection/collection.dart'; import 'package:core/data/constants/constant.dart'; import 'package:core/domain/extensions/datetime_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart'; @@ -198,4 +199,7 @@ extension PresentationEmailExtension on PresentationEmail { String? get sanitizedSearchSnippetSubject => _sanitizeSearchSnippet(searchSnippetSubject); String? get sanitizedSearchSnippetPreview => _sanitizeSearchSnippet(searchSnippetPreview); + + MailboxId? get firstMailboxIdAvailable => + mailboxIds?.entries.firstWhereOrNull((element) => element.value)?.key; } \ No newline at end of file