From bd06eb7105246970657073b51d6e067f7ce45787 Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Mon, 24 Oct 2022 14:02:01 +0700 Subject: [PATCH] TF-1083: merge one request when drag email when searching --- .../data/datasource/email_datasource.dart | 1 + .../email_datasource_impl.dart | 1 + .../email/data/network/email_api.dart | 85 +++++++++--- .../repository/email_repository_impl.dart | 1 + .../domain/model/move_to_mailbox_request.dart | 18 +-- .../domain/repository/email_repository.dart | 1 + .../usecases/move_to_mailbox_interactor.dart | 2 +- .../email/presentation/email_controller.dart | 30 ++-- .../presentation/mailbox_view_web.dart | 6 +- .../mailbox_dashboard_controller.dart | 130 ++++++++++-------- ..._multiple_email_to_mailbox_interactor.dart | 10 +- .../mixin/email_action_controller.dart | 24 ++-- .../presentation/thread_controller.dart | 56 ++++---- 13 files changed, 219 insertions(+), 146 deletions(-) diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 12d3196a8..9b0c35e60 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -5,6 +5,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index e856c7a3f..4c5503006 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -5,6 +5,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 68e08862d..2ffd5f916 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -9,6 +9,8 @@ import 'package:external_path/external_path.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; +import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart'; import 'package:jmap_dart_client/jmap/core/patch_object.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/reference_id.dart'; @@ -38,6 +40,7 @@ import 'package:model/extensions/email_extension.dart'; import 'package:model/extensions/keyword_identifier_extension.dart'; import 'package:model/extensions/list_email_id_extension.dart'; import 'package:model/extensions/mailbox_id_extension.dart'; +import 'package:model/extensions/session_extension.dart'; import 'package:model/oidc/token.dart'; import 'package:path_provider/path_provider.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; @@ -45,6 +48,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_reques import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; +import 'package:tmail_ui_user/main/error/capability_validator.dart'; class EmailAPI { @@ -302,33 +306,74 @@ class EmailAPI { } Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) async { - final setEmailMethod = SetEmailMethod(accountId) - ..addUpdates(moveRequest.emailIds - .generateMapUpdateObjectMoveToMailbox(moveRequest.currentMailboxId, moveRequest.destinationMailboxId)); - final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); + requireCapability(moveRequest.session, accountId, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]); - final setEmailInvocation = requestBuilder.invocation(setEmailMethod); + final coreCapability = moveRequest.session.getCapabilityProperties( + accountId, CapabilityIdentifier.jmapCore); + final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt(); - final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) - .build() - .execute(); + var start = 0; + var end = 0; - final setEmailResponse = response.parse( - setEmailInvocation.methodCallId, - SetEmailResponse.deserialize); + final List listEmailIdResult = List.empty(growable: true); + final listCurrentMailboxesEntries = moveRequest.currentMailboxes.entries.toList(); - return Future.sync(() async { - final mapUpdated = setEmailResponse!.updated!; - return moveRequest.emailIds - .where((emailId) => mapUpdated.containsKey(emailId.id)) - .toList(); - }).catchError((error) { - throw error; - }); + while (end < moveRequest.currentMailboxes.length) { + start = end; + if (moveRequest.currentMailboxes.length - start >= maxMethodCount) { + end = maxMethodCount; + } else { + end = moveRequest.currentMailboxes.length; + } + log('EmailAPI::moveToMailbox(): move from $start to $end / ${listCurrentMailboxesEntries.length}'); + final currentExecuteList = listCurrentMailboxesEntries.sublist(start, end); + + final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); + final currentSetEmailInvocations = currentExecuteList.map((currentItem) { + return SetEmailMethod(accountId) + ..addUpdates(currentItem.value.generateMapUpdateObjectMoveToMailbox(currentItem.key, moveRequest.destinationMailboxId)); + }).map(requestBuilder.invocation).toList(); + + final response = await (requestBuilder..usings({CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail})) + .build() + .execute(); + + Future.sync(() async { + final listSetEmailResponse = currentSetEmailInvocations + .map((currentInvocation) => response.parse(currentInvocation.methodCallId, SetEmailResponse.deserialize)) + .toList(); + + listEmailIdResult.addAll(_getListEmailIdUpdatedFormSetEmailResponse(listSetEmailResponse, moveRequest)); + + }).catchError((error) { + throw error; + }); + } + + return listEmailIdResult; } + List _getListEmailIdUpdatedFormSetEmailResponse(List listSetEmailResponse, MoveToMailboxRequest moveRequest) { + final List listEmailIdResult = List.empty(growable: true); + final listUpdated = listSetEmailResponse.map((e) => e!.updated!.keys).toList(); + + for (final listEmailId in listUpdated) { + List listEmailIdRequest = List.empty(growable: true); + for (var itemEmailIdMoveRequest in moveRequest.currentMailboxes.values) { + listEmailIdRequest.addAll(itemEmailIdMoveRequest); + } + + listEmailIdResult.addAll(listEmailIdRequest + .where((emailId) => listEmailId.toList().contains(emailId.id)) + .toList(), + ); + } + + return listEmailIdResult; + } + + Future> markAsStar(AccountId accountId, List emails, MarkStarAction markStarAction) async { final emailIds = emails.map((email) => email.id).toList(); diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 5f69eb66a..e897b55b4 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -6,6 +6,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; diff --git a/lib/features/email/domain/model/move_to_mailbox_request.dart b/lib/features/email/domain/model/move_to_mailbox_request.dart index daa6ef270..27630e738 100644 --- a/lib/features/email/domain/model/move_to_mailbox_request.dart +++ b/lib/features/email/domain/model/move_to_mailbox_request.dart @@ -1,5 +1,6 @@ import 'package:equatable/equatable.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; @@ -7,26 +8,25 @@ import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; class MoveToMailboxRequest with EquatableMixin { - final List emailIds; - final MailboxId currentMailboxId; + final Map> currentMailboxes; final MailboxId destinationMailboxId; final MoveAction moveAction; final EmailActionType emailActionType; final String? destinationPath; + final Session session; MoveToMailboxRequest( - this.emailIds, - this.currentMailboxId, + this.currentMailboxes, this.destinationMailboxId, this.moveAction, - this.emailActionType, - {this.destinationPath} - ); + this.session, + this.emailActionType,{ + this.destinationPath, + }); @override List get props => [ - emailIds, - currentMailboxId, + currentMailboxes, destinationMailboxId, moveAction, emailActionType, diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 4ddca04c7..5a876d0f9 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -5,6 +5,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:model/model.dart'; diff --git a/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart b/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart index 83d108bda..28ac696d3 100644 --- a/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart +++ b/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart @@ -26,7 +26,7 @@ class MoveToMailboxInteractor { if (result.isNotEmpty) { yield Right(MoveToMailboxSuccess( result.first, - moveRequest.currentMailboxId, + moveRequest.currentMailboxes.keys.first, moveRequest.destinationMailboxId, moveRequest.moveAction, moveRequest.emailActionType, diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index c30a1e0e8..03439c3b7 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -505,27 +505,27 @@ class EmailController extends BaseController with AppLoaderMixin { arguments: DestinationPickerArguments(accountId, MailboxActions.moveEmail) ); - if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { + if (destinationMailbox != null && destinationMailbox is PresentationMailbox && mailboxDashBoardController.sessionCurrent != null) { if (destinationMailbox.isTrash) { _moveToTrashAction(context, accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { _moveToSpamAction(context, accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToSpam)); } else { _moveToMailbox(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } @@ -547,10 +547,10 @@ class EmailController extends BaseController with AppLoaderMixin { actionName: AppLocalizations.of(currentContext!).undo, onActionClick: () { _revertedToOriginalMailbox(MoveToMailboxRequest( - [success.emailId], - success.destinationMailboxId, + {success.destinationMailboxId: [success.emailId]}, success.currentMailboxId, MoveAction.undo, + mailboxDashBoardController.sessionCurrent!, success.emailActionType)); }, leadingIcon: SvgPicture.asset( @@ -582,10 +582,10 @@ class EmailController extends BaseController with AppLoaderMixin { if (accountId != null && currentMailbox != null && trashMailboxId != null) { _moveToTrashAction(context, accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, trashMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToTrash) ); } @@ -603,10 +603,10 @@ class EmailController extends BaseController with AppLoaderMixin { if (accountId != null && currentMailbox != null && spamMailboxId != null) { _moveToSpamAction(context, accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, spamMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToSpam) ); } @@ -619,10 +619,10 @@ class EmailController extends BaseController with AppLoaderMixin { if (accountId != null && spamMailboxId != null && inboxMailboxId != null) { _moveToSpamAction(context, accountId, MoveToMailboxRequest( - [email.id], - spamMailboxId, + {spamMailboxId: [email.id]}, inboxMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.unSpam) ); } diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 6183863c3..ef860e5cc 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -285,7 +285,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu _openMailboxMenuAction(context, position, mailboxNode.item)) ..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode)) - ..addOnDragItemAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailbox)) + ..addOnDragItemAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction)) .build()), children: _buildListChildTileWidget(context, mailboxNode) ).build() @@ -297,7 +297,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu _openMailboxMenuAction(context, position, mailboxNode.item)) ..addOnSelectMailboxFolderClick((mailboxNode) => controller.selectMailboxNode(mailboxNode)) - ..addOnDragItemAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailbox)) + ..addOnDragItemAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction)) .build()) ).toList() ?? []; } @@ -363,7 +363,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu _responsiveUtils, listMailbox[index], lastMailbox: controller.listMailboxSearched.last) - ..addOnDragItemAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailbox) + ..addOnDragItemAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction) ..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox)) ..addOnMenuActionClick((position, mailbox) => _openMailboxMenuAction(context, position, mailbox)) ..addOnSelectMailboxActionClick((mailbox) => controller.selectMailboxSearched(context, mailbox))) 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 e42a1a1d8..adc8d02fd 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -471,10 +471,10 @@ class MailboxDashBoardController extends ReloadableController { actionName: AppLocalizations.of(currentContext!).undo, onActionClick: () { _revertedToOriginalMailbox(MoveToMailboxRequest( - [success.emailId], - success.destinationMailboxId, + {success.destinationMailboxId: [success.emailId]}, success.currentMailboxId, MoveAction.undo, + sessionCurrent!, success.emailActionType)); }, leadingIcon: SvgPicture.asset( @@ -625,24 +625,24 @@ class MailboxDashBoardController extends ReloadableController { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.isTrash) { _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - listEmails.listEmailIds, - mailboxCurrent.id, + {mailboxCurrent.id: listEmails.listEmailIds}, destinationMailbox.id, MoveAction.moving, + sessionCurrent!, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - listEmails.listEmailIds, - mailboxCurrent.id, + {mailboxCurrent.id: listEmails.listEmailIds}, destinationMailbox.id, MoveAction.moving, + sessionCurrent!, EmailActionType.moveToSpam)); } else { _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - listEmails.listEmailIds, - mailboxCurrent.id, + {mailboxCurrent.id: listEmails.listEmailIds}, destinationMailbox.id, MoveAction.moving, + sessionCurrent!, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } @@ -650,49 +650,71 @@ class MailboxDashBoardController extends ReloadableController { } } - void dragSelectedMultipleEmailToMailbox( + void dragSelectedMultipleEmailToMailboxAction( List listEmails, - PresentationMailbox destinationMailbox - ) async { - for (final element in listEmails) { - final currentMailBox = searchController.isSearchEmailRunning - ? element.findMailboxContain(mapMailboxById) - : selectedMailbox.value; - if (accountId.value != null && currentMailBox != null) { - if (destinationMailbox.isTrash) { - moveToMailbox(accountId.value!, - MoveToMailboxRequest( - [element].listEmailIds, - currentMailBox.id, - destinationMailbox.id, - MoveAction.moving, - EmailActionType.moveToTrash, - ), - ); - } else if (destinationMailbox.isSpam) { - moveToMailbox(accountId.value!, - MoveToMailboxRequest( - [element].listEmailIds, - currentMailBox.id, - destinationMailbox.id, - MoveAction.moving, - EmailActionType.moveToSpam, - ), - ); + PresentationMailbox destinationMailbox, + ) { + if(searchController.isSearchEmailRunning){ + final Map> mapListEmailSelectedByMailBoxId = {}; + for (var element in listEmails) { + final mailbox = element.findMailboxContain(mapMailboxById); + if(mailbox != null) { + if(mapListEmailSelectedByMailBoxId.containsKey(mailbox.id)) { + mapListEmailSelectedByMailBoxId[mailbox.id]?.add(element.id); } else { - moveToMailbox(accountId.value!, - MoveToMailboxRequest( - [element].listEmailIds, - currentMailBox.id, - destinationMailbox.id, - MoveAction.moving, - EmailActionType.moveToMailbox, - destinationPath: destinationMailbox.mailboxPath, - ), - ); + mapListEmailSelectedByMailBoxId.addAll({mailbox.id: [element.id]}); } } } + _handleDragSelectedMultipleEmailToMailboxAction(mapListEmailSelectedByMailBoxId, destinationMailbox); + + } else { + if(selectedMailbox.value != null) { + _handleDragSelectedMultipleEmailToMailboxAction({selectedMailbox.value!.id: listEmails.listEmailIds}, destinationMailbox); + } + } + + } + + void _handleDragSelectedMultipleEmailToMailboxAction( + Map> mapListEmails, + PresentationMailbox destinationMailbox, + ) async { + if (accountId.value != null ) { + if (destinationMailbox.isTrash) { + moveToMailbox(accountId.value!, + MoveToMailboxRequest( + mapListEmails, + destinationMailbox.id, + MoveAction.moving, + sessionCurrent!, + EmailActionType.moveToTrash, + ), + ); + } else if (destinationMailbox.isSpam) { + moveToMailbox(accountId.value!, + MoveToMailboxRequest( + mapListEmails, + destinationMailbox.id, + MoveAction.moving, + sessionCurrent!, + EmailActionType.moveToSpam, + ), + ); + } else { + moveToMailbox(accountId.value!, + MoveToMailboxRequest( + mapListEmails, + destinationMailbox.id, + MoveAction.moving, + sessionCurrent!, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath, + ), + ); + } + } + dispatchAction(CancelSelectionAllEmailAction()); } void _moveSelectedEmailMultipleToMailboxAction( @@ -741,10 +763,10 @@ class MailboxDashBoardController extends ReloadableController { final newDestinationMailboxId = currentMailboxId; if (newCurrentMailboxId != null && newDestinationMailboxId != null) { _revertedSelectionEmailToOriginalMailbox(MoveToMailboxRequest( - movedEmailIds, - newCurrentMailboxId, + {newCurrentMailboxId: movedEmailIds}, newDestinationMailboxId, MoveAction.undo, + sessionCurrent!, emailActionType!, destinationPath: destinationPath)); } @@ -776,10 +798,10 @@ class MailboxDashBoardController extends ReloadableController { final trashMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash); if (accountId.value != null && trashMailboxId != null) { _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - listEmails.listEmailIds, - mailboxCurrent.id, + {mailboxCurrent.id: listEmails.listEmailIds}, trashMailboxId, MoveAction.moving, + sessionCurrent!, EmailActionType.moveToTrash) ); } @@ -789,10 +811,10 @@ class MailboxDashBoardController extends ReloadableController { final spamMailboxId = getMailboxIdByRole(PresentationMailbox.roleSpam); if (accountId.value != null && spamMailboxId != null) { _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - listEmail.listEmailIds, - mailboxCurrent.id, + {mailboxCurrent.id: listEmail.listEmailIds}, spamMailboxId, MoveAction.moving, + sessionCurrent!, EmailActionType.moveToSpam) ); } @@ -803,10 +825,10 @@ class MailboxDashBoardController extends ReloadableController { final inboxMailboxId = getMailboxIdByRole(PresentationMailbox.roleInbox); if (inboxMailboxId != null && accountId.value != null && spamMailboxId != null) { _moveSelectedEmailMultipleToMailboxAction(accountId.value!, MoveToMailboxRequest( - listEmail.listEmailIds, - spamMailboxId, + {spamMailboxId: listEmail.listEmailIds}, inboxMailboxId, MoveAction.moving, + sessionCurrent!, EmailActionType.unSpam) ); } 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 18327fced..41b94b16e 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 @@ -25,11 +25,13 @@ class MoveMultipleEmailToMailboxInteractor { final currentEmailState = listState.last; final result = await _emailRepository.moveToMailbox(accountId, moveRequest); - - if (moveRequest.emailIds.length == result.length) { + int totalEmail = 0; + for (var element in moveRequest.currentMailboxes.values) { + totalEmail = totalEmail + element.length; + }if (totalEmail == result.length) { yield Right(MoveMultipleEmailToMailboxAllSuccess( result, - moveRequest.currentMailboxId, + moveRequest.currentMailboxes.keys.first, moveRequest.destinationMailboxId, moveRequest.moveAction, moveRequest.emailActionType, @@ -41,7 +43,7 @@ class MoveMultipleEmailToMailboxInteractor { } else { yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure( result, - moveRequest.currentMailboxId, + 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 f4284ff17..1c52ca679 100644 --- a/lib/features/thread/presentation/mixin/email_action_controller.dart +++ b/lib/features/thread/presentation/mixin/email_action_controller.dart @@ -52,10 +52,10 @@ mixin EmailActionController { if (currentMailbox != null && accountId != null && trashMailboxId != null) { _moveToTrashAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, trashMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToTrash) ); } @@ -72,10 +72,10 @@ mixin EmailActionController { if (currentMailbox != null && accountId != null && spamMailboxId != null) { moveToSpamAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, spamMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToSpam) ); } @@ -88,10 +88,10 @@ mixin EmailActionController { if (inboxMailboxId != null && accountId != null && spamMailboxId != null) { moveToSpamAction(accountId, MoveToMailboxRequest( - [email.id], - spamMailboxId, + {spamMailboxId: [email.id]}, inboxMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.unSpam) ); } @@ -114,24 +114,24 @@ mixin EmailActionController { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.isTrash) { moveToSpamAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { moveToSpamAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToSpam)); } else { _moveToMailboxAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 22716e281..92e8123db 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -647,24 +647,24 @@ class ThreadController extends BaseController { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.isTrash) { _moveSelectedEmailMultipleToTrashAction(_accountId!, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { _moveSelectedEmailMultipleToSpamAction(_accountId!, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToSpam)); } else { _moveSelectedEmailMultipleToMailboxAction(_accountId!, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } @@ -717,10 +717,10 @@ class ThreadController extends BaseController { final newDestinationMailboxId = currentMailboxId; if (newCurrentMailboxId != null && newDestinationMailboxId != null) { _revertedSelectionEmailToOriginalMailbox(MoveToMailboxRequest( - movedEmailIds, - newCurrentMailboxId, + {newCurrentMailboxId: movedEmailIds}, newDestinationMailboxId, MoveAction.undo, + mailboxDashBoardController.sessionCurrent!, emailActionType!, destinationPath: destinationPath)); } @@ -751,10 +751,10 @@ class ThreadController extends BaseController { if (_accountId != null && trashMailboxId != null) { final listEmailIds = listEmail.map((email) => email.id).toList(); _moveSelectedEmailMultipleToTrashAction(_accountId!, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, trashMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToTrash) ); } @@ -774,10 +774,10 @@ class ThreadController extends BaseController { if (_accountId != null && spamMailboxId != null) { final listEmailIds = listEmail.map((email) => email.id).toList(); _moveSelectedEmailMultipleToSpamAction(_accountId!, MoveToMailboxRequest( - listEmailIds, - currentMailbox.id, + {currentMailbox.id: listEmailIds}, spamMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToSpam) ); } @@ -795,10 +795,10 @@ class ThreadController extends BaseController { if (inboxMailboxId != null && _accountId != null && spamMailboxId != null) { final listEmailIds = listEmail.map((email) => email.id).toList(); _moveSelectedEmailMultipleToMailboxAction(_accountId!, MoveToMailboxRequest( - listEmailIds, - spamMailboxId, + {spamMailboxId: listEmailIds}, inboxMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.unSpam) ); } @@ -1086,24 +1086,24 @@ class ThreadController extends BaseController { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.isTrash) { _moveToTrashAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToTrash)); } else if (destinationMailbox.isSpam) { _moveToSpamAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToSpam)); } else { _moveToMailboxAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, destinationMailbox.id, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } @@ -1125,10 +1125,10 @@ class ThreadController extends BaseController { actionName: AppLocalizations.of(currentContext!).undo, onActionClick: () { _revertedToOriginalMailbox(MoveToMailboxRequest( - [success.emailId], - success.destinationMailboxId, + {success.destinationMailboxId: [success.emailId]}, success.currentMailboxId, MoveAction.undo, + mailboxDashBoardController.sessionCurrent!, success.emailActionType)); }, leadingIcon: SvgPicture.asset( @@ -1164,10 +1164,10 @@ class ThreadController extends BaseController { if (currentMailbox != null && accountId != null && trashMailboxId != null) { _moveToTrashAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, trashMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToTrash) ); } @@ -1180,10 +1180,10 @@ class ThreadController extends BaseController { if (currentMailbox != null && accountId != null && spamMailboxId != null) { _moveToSpamAction(accountId, MoveToMailboxRequest( - [email.id], - currentMailbox.id, + {currentMailbox.id: [email.id]}, spamMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.moveToSpam) ); } @@ -1196,10 +1196,10 @@ class ThreadController extends BaseController { if (inboxMailboxId != null && accountId != null && spamMailboxId != null) { _moveToSpamAction(accountId, MoveToMailboxRequest( - [email.id], - spamMailboxId, + {spamMailboxId: [email.id]}, inboxMailboxId, MoveAction.moving, + mailboxDashBoardController.sessionCurrent!, EmailActionType.unSpam) ); }