diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 10cf0e792..4be78937c 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -81,6 +81,10 @@ import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_ac import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/download_ui_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/exceptions/mailbox_exception.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/get_mailbox_contain_extension.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/get_trash_mailbox_id_and_path_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_download_attachment_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_preview_attachment_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart'; @@ -743,24 +747,51 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } void moveToTrash(PresentationEmail email) { - if (session != null && accountId != null) { - final moveActionRequest = emailActionReactor.moveToTrash( - email, - mapMailbox: mailboxDashBoardController.mapMailboxById, - selectedMailbox: mailboxDashBoardController.selectedMailbox.value, - isSearchEmailRunning: mailboxDashBoardController.searchController.isSearchEmailRunning, - mapDefaultMailboxIdByRole: mailboxDashBoardController.mapDefaultMailboxIdByRole, + if (session == null) { + mailboxDashBoardController.emitMoveToTrashFailure( + NotFoundSessionException(), ); - if (moveActionRequest == null) return; - mailboxDashBoardController.moveToMailbox( - session!, - accountId!, - moveActionRequest.moveRequest, - moveActionRequest.emailIdsWithReadStatus, + return; + } + + if (accountId == null) { + mailboxDashBoardController.emitMoveToTrashFailure( + NotFoundAccountIdException(), ); - if (_threadDetailController?.emailIdsPresentation.length == 1) { - _threadDetailController?.closeThreadDetailAction(); - } + return; + } + + final currentMailbox = mailboxDashBoardController.getMailboxContain(email); + if (currentMailbox == null) { + mailboxDashBoardController.emitMoveToTrashFailure( + NotFoundMailboxOfEmailException(), + ); + return; + } + + final (:trashId, :trashPath) = + mailboxDashBoardController.getTrashMailboxIdAndPath(currentMailbox); + if (trashId == null) { + mailboxDashBoardController.emitMoveToTrashFailure( + NotFoundTrashMailboxException(), + ); + return; + } + + final moveActionRequest = emailActionReactor.buildMoveToTrashRequest( + email, + trashMailboxId: trashId, + currentMailbox: currentMailbox, + trashMailboxPath: trashPath, + ); + mailboxDashBoardController.moveToMailbox( + session!, + accountId!, + moveActionRequest.moveRequest, + moveActionRequest.emailIdsWithReadStatus, + ); + if (_threadDetailController?.emailIdsPresentation.length == 1) { + _threadDetailController?.closeThreadDetailAction(); } } diff --git a/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart b/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart index ab8bf0544..8eb8f7ac5 100644 --- a/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart +++ b/lib/features/email/presentation/utils/email_action_reactor/email_action_reactor.dart @@ -165,30 +165,20 @@ class EmailActionReactor with LabelSubMenuMixin { ({ MoveToMailboxRequest moveRequest, Map emailIdsWithReadStatus - })? moveToTrash( + }) buildMoveToTrashRequest( PresentationEmail presentationEmail, { - required Map mapMailbox, - required PresentationMailbox? selectedMailbox, - required bool isSearchEmailRunning, - required Map mapDefaultMailboxIdByRole, + required MailboxId trashMailboxId, + required PresentationMailbox currentMailbox, + String? trashMailboxPath, }) { - final trashMailboxId = mapDefaultMailboxIdByRole[ - PresentationMailbox.roleTrash - ]; - final currentMailbox = _getMailboxContain( - presentationEmail, - mapMailbox: mapMailbox, - isSearchEmailRunning: isSearchEmailRunning, - selectedMailbox: selectedMailbox, - ); - if (trashMailboxId == null || currentMailbox == null) return null; - return ( moveRequest: MoveToMailboxRequest( {currentMailbox.id: [presentationEmail.id!]}, trashMailboxId, MoveAction.moving, - EmailActionType.moveToTrash), + EmailActionType.moveToTrash, + destinationPath: trashMailboxPath, + ), emailIdsWithReadStatus: {presentationEmail.id!: presentationEmail.hasRead}, ); } diff --git a/lib/features/mailbox_dashboard/presentation/extensions/get_trash_mailbox_id_and_path_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/get_trash_mailbox_id_and_path_extension.dart index 102e64a4f..de276aa4f 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/get_trash_mailbox_id_and_path_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/get_trash_mailbox_id_and_path_extension.dart @@ -1,6 +1,8 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/email/email_action_type.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; extension GetTrashMailboxIdAndPathExtension on MailboxDashBoardController { @@ -30,4 +32,14 @@ extension GetTrashMailboxIdAndPathExtension on MailboxDashBoardController { ); return (trashId: trashId, trashPath: trashPath); } + + void emitMoveToTrashFailure(Exception exception) { + emitFailure( + controller: this, + failure: MoveToMailboxFailure( + EmailActionType.moveToTrash, + exception: exception, + ), + ); + } } diff --git a/lib/features/thread/presentation/mixin/email_action_controller.dart b/lib/features/thread/presentation/mixin/email_action_controller.dart index faadc5829..ebca02f35 100644 --- a/lib/features/thread/presentation/mixin/email_action_controller.dart +++ b/lib/features/thread/presentation/mixin/email_action_controller.dart @@ -20,7 +20,6 @@ import 'package:tmail_ui_user/features/destination_picker/presentation/model/des import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.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/email/domain/state/move_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; import 'package:tmail_ui_user/features/mailbox/domain/exceptions/mailbox_exception.dart'; @@ -68,26 +67,34 @@ mixin EmailActionController { PresentationMailbox? mailboxContain, }) { if (mailboxContain == null) { - _emitMoveToTrashFailure(NotFoundMailboxOfEmailException()); + mailboxDashBoardController.emitMoveToTrashFailure( + NotFoundMailboxOfEmailException(), + ); return; } final session = mailboxDashBoardController.sessionCurrent; if (session == null) { - _emitMoveToTrashFailure(NotFoundSessionException()); + mailboxDashBoardController.emitMoveToTrashFailure( + NotFoundSessionException(), + ); return; } final accountId = mailboxDashBoardController.accountId.value; if (accountId == null) { - _emitMoveToTrashFailure(NotFoundAccountIdException()); + mailboxDashBoardController.emitMoveToTrashFailure( + NotFoundAccountIdException(), + ); return; } final (:trashId, :trashPath) = mailboxDashBoardController.getTrashMailboxIdAndPath(mailboxContain); if (trashId == null) { - _emitMoveToTrashFailure(NotFoundTrashMailboxException()); + mailboxDashBoardController.emitMoveToTrashFailure( + NotFoundTrashMailboxException(), + ); return; } @@ -105,16 +112,6 @@ mixin EmailActionController { ); } - void _emitMoveToTrashFailure(Exception exception) { - mailboxDashBoardController.emitFailure( - controller: mailboxDashBoardController, - failure: MoveToMailboxFailure( - EmailActionType.moveToTrash, - exception: exception, - ), - ); - } - void _moveToTrashAction( Session session, AccountId accountId,