TF-3385 Fix loading forever when empty <20 items mailbox

This commit is contained in:
DatDang
2025-01-06 16:32:51 +07:00
committed by Dat H. Pham
parent e9a8f498d3
commit 047df54627
2 changed files with 48 additions and 16 deletions
@@ -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/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/email/presentation_email.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'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
extension MoveEmailsToMailboxExtension on MailboxDashBoardController { extension MoveEmailsToMailboxExtension on MailboxDashBoardController {
void handleMoveEmailsToMailbox({ void handleMoveEmailsToMailbox({
required Map<MailboxId,List<EmailId>> originalMailboxIdsWithEmailIds, required Map<MailboxId,List<EmailId>> originalMailboxIdsWithEmailIds,
required MailboxId destinationMailboxId, required MailboxId destinationMailboxId,
required MoveAction moveAction,
}) { }) {
if (destinationMailboxId == selectedMailbox.value?.id) return;
final currentEmails = List<PresentationEmail>.from( final currentEmails = List<PresentationEmail>.from(
emailsInCurrentMailbox, emailsInCurrentMailbox,
); );
@@ -23,9 +24,18 @@ extension MoveEmailsToMailboxExtension on MailboxDashBoardController {
final currentEmailsToBeMoved = currentEmails final currentEmailsToBeMoved = currentEmails
.where((email) => movedEmailIds.contains(email.id)) .where((email) => movedEmailIds.contains(email.id))
.toList(); .toList();
if (currentEmailsToBeMoved.isNotEmpty && destinationMailboxId != selectedMailbox.value?.id) { if (currentEmailsToBeMoved.isNotEmpty) {
currentEmails.removeWhere(currentEmailsToBeMoved.contains); currentEmails.removeWhere(currentEmailsToBeMoved.contains);
updateEmailList(currentEmails); 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)),
);
}
} }
} }
@@ -356,32 +356,38 @@ class ThreadController extends BaseController with EmailActionController {
mailboxDashBoardController.handleMoveEmailsToMailbox( mailboxDashBoardController.handleMoveEmailsToMailbox(
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds, originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds,
destinationMailboxId: reactionState.destinationMailboxId, destinationMailboxId: reactionState.destinationMailboxId,
moveAction: reactionState.moveAction,
); );
_checkIfCurrentMailboxCanLoadMore(); _checkIfCurrentMailboxCanLoadMore();
} else if (reactionState is MoveMultipleEmailToMailboxAllSuccess) { } else if (reactionState is MoveMultipleEmailToMailboxAllSuccess) {
mailboxDashBoardController.handleMoveEmailsToMailbox( mailboxDashBoardController.handleMoveEmailsToMailbox(
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds, originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithEmailIds,
destinationMailboxId: reactionState.destinationMailboxId, destinationMailboxId: reactionState.destinationMailboxId,
moveAction: reactionState.moveAction,
); );
_checkIfCurrentMailboxCanLoadMore(); _checkIfCurrentMailboxCanLoadMore();
} else if (reactionState is MoveMultipleEmailToMailboxHasSomeEmailFailure) { } else if (reactionState is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
mailboxDashBoardController.handleMoveEmailsToMailbox( mailboxDashBoardController.handleMoveEmailsToMailbox(
originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithMoveSucceededEmailIds, originalMailboxIdsWithEmailIds: reactionState.originalMailboxIdsWithMoveSucceededEmailIds,
destinationMailboxId: reactionState.destinationMailboxId, destinationMailboxId: reactionState.destinationMailboxId,
moveAction: reactionState.moveAction,
); );
WidgetsBinding.instance.addPostFrameCallback((_) { _checkIfCurrentMailboxCanLoadMore();
_checkIfCurrentMailboxCanLoadMore(); } else if (reactionState is DeleteEmailPermanentlySuccess) {
}); _handleDeleteEmailsPermanentlyFromMailboxId(
} else if (reactionState is DeleteEmailPermanentlySuccess reactionState.mailboxId,
|| reactionState is DeleteMultipleEmailsPermanentlyAllSuccess deletedEmailsCount: 1,
|| reactionState is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure );
) { _checkIfCurrentMailboxCanLoadMore();
WidgetsBinding.instance.addPostFrameCallback((_) { } else if (reactionState is DeleteMultipleEmailsPermanentlyAllSuccess) {
_checkIfCurrentMailboxCanLoadMore(); _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(); 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() { void _checkIfCurrentMailboxCanLoadMore() {
final currentMailbox = mailboxDashBoardController.selectedMailbox.value; final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
if (currentMailbox == null) return; if (currentMailbox == null) return;