TF-3385 Fix mark as read not work properly

This commit is contained in:
DatDang
2025-01-03 15:12:53 +07:00
committed by Dat H. Pham
parent 6396b50bc9
commit 3541ac085e
6 changed files with 50 additions and 29 deletions
@@ -673,7 +673,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
if (_currentEmailId != null) { if (_currentEmailId != null) {
mailboxDashBoardController.updateEmailFlagByEmailIds( mailboxDashBoardController.updateEmailFlagByEmailIds(
[_currentEmailId!], [_currentEmailId!],
readAction: ReadActions.markAsRead, readAction: readActions,
); );
} }
if (readActions == ReadActions.markAsUnread) { if (readActions == ReadActions.markAsUnread) {
@@ -281,25 +281,29 @@ class MailboxController extends BaseMailboxController
: null, : null,
); );
} else if (reactionState is MarkAsMultipleEmailReadAllSuccess) { } else if (reactionState is MarkAsMultipleEmailReadAllSuccess) {
_handleMarkEmailsAsReadOrUnread( for (var emailIdsByMailboxId in reactionState.markSuccessEmailIdsByMailboxId.entries) {
affectedMailboxId: reactionState.mailboxId, _handleMarkEmailsAsReadOrUnread(
readCount: reactionState.readActions == ReadActions.markAsRead affectedMailboxId: emailIdsByMailboxId.key,
? reactionState.emailIds.length readCount: reactionState.readActions == ReadActions.markAsRead
: null, ? emailIdsByMailboxId.value.length
unreadCount: reactionState.readActions == ReadActions.markAsUnread : null,
? reactionState.emailIds.length unreadCount: reactionState.readActions == ReadActions.markAsUnread
: null, ? emailIdsByMailboxId.value.length
); : null,
);
}
} else if (reactionState is MarkAsMultipleEmailReadHasSomeEmailFailure) { } else if (reactionState is MarkAsMultipleEmailReadHasSomeEmailFailure) {
_handleMarkEmailsAsReadOrUnread( for (var emailIdsByMailboxId in reactionState.markSuccessEmailIdsByMailboxId.entries) {
affectedMailboxId: reactionState.mailboxId, _handleMarkEmailsAsReadOrUnread(
readCount: reactionState.readActions == ReadActions.markAsRead affectedMailboxId: emailIdsByMailboxId.key,
? reactionState.successEmailIds.length readCount: reactionState.readActions == ReadActions.markAsRead
: null, ? emailIdsByMailboxId.value.length
unreadCount: reactionState.readActions == ReadActions.markAsUnread : null,
? reactionState.successEmailIds.length unreadCount: reactionState.readActions == ReadActions.markAsUnread
: null, ? emailIdsByMailboxId.value.length
); : null,
);
}
} else if (reactionState is MarkAsMailboxReadAllSuccess) { } else if (reactionState is MarkAsMailboxReadAllSuccess) {
_handleMarkMailboxAsRead( _handleMarkMailboxAsRead(
affectedMailboxId: reactionState.mailboxId, affectedMailboxId: reactionState.mailboxId,
@@ -967,7 +967,7 @@ class MailboxDashBoardController extends ReloadableController
accountId.value!, accountId.value!,
listEmailNeedMarkAsRead.listEmailIds, listEmailNeedMarkAsRead.listEmailIds,
readActions, readActions,
listPresentationEmail.firstOrNull?.mailboxContain?.mailboxId, listEmailNeedMarkAsRead.emailIdsByMailboxId,
)); ));
} }
} }
@@ -9,16 +9,16 @@ class LoadingMarkAsMultipleEmailReadAll extends UIState {}
class MarkAsMultipleEmailReadAllSuccess extends UIState { class MarkAsMultipleEmailReadAllSuccess extends UIState {
final List<EmailId> emailIds; final List<EmailId> emailIds;
final ReadActions readActions; final ReadActions readActions;
final MailboxId? mailboxId; final Map<MailboxId, List<EmailId>> markSuccessEmailIdsByMailboxId;
MarkAsMultipleEmailReadAllSuccess( MarkAsMultipleEmailReadAllSuccess(
this.emailIds, this.emailIds,
this.readActions, this.readActions,
this.mailboxId, this.markSuccessEmailIdsByMailboxId,
); );
@override @override
List<Object?> get props => [emailIds, readActions, mailboxId]; List<Object?> get props => [emailIds, readActions, markSuccessEmailIdsByMailboxId];
} }
class MarkAsMultipleEmailReadAllFailure extends FeatureFailure { class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
@@ -33,16 +33,16 @@ class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState { class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState {
final List<EmailId> successEmailIds; final List<EmailId> successEmailIds;
final ReadActions readActions; final ReadActions readActions;
final MailboxId? mailboxId; final Map<MailboxId, List<EmailId>> markSuccessEmailIdsByMailboxId;
MarkAsMultipleEmailReadHasSomeEmailFailure( MarkAsMultipleEmailReadHasSomeEmailFailure(
this.successEmailIds, this.successEmailIds,
this.readActions, this.readActions,
this.mailboxId, this.markSuccessEmailIdsByMailboxId,
); );
@override @override
List<Object?> get props => [successEmailIds, readActions, mailboxId]; List<Object?> get props => [successEmailIds, readActions, markSuccessEmailIdsByMailboxId];
} }
class MarkAsMultipleEmailReadFailure extends FeatureFailure { class MarkAsMultipleEmailReadFailure extends FeatureFailure {
@@ -19,7 +19,7 @@ class MarkAsMultipleEmailReadInteractor {
AccountId accountId, AccountId accountId,
List<EmailId> emailIds, List<EmailId> emailIds,
ReadActions readAction, ReadActions readAction,
MailboxId? mailboxId, Map<MailboxId, List<EmailId>> emailIdsByMailboxId,
) async* { ) async* {
try { try {
yield Right(LoadingMarkAsMultipleEmailReadAll()); yield Right(LoadingMarkAsMultipleEmailReadAll());
@@ -30,12 +30,18 @@ class MarkAsMultipleEmailReadInteractor {
emailIds, emailIds,
readAction, readAction,
); );
final markSuccessEmailIdsByMailboxId = emailIdsByMailboxId.map(
(key, value) => MapEntry(
key,
value.where(result.emailIdsSuccess.contains).toList(),
),
);
if (emailIds.length == result.emailIdsSuccess.length) { if (emailIds.length == result.emailIdsSuccess.length) {
yield Right(MarkAsMultipleEmailReadAllSuccess( yield Right(MarkAsMultipleEmailReadAllSuccess(
result.emailIdsSuccess, result.emailIdsSuccess,
readAction, readAction,
mailboxId, markSuccessEmailIdsByMailboxId,
)); ));
} else if (result.emailIdsSuccess.isEmpty) { } else if (result.emailIdsSuccess.isEmpty) {
yield Left(MarkAsMultipleEmailReadAllFailure(readAction)); yield Left(MarkAsMultipleEmailReadAllFailure(readAction));
@@ -43,7 +49,7 @@ class MarkAsMultipleEmailReadInteractor {
yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure( yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(
result.emailIdsSuccess, result.emailIdsSuccess,
readAction, readAction,
mailboxId, markSuccessEmailIdsByMailboxId,
)); ));
} }
} catch (e) { } catch (e) {
@@ -22,6 +22,17 @@ extension ListPresentationEmailExtension on List<PresentationEmail> {
List<EmailId> get listEmailIds => map((email) => email.id).whereNotNull().toList(); List<EmailId> get listEmailIds => map((email) => email.id).whereNotNull().toList();
Map<MailboxId, List<EmailId>> get emailIdsByMailboxId => Map.from(
where((email) => email.mailboxContain?.mailboxId != null && email.id != null)
.fold(<MailboxId, List<EmailId>>{}, (combine, email) {
final mailboxId = email.mailboxContain!.mailboxId!;
combine[mailboxId] ??= [];
combine[mailboxId]!.add(email.id!);
return combine;
}
),
);
bool isAllCanDeletePermanently(Map<MailboxId, PresentationMailbox> mapMailbox) { bool isAllCanDeletePermanently(Map<MailboxId, PresentationMailbox> mapMailbox) {
final listMailboxContain = map((email) => email.findMailboxContain(mapMailbox)) final listMailboxContain = map((email) => email.findMailboxContain(mapMailbox))
.whereType<PresentationMailbox>() .whereType<PresentationMailbox>()