diff --git a/lib/features/composer/domain/state/save_email_as_drafts_state.dart b/lib/features/composer/domain/state/save_email_as_drafts_state.dart index c0c657d25..d9a985bd3 100644 --- a/lib/features/composer/domain/state/save_email_as_drafts_state.dart +++ b/lib/features/composer/domain/state/save_email_as_drafts_state.dart @@ -1,5 +1,7 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; class SaveEmailAsDraftsLoading extends UIState { @@ -9,11 +11,17 @@ class SaveEmailAsDraftsLoading extends UIState { List get props => []; } -class SaveEmailAsDraftsSuccess extends UIState { +class SaveEmailAsDraftsSuccess extends UIActionState { final Email emailAsDrafts; - SaveEmailAsDraftsSuccess(this.emailAsDrafts); + SaveEmailAsDraftsSuccess( + this.emailAsDrafts, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => []; diff --git a/lib/features/composer/domain/state/send_email_state.dart b/lib/features/composer/domain/state/send_email_state.dart index da348715b..56f0772b9 100644 --- a/lib/features/composer/domain/state/send_email_state.dart +++ b/lib/features/composer/domain/state/send_email_state.dart @@ -1,4 +1,6 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; class SendingEmailState extends UIState { SendingEmailState(); @@ -7,9 +9,12 @@ class SendingEmailState extends UIState { List get props => []; } -class SendEmailSuccess extends UIState { +class SendEmailSuccess extends UIActionState { - SendEmailSuccess(); + SendEmailSuccess({ + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + }) : super(currentEmailState, currentMailboxState); @override List get props => []; diff --git a/lib/features/composer/domain/state/update_email_drafts_state.dart b/lib/features/composer/domain/state/update_email_drafts_state.dart index b70bd3fb9..9729723a2 100644 --- a/lib/features/composer/domain/state/update_email_drafts_state.dart +++ b/lib/features/composer/domain/state/update_email_drafts_state.dart @@ -1,5 +1,7 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; class UpdatingEmailDrafts extends UIState { @@ -9,11 +11,17 @@ class UpdatingEmailDrafts extends UIState { List get props => []; } -class UpdateEmailDraftsSuccess extends UIState { +class UpdateEmailDraftsSuccess extends UIActionState { final Email emailAsDrafts; - UpdateEmailDraftsSuccess(this.emailAsDrafts); + UpdateEmailDraftsSuccess( + this.emailAsDrafts, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => []; diff --git a/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart b/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart index 91e580f5f..c58ea8424 100644 --- a/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart +++ b/lib/features/composer/domain/usecases/save_email_as_drafts_interactor.dart @@ -4,18 +4,32 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; class SaveEmailAsDraftsInteractor { - final EmailRepository emailRepository; + final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - SaveEmailAsDraftsInteractor(this.emailRepository); + SaveEmailAsDraftsInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, Email email) async* { try { yield Right(SaveEmailAsDraftsLoading()); - final emailAsDrafts = await emailRepository.saveEmailAsDrafts(accountId, email); + + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + + final emailAsDrafts = await _emailRepository.saveEmailAsDrafts(accountId, email); if (emailAsDrafts != null) { - yield Right(SaveEmailAsDraftsSuccess(emailAsDrafts)); + yield Right(SaveEmailAsDraftsSuccess( + emailAsDrafts, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else { yield Left(SaveEmailAsDraftsFailure(null)); } diff --git a/lib/features/composer/domain/usecases/send_email_interactor.dart b/lib/features/composer/domain/usecases/send_email_interactor.dart index a830615f4..c142899cf 100644 --- a/lib/features/composer/domain/usecases/send_email_interactor.dart +++ b/lib/features/composer/domain/usecases/send_email_interactor.dart @@ -4,18 +4,31 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; class SendEmailInteractor { - final EmailRepository emailRepository; + final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - SendEmailInteractor(this.emailRepository); + SendEmailInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, EmailRequest emailRequest) async* { try { yield Right(SendingEmailState()); - final result = await emailRepository.sendEmail(accountId, emailRequest); + + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + + final result = await _emailRepository.sendEmail(accountId, emailRequest); if (result) { - yield Right(SendEmailSuccess()); + yield Right(SendEmailSuccess( + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else { yield Left(SendEmailFailure(result)); } diff --git a/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart b/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart index 9bfe218d7..c481d16d6 100644 --- a/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart +++ b/lib/features/composer/domain/usecases/update_email_drafts_interactor.dart @@ -4,18 +4,32 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; class UpdateEmailDraftsInteractor { - final EmailRepository emailRepository; + final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - UpdateEmailDraftsInteractor(this.emailRepository); + UpdateEmailDraftsInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, Email newEmail, EmailId oldEmailId) async* { try { yield Right(UpdatingEmailDrafts()); - final newEmailDrafts = await emailRepository.updateEmailDrafts(accountId, newEmail, oldEmailId); + + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + + final newEmailDrafts = await _emailRepository.updateEmailDrafts(accountId, newEmail, oldEmailId); if (newEmailDrafts != null) { - yield Right(UpdateEmailDraftsSuccess(newEmailDrafts)); + yield Right(UpdateEmailDraftsSuccess( + newEmailDrafts, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else { yield Left(UpdateEmailDraftsFailure(null)); } diff --git a/lib/features/email/domain/state/delete_email_permanently_state.dart b/lib/features/email/domain/state/delete_email_permanently_state.dart index cb19f6637..a33ff2f18 100644 --- a/lib/features/email/domain/state/delete_email_permanently_state.dart +++ b/lib/features/email/domain/state/delete_email_permanently_state.dart @@ -1,8 +1,13 @@ import 'package:core/core.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; -class DeleteEmailPermanentlySuccess extends UIState { +class DeleteEmailPermanentlySuccess extends UIActionState { - DeleteEmailPermanentlySuccess(); + DeleteEmailPermanentlySuccess({ + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + }) : super(currentEmailState, currentMailboxState); @override List get props => []; @@ -10,7 +15,7 @@ class DeleteEmailPermanentlySuccess extends UIState { class DeleteEmailPermanentlyFailure extends FeatureFailure { - final exception; + final dynamic exception; DeleteEmailPermanentlyFailure(this.exception); 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 3fdbdb9bf..4ca7e2e93 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 @@ -1,21 +1,35 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; -class DeleteMultipleEmailsPermanentlyAllSuccess extends UIState { +class DeleteMultipleEmailsPermanentlyAllSuccess extends UIActionState { List emailIds; - DeleteMultipleEmailsPermanentlyAllSuccess(this.emailIds); + DeleteMultipleEmailsPermanentlyAllSuccess( + this.emailIds, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [emailIds]; } -class DeleteMultipleEmailsPermanentlyHasSomeEmailFailure extends UIState { +class DeleteMultipleEmailsPermanentlyHasSomeEmailFailure extends UIActionState { List emailIds; - DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(this.emailIds); + DeleteMultipleEmailsPermanentlyHasSomeEmailFailure( + this.emailIds, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [emailIds]; @@ -31,7 +45,7 @@ class DeleteMultipleEmailsPermanentlyAllFailure extends FeatureFailure { class DeleteMultipleEmailsPermanentlyFailure extends FeatureFailure { - final exception; + final dynamic exception; DeleteMultipleEmailsPermanentlyFailure(this.exception); diff --git a/lib/features/email/domain/state/mark_as_email_read_state.dart b/lib/features/email/domain/state/mark_as_email_read_state.dart index 4f5612f51..968c8645b 100644 --- a/lib/features/email/domain/state/mark_as_email_read_state.dart +++ b/lib/features/email/domain/state/mark_as_email_read_state.dart @@ -1,20 +1,29 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/email/read_actions.dart'; import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; -class MarkAsEmailReadSuccess extends UIState { +class MarkAsEmailReadSuccess extends UIActionState { final Email updatedEmail; final ReadActions readActions; - MarkAsEmailReadSuccess(this.updatedEmail, this.readActions); + MarkAsEmailReadSuccess( + this.updatedEmail, + this.readActions, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [updatedEmail, readActions]; } class MarkAsEmailReadFailure extends FeatureFailure { - final exception; + final dynamic exception; final ReadActions readActions; MarkAsEmailReadFailure(this.exception, this.readActions); diff --git a/lib/features/email/domain/state/mark_as_email_star_state.dart b/lib/features/email/domain/state/mark_as_email_star_state.dart index e7c4844b2..cf42559ef 100644 --- a/lib/features/email/domain/state/mark_as_email_star_state.dart +++ b/lib/features/email/domain/state/mark_as_email_star_state.dart @@ -1,19 +1,28 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; -class MarkAsStarEmailSuccess extends UIState { +class MarkAsStarEmailSuccess extends UIActionState { final Email updatedEmail; final MarkStarAction markStarAction; - MarkAsStarEmailSuccess(this.updatedEmail, this.markStarAction); + MarkAsStarEmailSuccess( + this.updatedEmail, + this.markStarAction, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [updatedEmail, markStarAction]; } class MarkAsStarEmailFailure extends FeatureFailure { - final exception; + final dynamic exception; final MarkStarAction markStarAction; MarkAsStarEmailFailure(this.exception, this.markStarAction); diff --git a/lib/features/email/domain/state/move_to_mailbox_state.dart b/lib/features/email/domain/state/move_to_mailbox_state.dart index ee86a75cd..f687ee7d1 100644 --- a/lib/features/email/domain/state/move_to_mailbox_state.dart +++ b/lib/features/email/domain/state/move_to_mailbox_state.dart @@ -1,10 +1,12 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; -class MoveToMailboxSuccess extends UIState { +class MoveToMailboxSuccess extends UIActionState { final EmailId emailId; final MailboxId currentMailboxId; final MailboxId destinationMailboxId; @@ -18,8 +20,12 @@ class MoveToMailboxSuccess extends UIState { this.destinationMailboxId, this.moveAction, this.emailActionType, - {this.destinationPath} - ); + { + this.destinationPath, + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [ @@ -34,7 +40,7 @@ class MoveToMailboxSuccess extends UIState { class MoveToMailboxFailure extends FeatureFailure { final EmailActionType emailActionType; - final exception; + final dynamic exception; MoveToMailboxFailure(this.emailActionType, this.exception); diff --git a/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart b/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart index d3626e502..e298ad514 100644 --- a/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart +++ b/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart @@ -4,17 +4,29 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; class DeleteEmailPermanentlyInteractor { - final EmailRepository emailRepository; + final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - DeleteEmailPermanentlyInteractor(this.emailRepository); + DeleteEmailPermanentlyInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, EmailId emailId) async* { try { - final result = await emailRepository.deleteEmailPermanently(accountId, emailId); + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + + final result = await _emailRepository.deleteEmailPermanently(accountId, emailId); if (result) { - yield Right(DeleteEmailPermanentlySuccess()); + yield Right(DeleteEmailPermanentlySuccess( + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else { yield Left(DeleteEmailPermanentlyFailure(null)); } diff --git a/lib/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart b/lib/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart index 1d3e6a7de..00ab0869f 100644 --- a/lib/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart +++ b/lib/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart @@ -4,19 +4,35 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; class DeleteMultipleEmailsPermanentlyInteractor { - final EmailRepository emailRepository; + final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - DeleteMultipleEmailsPermanentlyInteractor(this.emailRepository); + DeleteMultipleEmailsPermanentlyInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, List emailIds) async* { try { - final listResult = await emailRepository.deleteMultipleEmailsPermanently(accountId, emailIds); + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + + final listResult = await _emailRepository.deleteMultipleEmailsPermanently(accountId, emailIds); if (listResult.length == emailIds.length) { - yield Right(DeleteMultipleEmailsPermanentlyAllSuccess(listResult)); + yield Right(DeleteMultipleEmailsPermanentlyAllSuccess( + listResult, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else if (listResult.isNotEmpty) { - yield Right(DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(listResult)); + yield Right(DeleteMultipleEmailsPermanentlyHasSomeEmailFailure( + listResult, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else { yield Left(DeleteMultipleEmailsPermanentlyAllFailure()); } diff --git a/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart b/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart index 858b2d3cf..cf605c9f7 100644 --- a/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart +++ b/lib/features/email/domain/usecases/mark_as_email_read_interactor.dart @@ -5,18 +5,32 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; class MarkAsEmailReadInteractor { final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - MarkAsEmailReadInteractor(this._emailRepository); + MarkAsEmailReadInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, Email email, ReadActions readAction) async* { try { + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + final result = await _emailRepository.markAsRead(accountId, [email], readAction); if (result.isNotEmpty) { final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords); - yield Right(MarkAsEmailReadSuccess(updatedEmail, readAction)); + yield Right(MarkAsEmailReadSuccess( + updatedEmail, + readAction, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else { yield Left(MarkAsEmailReadFailure(null, readAction)); } diff --git a/lib/features/email/domain/usecases/mark_as_star_email_interactor.dart b/lib/features/email/domain/usecases/mark_as_star_email_interactor.dart index 2bd190aa3..1b6fe178d 100644 --- a/lib/features/email/domain/usecases/mark_as_star_email_interactor.dart +++ b/lib/features/email/domain/usecases/mark_as_star_email_interactor.dart @@ -13,10 +13,14 @@ class MarkAsStarEmailInteractor { Stream> execute(AccountId accountId, Email email, MarkStarAction markStarAction) async* { try { + final currentEmailState = await emailRepository.getEmailState(); final result = await emailRepository.markAsStar(accountId, [email], markStarAction); if (result.isNotEmpty) { final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords); - yield Right(MarkAsStarEmailSuccess(updatedEmail, markStarAction)); + yield Right(MarkAsStarEmailSuccess( + updatedEmail, + markStarAction, + currentEmailState: currentEmailState)); } else { yield Left(MarkAsStarEmailFailure(null, markStarAction)); } diff --git a/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart b/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart index 43d5a1f5c..83d108bda 100644 --- a/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart +++ b/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart @@ -4,15 +4,25 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; class MoveToMailboxInteractor { - final EmailRepository emailRepository; + final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - MoveToMailboxInteractor(this.emailRepository); + MoveToMailboxInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* { try { - final result = await emailRepository.moveToMailbox(accountId, moveRequest); + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + + final result = await _emailRepository.moveToMailbox(accountId, moveRequest); if (result.isNotEmpty) { yield Right(MoveToMailboxSuccess( result.first, @@ -20,7 +30,9 @@ class MoveToMailboxInteractor { moveRequest.destinationMailboxId, moveRequest.moveAction, moveRequest.emailActionType, - destinationPath: moveRequest.destinationPath)); + destinationPath: moveRequest.destinationPath, + currentMailboxState: currentMailboxState, + currentEmailState: currentEmailState)); } else { yield Left(MoveToMailboxFailure(moveRequest.emailActionType, null)); } diff --git a/lib/features/mailbox/domain/state/create_new_mailbox_state.dart b/lib/features/mailbox/domain/state/create_new_mailbox_state.dart index c61bd6148..976730510 100644 --- a/lib/features/mailbox/domain/state/create_new_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/create_new_mailbox_state.dart @@ -1,11 +1,16 @@ import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; -class CreateNewMailboxSuccess extends UIState { +class CreateNewMailboxSuccess extends UIActionState { final Mailbox newMailbox; - CreateNewMailboxSuccess(this.newMailbox); + CreateNewMailboxSuccess(this.newMailbox, { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + }) : super(currentEmailState, currentMailboxState); @override List get props => [newMailbox]; diff --git a/lib/features/mailbox/domain/state/delete_multiple_mailbox_state.dart b/lib/features/mailbox/domain/state/delete_multiple_mailbox_state.dart index c72f25ff0..8eb972c45 100644 --- a/lib/features/mailbox/domain/state/delete_multiple_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/delete_multiple_mailbox_state.dart @@ -1,11 +1,16 @@ import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; -class DeleteMultipleMailboxSuccess extends UIState { +class DeleteMultipleMailboxSuccess extends UIActionState { final MailboxId mailboxIdDeleted; - DeleteMultipleMailboxSuccess(this.mailboxIdDeleted); + DeleteMultipleMailboxSuccess(this.mailboxIdDeleted, { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + }) : super(currentEmailState, currentMailboxState); @override List get props => [mailboxIdDeleted]; diff --git a/lib/features/mailbox/domain/state/mark_as_mailbox_read_state.dart b/lib/features/mailbox/domain/state/mark_as_mailbox_read_state.dart index 24fca8c2e..7f2b484cb 100644 --- a/lib/features/mailbox/domain/state/mark_as_mailbox_read_state.dart +++ b/lib/features/mailbox/domain/state/mark_as_mailbox_read_state.dart @@ -1,5 +1,7 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; class MarkAsMailboxReadLoading extends UIState { @@ -24,22 +26,34 @@ class UpdatingMarkAsMailboxReadState extends UIState { List get props => [mailboxId, countRead, totalUnread]; } -class MarkAsMailboxReadAllSuccess extends UIState { +class MarkAsMailboxReadAllSuccess extends UIActionState { final MailboxName mailboxName; - MarkAsMailboxReadAllSuccess(this.mailboxName); + MarkAsMailboxReadAllSuccess(this.mailboxName, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentMailboxState, currentEmailState); @override List get props => [mailboxName]; } -class MarkAsMailboxReadHasSomeEmailFailure extends UIState { +class MarkAsMailboxReadHasSomeEmailFailure extends UIActionState { final MailboxName mailboxName; final int countEmailsRead; - MarkAsMailboxReadHasSomeEmailFailure(this.mailboxName, this.countEmailsRead); + MarkAsMailboxReadHasSomeEmailFailure( + this.mailboxName, + this.countEmailsRead, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentMailboxState, currentEmailState); @override List get props => [mailboxName, countEmailsRead]; diff --git a/lib/features/mailbox/domain/state/move_mailbox_state.dart b/lib/features/mailbox/domain/state/move_mailbox_state.dart index 1a3c0fcfe..e33edfaf2 100644 --- a/lib/features/mailbox/domain/state/move_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/move_mailbox_state.dart @@ -1,6 +1,8 @@ import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; class MoveMailboxLoading extends UIState { @@ -10,7 +12,7 @@ class MoveMailboxLoading extends UIState { List get props => []; } -class MoveMailboxSuccess extends UIState { +class MoveMailboxSuccess extends UIActionState { final MailboxId mailboxIdSelected; final MoveAction moveAction; @@ -24,9 +26,11 @@ class MoveMailboxSuccess extends UIState { { this.parentId, this.destinationMailboxId, - this.destinationMailboxName + this.destinationMailboxName, + jmap.State? currentEmailState, + jmap.State? currentMailboxState, } - ); + ) : super(currentEmailState, currentMailboxState); @override List get props => [ diff --git a/lib/features/mailbox/domain/state/rename_mailbox_state.dart b/lib/features/mailbox/domain/state/rename_mailbox_state.dart index ca6a69ee8..2a0b63502 100644 --- a/lib/features/mailbox/domain/state/rename_mailbox_state.dart +++ b/lib/features/mailbox/domain/state/rename_mailbox_state.dart @@ -1,8 +1,13 @@ import 'package:core/core.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; -class RenameMailboxSuccess extends UIState { +class RenameMailboxSuccess extends UIActionState { - RenameMailboxSuccess(); + RenameMailboxSuccess({ + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + }) : super(currentEmailState, currentMailboxState); @override List get props => []; diff --git a/lib/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart index bdabfbe35..38f004000 100644 --- a/lib/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart @@ -6,15 +6,18 @@ import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_reposit import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart'; class CreateNewMailboxInteractor { - final MailboxRepository mailboxRepository; + final MailboxRepository _mailboxRepository; - CreateNewMailboxInteractor(this.mailboxRepository); + CreateNewMailboxInteractor(this._mailboxRepository); Stream> execute(AccountId accountId, CreateNewMailboxRequest newMailboxRequest) async* { try { - final newMailbox = await mailboxRepository.createNewMailbox(accountId, newMailboxRequest); + final currentMailboxState = await _mailboxRepository.getMailboxState(); + final newMailbox = await _mailboxRepository.createNewMailbox(accountId, newMailboxRequest); if (newMailbox != null) { - yield Right(CreateNewMailboxSuccess(newMailbox)); + yield Right(CreateNewMailboxSuccess( + newMailbox, + currentMailboxState: currentMailboxState)); } else { yield Left(CreateNewMailboxFailure(null)); } diff --git a/lib/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart index 0088f799c..8dba970bf 100644 --- a/lib/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/delete_multiple_mailbox_interactor.dart @@ -7,15 +7,18 @@ import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_reposit import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart'; class DeleteMultipleMailboxInteractor { - final MailboxRepository mailboxRepository; + final MailboxRepository _mailboxRepository; - DeleteMultipleMailboxInteractor(this.mailboxRepository); + DeleteMultipleMailboxInteractor(this._mailboxRepository); Stream> execute(Session session, AccountId accountId, List mailboxIds, MailboxId mailboxIdDeleted) async* { try { - final result = await mailboxRepository.deleteMultipleMailbox(session, accountId, mailboxIds); + final currentMailboxState = await _mailboxRepository.getMailboxState(); + final result = await _mailboxRepository.deleteMultipleMailbox(session, accountId, mailboxIds); if (result) { - yield Right(DeleteMultipleMailboxSuccess(mailboxIdDeleted)); + yield Right(DeleteMultipleMailboxSuccess( + mailboxIdDeleted, + currentMailboxState: currentMailboxState)); } else { yield Left(DeleteMultipleMailboxFailure(null)); } diff --git a/lib/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart b/lib/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart index efeab2115..eafb0b778 100644 --- a/lib/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart +++ b/lib/features/mailbox/domain/usecases/mark_as_mailbox_read_interactor.dart @@ -4,13 +4,15 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; class MarkAsMailboxReadInteractor { final MailboxRepository _mailboxRepository; + final EmailRepository _emailRepository; - MarkAsMailboxReadInteractor(this._mailboxRepository); + MarkAsMailboxReadInteractor(this._mailboxRepository, this._emailRepository); Stream> execute( AccountId accountId, @@ -23,6 +25,14 @@ class MarkAsMailboxReadInteractor { yield Right(MarkAsMailboxReadLoading()); onProgressController.add(Right(MarkAsMailboxReadLoading())); + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + final listEmails = await _mailboxRepository.markAsMailboxRead( accountId, mailboxId, @@ -30,9 +40,16 @@ class MarkAsMailboxReadInteractor { onProgressController); if (totalEmailUnread == listEmails.length) { - yield Right(MarkAsMailboxReadAllSuccess(mailboxName)); + yield Right(MarkAsMailboxReadAllSuccess( + mailboxName, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else if (listEmails.isNotEmpty) { - yield Right(MarkAsMailboxReadHasSomeEmailFailure(mailboxName, listEmails.length)); + yield Right(MarkAsMailboxReadHasSomeEmailFailure( + mailboxName, + listEmails.length, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else { yield Left(MarkAsMailboxReadAllFailure()); } diff --git a/lib/features/mailbox/domain/usecases/move_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/move_mailbox_interactor.dart index 276dbccf4..df1e2b91d 100644 --- a/lib/features/mailbox/domain/usecases/move_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/move_mailbox_interactor.dart @@ -6,20 +6,22 @@ import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_reposit import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart'; class MoveMailboxInteractor { - final MailboxRepository mailboxRepository; + final MailboxRepository _mailboxRepository; - MoveMailboxInteractor(this.mailboxRepository); + MoveMailboxInteractor(this._mailboxRepository); Stream> execute(AccountId accountId, MoveMailboxRequest request) async* { try { - final result = await mailboxRepository.moveMailbox(accountId, request); + final currentMailboxState = await _mailboxRepository.getMailboxState(); + final result = await _mailboxRepository.moveMailbox(accountId, request); if (result) { yield Right(MoveMailboxSuccess( request.mailboxId, request.moveAction, parentId: request.parentId, destinationMailboxId: request.destinationMailboxId, - destinationMailboxName: request.destinationMailboxName)); + destinationMailboxName: request.destinationMailboxName, + currentMailboxState: currentMailboxState)); } else { yield Left(MoveMailboxFailure(null)); } diff --git a/lib/features/mailbox/domain/usecases/rename_mailbox_interactor.dart b/lib/features/mailbox/domain/usecases/rename_mailbox_interactor.dart index 6c8d67433..93acd29c3 100644 --- a/lib/features/mailbox/domain/usecases/rename_mailbox_interactor.dart +++ b/lib/features/mailbox/domain/usecases/rename_mailbox_interactor.dart @@ -6,15 +6,17 @@ import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_reposit import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart'; class RenameMailboxInteractor { - final MailboxRepository mailboxRepository; + final MailboxRepository _mailboxRepository; - RenameMailboxInteractor(this.mailboxRepository); + RenameMailboxInteractor(this._mailboxRepository); Stream> execute(AccountId accountId, RenameMailboxRequest request) async* { try { - final result = await mailboxRepository.renameMailbox(accountId, request); + final currentMailboxState = await _mailboxRepository.getMailboxState(); + + final result = await _mailboxRepository.renameMailbox(accountId, request); if (result) { - yield Right(RenameMailboxSuccess()); + yield Right(RenameMailboxSuccess(currentMailboxState: currentMailboxState)); } else { yield Left(RenameMailboxFailure(null)); } diff --git a/lib/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart b/lib/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart index 630d5b237..ffa29e646 100644 --- a/lib/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart +++ b/lib/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart @@ -1,8 +1,13 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; -class RemoveEmailDraftsSuccess extends UIState { +class RemoveEmailDraftsSuccess extends UIActionState { - RemoveEmailDraftsSuccess(); + RemoveEmailDraftsSuccess({ + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + }) : super(currentEmailState, currentMailboxState); @override List get props => []; diff --git a/lib/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart b/lib/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart index 9f80c2900..e63f66687 100644 --- a/lib/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart +++ b/lib/features/mailbox_dashboard/domain/usecases/remove_email_drafts_interactor.dart @@ -3,18 +3,30 @@ import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart'; class RemoveEmailDraftsInteractor { - final EmailRepository emailRepository; + final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - RemoveEmailDraftsInteractor(this.emailRepository); + RemoveEmailDraftsInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, EmailId emailId) async* { try { - final result = await emailRepository.removeEmailDrafts(accountId, emailId); + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + + final result = await _emailRepository.removeEmailDrafts(accountId, emailId); if (result) { - yield Right(RemoveEmailDraftsSuccess()); + yield Right(RemoveEmailDraftsSuccess( + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else { yield Left(RemoveEmailDraftsFailure(result)); } diff --git a/lib/features/thread/domain/state/empty_trash_folder_state.dart b/lib/features/thread/domain/state/empty_trash_folder_state.dart index a900ed4fa..6363f613b 100644 --- a/lib/features/thread/domain/state/empty_trash_folder_state.dart +++ b/lib/features/thread/domain/state/empty_trash_folder_state.dart @@ -1,8 +1,13 @@ import 'package:core/core.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; -class EmptyTrashFolderSuccess extends UIState { +class EmptyTrashFolderSuccess extends UIActionState { - EmptyTrashFolderSuccess(); + EmptyTrashFolderSuccess({ + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + }) : super(currentEmailState, currentMailboxState); @override List get props => []; 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 7e5723ad5..fa8e4b395 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 @@ -1,11 +1,20 @@ import 'package:core/core.dart'; import 'package:model/email/read_actions.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; -class MarkAsMultipleEmailReadAllSuccess extends UIState { +class MarkAsMultipleEmailReadAllSuccess extends UIActionState { final int countMarkAsReadSuccess; final ReadActions readActions; - MarkAsMultipleEmailReadAllSuccess(this.countMarkAsReadSuccess, this.readActions); + MarkAsMultipleEmailReadAllSuccess( + this.countMarkAsReadSuccess, + this.readActions, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [countMarkAsReadSuccess, readActions]; @@ -20,11 +29,18 @@ class MarkAsMultipleEmailReadAllFailure extends FeatureFailure { List get props => [readActions]; } -class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState { +class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIActionState { final int countMarkAsReadSuccess; final ReadActions readActions; - MarkAsMultipleEmailReadHasSomeEmailFailure(this.countMarkAsReadSuccess, this.readActions); + MarkAsMultipleEmailReadHasSomeEmailFailure( + this.countMarkAsReadSuccess, + this.readActions, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [countMarkAsReadSuccess, readActions]; diff --git a/lib/features/thread/domain/state/mark_as_star_multiple_email_state.dart b/lib/features/thread/domain/state/mark_as_star_multiple_email_state.dart index 1a41bbe09..54a8552c0 100644 --- a/lib/features/thread/domain/state/mark_as_star_multiple_email_state.dart +++ b/lib/features/thread/domain/state/mark_as_star_multiple_email_state.dart @@ -1,11 +1,20 @@ import 'package:core/core.dart'; import 'package:model/model.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; -class MarkAsStarMultipleEmailAllSuccess extends UIState { +class MarkAsStarMultipleEmailAllSuccess extends UIActionState { final int countMarkStarSuccess; final MarkStarAction markStarAction; - MarkAsStarMultipleEmailAllSuccess(this.countMarkStarSuccess, this.markStarAction); + MarkAsStarMultipleEmailAllSuccess( + this.countMarkStarSuccess, + this.markStarAction, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [countMarkStarSuccess, markStarAction]; @@ -20,11 +29,18 @@ class MarkAsStarMultipleEmailAllFailure extends FeatureFailure { List get props => [markStarAction]; } -class MarkAsStarMultipleEmailHasSomeEmailFailure extends UIState { +class MarkAsStarMultipleEmailHasSomeEmailFailure extends UIActionState { final int countMarkStarSuccess; final MarkStarAction markStarAction; - MarkAsStarMultipleEmailHasSomeEmailFailure(this.countMarkStarSuccess, this.markStarAction); + MarkAsStarMultipleEmailHasSomeEmailFailure( + this.countMarkStarSuccess, + this.markStarAction, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [countMarkStarSuccess, markStarAction]; diff --git a/lib/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart b/lib/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart index 862ede7db..2b329f388 100644 --- a/lib/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart +++ b/lib/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart @@ -1,10 +1,12 @@ import 'package:core/core.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/email/email_action_type.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; -class MoveMultipleEmailToMailboxAllSuccess extends UIState { +class MoveMultipleEmailToMailboxAllSuccess extends UIActionState { final List movedListEmailId; final MailboxId currentMailboxId; final MailboxId destinationMailboxId; @@ -18,8 +20,12 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState { this.destinationMailboxId, this.moveAction, this.emailActionType, - {this.destinationPath} - ); + { + this.destinationPath, + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [ @@ -42,7 +48,7 @@ class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure { List get props => [moveAction, emailActionType]; } -class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { +class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIActionState { final List movedListEmailId; final MailboxId currentMailboxId; final MailboxId destinationMailboxId; @@ -56,8 +62,12 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { this.destinationMailboxId, this.moveAction, this.emailActionType, - {this.destinationPath} - ); + { + this.destinationPath, + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); @override List get props => [ diff --git a/lib/features/thread/domain/usecases/empty_trash_folder_interactor.dart b/lib/features/thread/domain/usecases/empty_trash_folder_interactor.dart index c300047ea..79c336a83 100644 --- a/lib/features/thread/domain/usecases/empty_trash_folder_interactor.dart +++ b/lib/features/thread/domain/usecases/empty_trash_folder_interactor.dart @@ -2,21 +2,40 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; class EmptyTrashFolderInteractor { final ThreadRepository threadRepository; + final MailboxRepository _mailboxRepository; + final EmailRepository _emailRepository; - EmptyTrashFolderInteractor(this.threadRepository); + EmptyTrashFolderInteractor( + this.threadRepository, + this._mailboxRepository, + this._emailRepository + ); Stream> execute(AccountId accountId, MailboxId trashMailboxId) async* { try { yield Right(LoadingState()); + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + final result = await threadRepository.emptyTrashFolder(accountId, trashMailboxId); if (result) { - yield Right(EmptyTrashFolderSuccess()); + yield Right(EmptyTrashFolderSuccess( + currentMailboxState: currentMailboxState, + currentEmailState: currentEmailState, + )); } else { yield Left(EmptyTrashFolderFailure(null)); } 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 a7049b863..ede24ae28 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 @@ -4,12 +4,14 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; class MarkAsMultipleEmailReadInteractor { final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - MarkAsMultipleEmailReadInteractor(this._emailRepository); + MarkAsMultipleEmailReadInteractor(this._emailRepository, this._mailboxRepository); Stream> execute( AccountId accountId, @@ -17,6 +19,14 @@ class MarkAsMultipleEmailReadInteractor { ReadActions readAction ) async* { try { + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + final listEmailNeedMarkAsRead = emails .where((email) => readAction == ReadActions.markAsUnread ? email.hasRead : !email.hasRead) .toList(); @@ -25,12 +35,20 @@ class MarkAsMultipleEmailReadInteractor { if (listEmailNeedMarkAsRead.length == result.length) { final countMarkAsReadSuccess = emails.length; - yield Right(MarkAsMultipleEmailReadAllSuccess(countMarkAsReadSuccess, readAction)); + yield Right(MarkAsMultipleEmailReadAllSuccess( + countMarkAsReadSuccess, + readAction, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else if (result.isEmpty) { yield Left(MarkAsMultipleEmailReadAllFailure(readAction)); } else { final countMarkAsReadSuccess = emails.length - (listEmailNeedMarkAsRead.length - result.length); - yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(countMarkAsReadSuccess, readAction)); + yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure( + countMarkAsReadSuccess, + readAction, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } } catch (e) { yield Left(MarkAsMultipleEmailReadFailure(e, readAction)); diff --git a/lib/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart b/lib/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart index 18a9c8f96..d6ad2aafc 100644 --- a/lib/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart +++ b/lib/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart @@ -17,6 +17,8 @@ class MarkAsStarMultipleEmailInteractor { MarkStarAction markStarAction ) async* { try { + final currentEmailState = await _emailRepository.getEmailState(); + final listEmailNeedMarkStar = emails .where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred) .toList(); @@ -25,12 +27,18 @@ class MarkAsStarMultipleEmailInteractor { if (listEmailNeedMarkStar.length == result.length) { final countMarkStarSuccess = emails.length; - yield Right(MarkAsStarMultipleEmailAllSuccess(countMarkStarSuccess, markStarAction)); + yield Right(MarkAsStarMultipleEmailAllSuccess( + countMarkStarSuccess, + markStarAction, + currentEmailState: currentEmailState)); } else if (result.isEmpty) { yield Left(MarkAsStarMultipleEmailAllFailure(markStarAction)); } else { final countMarkStarSuccess = emails.length - (listEmailNeedMarkStar.length - result.length); - yield Right(MarkAsStarMultipleEmailHasSomeEmailFailure(countMarkStarSuccess, markStarAction)); + yield Right(MarkAsStarMultipleEmailHasSomeEmailFailure( + countMarkStarSuccess, + markStarAction, + currentEmailState: currentEmailState)); } } catch (e) { yield Left(MarkAsStarMultipleEmailFailure(e, markStarAction)); diff --git a/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart b/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart index 9c233116f..18327fced 100644 --- a/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart +++ b/lib/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart @@ -5,15 +5,25 @@ import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; class MoveMultipleEmailToMailboxInteractor { final EmailRepository _emailRepository; + final MailboxRepository _mailboxRepository; - MoveMultipleEmailToMailboxInteractor(this._emailRepository); + MoveMultipleEmailToMailboxInteractor(this._emailRepository, this._mailboxRepository); Stream> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* { try { + final listState = await Future.wait([ + _mailboxRepository.getMailboxState(), + _emailRepository.getEmailState(), + ], eagerError: true); + + final currentMailboxState = listState.first; + final currentEmailState = listState.last; + final result = await _emailRepository.moveToMailbox(accountId, moveRequest); if (moveRequest.emailIds.length == result.length) { @@ -23,7 +33,9 @@ class MoveMultipleEmailToMailboxInteractor { moveRequest.destinationMailboxId, moveRequest.moveAction, moveRequest.emailActionType, - destinationPath: moveRequest.destinationPath)); + destinationPath: moveRequest.destinationPath, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } else if (result.isEmpty) { yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction, moveRequest.emailActionType)); } else { @@ -33,7 +45,9 @@ class MoveMultipleEmailToMailboxInteractor { moveRequest.destinationMailboxId, moveRequest.moveAction, moveRequest.emailActionType, - destinationPath: moveRequest.destinationPath)); + destinationPath: moveRequest.destinationPath, + currentEmailState: currentEmailState, + currentMailboxState: currentMailboxState)); } } catch (e) { yield Left(MoveMultipleEmailToMailboxFailure(e, moveRequest.emailActionType, moveRequest.moveAction));