From 047df54627ccc1c8bf653cd1854300e3ee0b57e8 Mon Sep 17 00:00:00 2001 From: DatDang Date: Mon, 6 Jan 2025 16:32:51 +0700 Subject: [PATCH] TF-3385 Fix loading forever when empty <20 items mailbox --- .../move_emails_to_mailbox_extension.dart | 16 +++++-- .../presentation/thread_controller.dart | 48 ++++++++++++++----- 2 files changed, 48 insertions(+), 16 deletions(-) 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 468d3f523..c3634a7b9 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,16 @@ +import 'package:jmap_dart_client/jmap/core/unsigned_int.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/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, ); @@ -23,9 +24,18 @@ extension MoveEmailsToMailboxExtension on MailboxDashBoardController { final currentEmailsToBeMoved = currentEmails .where((email) => movedEmailIds.contains(email.id)) .toList(); - if (currentEmailsToBeMoved.isNotEmpty && destinationMailboxId != selectedMailbox.value?.id) { + if (currentEmailsToBeMoved.isNotEmpty) { currentEmails.removeWhere(currentEmailsToBeMoved.contains); updateEmailList(currentEmails); } + final currentMailbox = selectedMailbox.value; + final currentTotalEmails = currentMailbox?.totalEmails; + if (currentMailbox != null && currentTotalEmails != null) { + int newTotalEmails = currentTotalEmails.value.value.toInt() - movedEmailIds.length; + if (newTotalEmails < 0) newTotalEmails = 0; + selectedMailbox.value = currentMailbox.copyWith( + totalEmails: TotalEmails(UnsignedInt(newTotalEmails)), + ); + } } } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 51880dfe4..03d8d4da5 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -356,32 +356,38 @@ 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, ); - WidgetsBinding.instance.addPostFrameCallback((_) { - _checkIfCurrentMailboxCanLoadMore(); - }); - } else if (reactionState is DeleteEmailPermanentlySuccess - || reactionState is DeleteMultipleEmailsPermanentlyAllSuccess - || reactionState is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure - ) { - WidgetsBinding.instance.addPostFrameCallback((_) { - _checkIfCurrentMailboxCanLoadMore(); - }); + _checkIfCurrentMailboxCanLoadMore(); + } else if (reactionState is DeleteEmailPermanentlySuccess) { + _handleDeleteEmailsPermanentlyFromMailboxId( + reactionState.mailboxId, + deletedEmailsCount: 1, + ); + _checkIfCurrentMailboxCanLoadMore(); + } else if (reactionState is DeleteMultipleEmailsPermanentlyAllSuccess) { + _handleDeleteEmailsPermanentlyFromMailboxId( + reactionState.mailboxId, + deletedEmailsCount: reactionState.emailIds.length, + ); + _checkIfCurrentMailboxCanLoadMore(); + } else if (reactionState is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { + _handleDeleteEmailsPermanentlyFromMailboxId( + reactionState.mailboxId, + deletedEmailsCount: reactionState.emailIds.length, + ); + _checkIfCurrentMailboxCanLoadMore(); } }); } @@ -397,6 +403,22 @@ class ThreadController extends BaseController with EmailActionController { mailboxDashBoardController.emailsInCurrentMailbox.refresh(); } + void _handleDeleteEmailsPermanentlyFromMailboxId( + MailboxId? mailboxId, { + required int deletedEmailsCount, + }) { + if (mailboxDashBoardController.selectedMailbox.value?.id != mailboxId) return; + final currentMailbox = mailboxDashBoardController.selectedMailbox.value; + final currentTotalEmails = currentMailbox?.totalEmails; + if (currentMailbox != null && currentTotalEmails != null) { + int newTotalEmails = currentTotalEmails.value.value.toInt() - deletedEmailsCount; + if (newTotalEmails < 0) newTotalEmails = 0; + mailboxDashBoardController.selectedMailbox.value = currentMailbox.copyWith( + totalEmails: TotalEmails(UnsignedInt(newTotalEmails)), + ); + } + } + void _checkIfCurrentMailboxCanLoadMore() { final currentMailbox = mailboxDashBoardController.selectedMailbox.value; if (currentMailbox == null) return;