From 3541ac085ecf182889b61438d8a521def5bb2270 Mon Sep 17 00:00:00 2001 From: DatDang Date: Fri, 3 Jan 2025 15:12:53 +0700 Subject: [PATCH] TF-3385 Fix mark as read not work properly --- .../controller/single_email_controller.dart | 2 +- .../presentation/mailbox_controller.dart | 40 ++++++++++--------- .../mailbox_dashboard_controller.dart | 2 +- .../mark_as_multiple_email_read_state.dart | 12 +++--- ...ark_as_multiple_email_read_interactor.dart | 12 ++++-- .../list_presentation_email_extension.dart | 11 +++++ 6 files changed, 50 insertions(+), 29 deletions(-) diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 2c9868b08..901d64fe5 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -673,7 +673,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { if (_currentEmailId != null) { mailboxDashBoardController.updateEmailFlagByEmailIds( [_currentEmailId!], - readAction: ReadActions.markAsRead, + readAction: readActions, ); } if (readActions == ReadActions.markAsUnread) { diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index ad8ff7577..43f6d6d17 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -281,25 +281,29 @@ class MailboxController extends BaseMailboxController : null, ); } else if (reactionState is MarkAsMultipleEmailReadAllSuccess) { - _handleMarkEmailsAsReadOrUnread( - affectedMailboxId: reactionState.mailboxId, - readCount: reactionState.readActions == ReadActions.markAsRead - ? reactionState.emailIds.length - : null, - unreadCount: reactionState.readActions == ReadActions.markAsUnread - ? reactionState.emailIds.length - : null, - ); + for (var emailIdsByMailboxId in reactionState.markSuccessEmailIdsByMailboxId.entries) { + _handleMarkEmailsAsReadOrUnread( + affectedMailboxId: emailIdsByMailboxId.key, + readCount: reactionState.readActions == ReadActions.markAsRead + ? emailIdsByMailboxId.value.length + : null, + unreadCount: reactionState.readActions == ReadActions.markAsUnread + ? emailIdsByMailboxId.value.length + : null, + ); + } } else if (reactionState is MarkAsMultipleEmailReadHasSomeEmailFailure) { - _handleMarkEmailsAsReadOrUnread( - affectedMailboxId: reactionState.mailboxId, - readCount: reactionState.readActions == ReadActions.markAsRead - ? reactionState.successEmailIds.length - : null, - unreadCount: reactionState.readActions == ReadActions.markAsUnread - ? reactionState.successEmailIds.length - : null, - ); + for (var emailIdsByMailboxId in reactionState.markSuccessEmailIdsByMailboxId.entries) { + _handleMarkEmailsAsReadOrUnread( + affectedMailboxId: emailIdsByMailboxId.key, + readCount: reactionState.readActions == ReadActions.markAsRead + ? emailIdsByMailboxId.value.length + : null, + unreadCount: reactionState.readActions == ReadActions.markAsUnread + ? emailIdsByMailboxId.value.length + : null, + ); + } } else if (reactionState is MarkAsMailboxReadAllSuccess) { _handleMarkMailboxAsRead( affectedMailboxId: reactionState.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 63914b9fb..1cf4e630b 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -967,7 +967,7 @@ class MailboxDashBoardController extends ReloadableController accountId.value!, listEmailNeedMarkAsRead.listEmailIds, readActions, - listPresentationEmail.firstOrNull?.mailboxContain?.mailboxId, + listEmailNeedMarkAsRead.emailIdsByMailboxId, )); } } diff --git a/lib/features/thread/domain/state/mark_as_multiple_email_read_state.dart b/lib/features/thread/domain/state/mark_as_multiple_email_read_state.dart index 0eb6ab7fc..c3c322f5b 100644 --- a/lib/features/thread/domain/state/mark_as_multiple_email_read_state.dart +++ b/lib/features/thread/domain/state/mark_as_multiple_email_read_state.dart @@ -9,16 +9,16 @@ class LoadingMarkAsMultipleEmailReadAll extends UIState {} class MarkAsMultipleEmailReadAllSuccess extends UIState { final List emailIds; final ReadActions readActions; - final MailboxId? mailboxId; + final Map> markSuccessEmailIdsByMailboxId; MarkAsMultipleEmailReadAllSuccess( this.emailIds, this.readActions, - this.mailboxId, + this.markSuccessEmailIdsByMailboxId, ); @override - List get props => [emailIds, readActions, mailboxId]; + List get props => [emailIds, readActions, markSuccessEmailIdsByMailboxId]; } class MarkAsMultipleEmailReadAllFailure extends FeatureFailure { @@ -33,16 +33,16 @@ class MarkAsMultipleEmailReadAllFailure extends FeatureFailure { class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState { final List successEmailIds; final ReadActions readActions; - final MailboxId? mailboxId; + final Map> markSuccessEmailIdsByMailboxId; MarkAsMultipleEmailReadHasSomeEmailFailure( this.successEmailIds, this.readActions, - this.mailboxId, + this.markSuccessEmailIdsByMailboxId, ); @override - List get props => [successEmailIds, readActions, mailboxId]; + List get props => [successEmailIds, readActions, markSuccessEmailIdsByMailboxId]; } class MarkAsMultipleEmailReadFailure extends FeatureFailure { diff --git a/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart b/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart index 5bd076361..505a15642 100644 --- a/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart +++ b/lib/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart @@ -19,7 +19,7 @@ class MarkAsMultipleEmailReadInteractor { AccountId accountId, List emailIds, ReadActions readAction, - MailboxId? mailboxId, + Map> emailIdsByMailboxId, ) async* { try { yield Right(LoadingMarkAsMultipleEmailReadAll()); @@ -30,12 +30,18 @@ class MarkAsMultipleEmailReadInteractor { emailIds, readAction, ); + final markSuccessEmailIdsByMailboxId = emailIdsByMailboxId.map( + (key, value) => MapEntry( + key, + value.where(result.emailIdsSuccess.contains).toList(), + ), + ); if (emailIds.length == result.emailIdsSuccess.length) { yield Right(MarkAsMultipleEmailReadAllSuccess( result.emailIdsSuccess, readAction, - mailboxId, + markSuccessEmailIdsByMailboxId, )); } else if (result.emailIdsSuccess.isEmpty) { yield Left(MarkAsMultipleEmailReadAllFailure(readAction)); @@ -43,7 +49,7 @@ class MarkAsMultipleEmailReadInteractor { yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure( result.emailIdsSuccess, readAction, - mailboxId, + markSuccessEmailIdsByMailboxId, )); } } catch (e) { diff --git a/model/lib/extensions/list_presentation_email_extension.dart b/model/lib/extensions/list_presentation_email_extension.dart index 2535b39a8..b4260a9b8 100644 --- a/model/lib/extensions/list_presentation_email_extension.dart +++ b/model/lib/extensions/list_presentation_email_extension.dart @@ -22,6 +22,17 @@ extension ListPresentationEmailExtension on List { List get listEmailIds => map((email) => email.id).whereNotNull().toList(); + Map> get emailIdsByMailboxId => Map.from( + where((email) => email.mailboxContain?.mailboxId != null && email.id != null) + .fold(>{}, (combine, email) { + final mailboxId = email.mailboxContain!.mailboxId!; + combine[mailboxId] ??= []; + combine[mailboxId]!.add(email.id!); + return combine; + } + ), + ); + bool isAllCanDeletePermanently(Map mapMailbox) { final listMailboxContain = map((email) => email.findMailboxContain(mapMailbox)) .whereType()