From 0248b9138cf37ed692383501810c89bc86f7fb52 Mon Sep 17 00:00:00 2001 From: DatDang Date: Fri, 3 Jan 2025 15:13:53 +0700 Subject: [PATCH] TF-3385 Fix move and delete emails not work properly --- ...ete_multiple_emails_permanently_state.dart | 4 +-- .../mailbox_dashboard_controller.dart | 27 ++++++++++++------ .../move_emails_to_mailbox_extension.dart | 18 +++++++++--- ..._emails_with_new_mailbox_id_extension.dart | 7 +++-- .../presentation/search_email_controller.dart | 1 + .../presentation/thread_controller.dart | 28 +++++++++++++++++++ 6 files changed, 68 insertions(+), 17 deletions(-) diff --git a/lib/features/email/domain/state/delete_multiple_emails_permanently_state.dart b/lib/features/email/domain/state/delete_multiple_emails_permanently_state.dart index b09122498..bdcb3cd22 100644 --- a/lib/features/email/domain/state/delete_multiple_emails_permanently_state.dart +++ b/lib/features/email/domain/state/delete_multiple_emails_permanently_state.dart @@ -7,7 +7,7 @@ class LoadingDeleteMultipleEmailsPermanentlyAll extends UIState {} class DeleteMultipleEmailsPermanentlyAllSuccess extends UIState { - List emailIds; + final List emailIds; final MailboxId? mailboxId; DeleteMultipleEmailsPermanentlyAllSuccess(this.emailIds, this.mailboxId); @@ -18,7 +18,7 @@ class DeleteMultipleEmailsPermanentlyAllSuccess extends UIState { class DeleteMultipleEmailsPermanentlyHasSomeEmailFailure extends UIState { - List emailIds; + final List emailIds; final MailboxId? mailboxId; DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(this.emailIds, this.mailboxId); 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 1cf4e630b..231a16e63 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -253,6 +253,7 @@ class MailboxDashBoardController extends ReloadableController StreamSubscription? _pendingSharedFileInfoSubscription; StreamSubscription? _receivingFileSharingStreamSubscription; StreamSubscription? _currentEmailIdInNotificationIOSStreamSubscription; + List emailsToBeUndo = []; final StreamController> _progressStateController = StreamController>.broadcast(); @@ -836,12 +837,22 @@ class MailboxDashBoardController extends ReloadableController MoveToMailboxRequest moveRequest, Map emailIdsWithReadStatus, ) { - consumeState(_moveToMailboxInteractor.execute( - session, - accountId, - moveRequest, - emailIdsWithReadStatus, - )); + final currentMailboxes = moveRequest.currentMailboxes; + if (currentMailboxes.length == 1 && currentMailboxes.values.first.length == 1) { + consumeState(_moveToMailboxInteractor.execute( + session, + accountId, + moveRequest, + emailIdsWithReadStatus, + )); + } else { + consumeState(_moveMultipleEmailToMailboxInteractor.execute( + session, + accountId, + moveRequest, + emailIdsWithReadStatus, + )); + } } void _moveToMailboxSuccess(MoveToMailboxSuccess success) { @@ -873,12 +884,12 @@ class MailboxDashBoardController extends ReloadableController final currentAccountId = accountId.value; final session = sessionCurrent; if (currentAccountId != null && session != null) { - consumeState(_moveToMailboxInteractor.execute( + moveToMailbox( session, currentAccountId, newMoveRequest, emailIdsWithReadStatus, - )); + ); } } diff --git a/lib/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart index e0e4e6d9c..eb0053794 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/move_emails_to_mailbox_extension.dart @@ -1,15 +1,15 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/email/presentation_email.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; extension MoveEmailsToMailboxExtension on MailboxDashBoardController { void handleMoveEmailsToMailbox({ required Map> originalMailboxIdsWithEmailIds, required MailboxId destinationMailboxId, + required MoveAction moveAction, }) { - if (destinationMailboxId == selectedMailbox.value?.id) return; - final currentEmails = List.from( emailsInCurrentMailbox, ); @@ -20,7 +20,17 @@ extension MoveEmailsToMailboxExtension on MailboxDashBoardController { return emailIds; }, ).toList(); - currentEmails.removeWhere((email) => movedEmailIds.contains(email.id)); - updateEmailList(currentEmails); + final currentEmailsToBeMoved = currentEmails + .where((email) => movedEmailIds.contains(email.id)) + .toList(); + if (currentEmailsToBeMoved.isNotEmpty && destinationMailboxId != selectedMailbox.value?.id) { + emailsToBeUndo = currentEmailsToBeMoved; + currentEmails.removeWhere(currentEmailsToBeMoved.contains); + updateEmailList(currentEmails); + } else if (moveAction == MoveAction.undo && destinationMailboxId == selectedMailbox.value?.id) { + currentEmails.addAll(emailsToBeUndo); + currentEmails.sort((a, b) => b.receivedAt?.value.compareTo(a.receivedAt?.value ?? DateTime.now()) ?? -1); + updateEmailList(currentEmails); + } } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/extensions/update_emails_with_new_mailbox_id_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/update_emails_with_new_mailbox_id_extension.dart index a94af546d..729a8dab6 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/update_emails_with_new_mailbox_id_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/update_emails_with_new_mailbox_id_extension.dart @@ -18,13 +18,14 @@ extension UpdateEmailsWithNewMailboxIdExtension on MailboxDashBoardController { return emailIds; }, ).toList(); - for (var email in currentEmails) { - if (!movedEmailIds.contains(email.id)) continue; + for (int i = 0; i < currentEmails.length; i++) { + if (!movedEmailIds.contains(currentEmails[i].id)) continue; - email = email.copyWith( + currentEmails[i] = currentEmails[i].copyWith( mailboxIds: {destinationMailboxId: true}, mailboxContain: mapMailboxById[destinationMailboxId], ); } + updateEmailList(currentEmails); } } \ No newline at end of file diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index 82d679f34..e92905595 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -265,6 +265,7 @@ class SearchEmailController extends BaseController ); ever(mailboxDashBoardController.viewState, (viewState) { + if (!mailboxDashBoardController.searchController.isSearchEmailRunning) return; final reactionState = viewState.getOrElse(() => UIState.idle); if (reactionState is MoveToMailboxSuccess) { mailboxDashBoardController.handleUpdateEmailsWithNewMailboxId( diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 5bc655f8d..1f3b927f2 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -20,6 +20,8 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; @@ -338,6 +340,7 @@ class ThreadController extends BaseController with EmailActionController { }); ever(mailboxDashBoardController.viewState, (viewState) { + if (mailboxDashBoardController.searchController.isSearchEmailRunning) return; final reactionState = viewState.getOrElse(() => UIState.idle); if (reactionState is MarkAsMailboxReadAllSuccess) { _handleMarkEmailsAsReadByMailboxId(reactionState.mailboxId); @@ -350,17 +353,30 @@ class ThreadController extends BaseController with EmailActionController { mailboxDashBoardController.handleMoveEmailsToMailbox( originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds, destinationMailboxId: reactionState.destinationMailboxId, + moveAction: reactionState.moveAction, ); + _checkIfCurrentMailboxCanLoadMore(); } else if (reactionState is MoveMultipleEmailToMailboxAllSuccess) { mailboxDashBoardController.handleMoveEmailsToMailbox( originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds, destinationMailboxId: reactionState.destinationMailboxId, + moveAction: reactionState.moveAction, ); + _checkIfCurrentMailboxCanLoadMore(); } else if (reactionState is MoveMultipleEmailToMailboxHasSomeEmailFailure) { mailboxDashBoardController.handleMoveEmailsToMailbox( originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithMoveSucceededEmailIds, destinationMailboxId: reactionState.destinationMailboxId, + moveAction: reactionState.moveAction, ); + _checkIfCurrentMailboxCanLoadMore(); + } else if (reactionState is DeleteEmailPermanentlySuccess + || reactionState is DeleteMultipleEmailsPermanentlyAllSuccess + || reactionState is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure + ) { + WidgetsBinding.instance.addPostFrameCallback((_) { + _checkIfCurrentMailboxCanLoadMore(); + }); } }); } @@ -376,6 +392,18 @@ class ThreadController extends BaseController with EmailActionController { mailboxDashBoardController.emailsInCurrentMailbox.refresh(); } + void _checkIfCurrentMailboxCanLoadMore() { + final currentMailbox = mailboxDashBoardController.selectedMailbox.value; + if (currentMailbox == null) return; + + final totalEmailsCount = currentMailbox.totalEmails?.value.value ?? 0; + if (totalEmailsCount == 0 + || mailboxDashBoardController.emailsInCurrentMailbox.isNotEmpty + ) return; + + dispatchState(Right(GetAllEmailLoading())); + } + void _registerBrowserResizeListener() { _resizeBrowserStreamSubscription = html.window.onResize.listen((_) { _validateBrowserHeight();