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 22f2a0a6c..21f596ef3 100644 --- a/lib/features/email/domain/state/delete_email_permanently_state.dart +++ b/lib/features/email/domain/state/delete_email_permanently_state.dart @@ -1,9 +1,19 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; class StartDeleteEmailPermanently extends UIState {} -class DeleteEmailPermanentlySuccess extends UIState {} +class DeleteEmailPermanentlySuccess extends UIState { + final EmailId emailId; + final MailboxId? mailboxId; + + DeleteEmailPermanentlySuccess(this.emailId, this.mailboxId); + + @override + List get props => [emailId, mailboxId]; +} class DeleteEmailPermanentlyFailure extends FeatureFailure { 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 07ac090d6..b09122498 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,27 +1,30 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; class LoadingDeleteMultipleEmailsPermanentlyAll extends UIState {} class DeleteMultipleEmailsPermanentlyAllSuccess extends UIState { List emailIds; + final MailboxId? mailboxId; - DeleteMultipleEmailsPermanentlyAllSuccess(this.emailIds); + DeleteMultipleEmailsPermanentlyAllSuccess(this.emailIds, this.mailboxId); @override - List get props => [emailIds]; + List get props => [emailIds, mailboxId]; } class DeleteMultipleEmailsPermanentlyHasSomeEmailFailure extends UIState { List emailIds; + final MailboxId? mailboxId; - DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(this.emailIds); + DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(this.emailIds, this.mailboxId); @override - List get props => [emailIds]; + List get props => [emailIds, mailboxId]; } class DeleteMultipleEmailsPermanentlyAllFailure extends FeatureFailure {} 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 20260256e..8e874d33a 100644 --- a/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart +++ b/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart @@ -4,6 +4,7 @@ import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.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/email/domain/state/delete_email_permanently_state.dart'; @@ -12,12 +13,17 @@ class DeleteEmailPermanentlyInteractor { DeleteEmailPermanentlyInteractor(this._emailRepository); - Stream> execute(Session session, AccountId accountId, EmailId emailId) async* { + Stream> execute( + Session session, + AccountId accountId, + EmailId emailId, + MailboxId? mailboxId, + ) async* { try { yield Right(StartDeleteEmailPermanently()); final result = await _emailRepository.deleteEmailPermanently(session, accountId, emailId); if (result) { - yield Right(DeleteEmailPermanentlySuccess()); + yield Right(DeleteEmailPermanentlySuccess(emailId, mailboxId)); } 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 b8195c8e6..3510c2bec 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,6 +4,7 @@ import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.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/email/domain/state/delete_multiple_emails_permanently_state.dart'; @@ -12,14 +13,19 @@ class DeleteMultipleEmailsPermanentlyInteractor { DeleteMultipleEmailsPermanentlyInteractor(this._emailRepository); - Stream> execute(Session session, AccountId accountId, List emailIds) async* { + Stream> execute( + Session session, + AccountId accountId, + List emailIds, + MailboxId? mailboxId, + ) async* { try { yield Right(LoadingDeleteMultipleEmailsPermanentlyAll()); final listResult = await _emailRepository.deleteMultipleEmailsPermanently(session, accountId, emailIds); if (listResult.emailIdsSuccess.length == emailIds.length) { - yield Right(DeleteMultipleEmailsPermanentlyAllSuccess(listResult.emailIdsSuccess)); + yield Right(DeleteMultipleEmailsPermanentlyAllSuccess(listResult.emailIdsSuccess, mailboxId)); } else if (listResult.emailIdsSuccess.isNotEmpty) { - yield Right(DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(listResult.emailIdsSuccess)); + yield Right(DeleteMultipleEmailsPermanentlyHasSomeEmailFailure(listResult.emailIdsSuccess, mailboxId)); } else { yield Left(DeleteMultipleEmailsPermanentlyAllFailure()); } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 80f914625..f50120708 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -21,6 +21,8 @@ import 'package:tmail_ui_user/features/base/mixin/contact_support_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/mailbox_action_handler_mixin.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; @@ -322,6 +324,21 @@ class MailboxController extends BaseMailboxController affectedMailboxId: reactionState.draftMailboxId, totalEmailsChanged: -1, ); + } else if (reactionState is DeleteEmailPermanentlySuccess) { + _handleDeleteEmailsFromMailbox( + affectedMailboxId: reactionState.mailboxId, + totalEmailsChanged: -1, + ); + } else if (reactionState is DeleteMultipleEmailsPermanentlyAllSuccess) { + _handleDeleteEmailsFromMailbox( + affectedMailboxId: reactionState.mailboxId, + totalEmailsChanged: -reactionState.emailIds.length, + ); + } else if (reactionState is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { + _handleDeleteEmailsFromMailbox( + affectedMailboxId: reactionState.mailboxId, + totalEmailsChanged: -reactionState.emailIds.length, + ); } }); } @@ -359,6 +376,18 @@ class MailboxController extends BaseMailboxController ); } + void _handleDeleteEmailsFromMailbox({ + required MailboxId? affectedMailboxId, + required int totalEmailsChanged, + }) { + if (affectedMailboxId == null) return; + + updateMailboxTotalEmailsCountById( + affectedMailboxId, + totalEmailsChanged, + ); + } + void _initWebSocketQueueHandler() { _webSocketQueueHandler = WebSocketQueueHandler( processMessageCallback: _handleWebSocketMessage, 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 c0862c726..b9a89e655 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -871,7 +871,12 @@ class MailboxDashBoardController extends ReloadableController final currentAccountId = accountId.value; final session = sessionCurrent; if (currentAccountId != null && session != null && email.id != null) { - consumeState(_deleteEmailPermanentlyInteractor.execute(session, currentAccountId, email.id!)); + consumeState(_deleteEmailPermanentlyInteractor.execute( + session, + currentAccountId, + email.id!, + email.mailboxContain?.mailboxId, + )); } } @@ -1434,7 +1439,8 @@ class MailboxDashBoardController extends ReloadableController consumeState(_deleteMultipleEmailsPermanentlyInteractor.execute( sessionCurrent!, accountId.value!, - listEmails.listEmailIds)); + listEmails.listEmailIds, + listEmails.firstOrNull?.mailboxContain?.mailboxId)); } } diff --git a/lib/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart new file mode 100644 index 000000000..6a542df58 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart @@ -0,0 +1,16 @@ +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; + +extension DeleteEmailsInMailboxExtension on MailboxDashBoardController { + void handleDeleteEmailsInMailbox({ + required List emailIds, + required MailboxId? affectedMailboxId, + }) { + if (selectedMailbox.value?.id != affectedMailboxId) { + return; + } + + emailsInCurrentMailbox.removeWhere((email) => emailIds.contains(email.id)); + } +} \ No newline at end of file diff --git a/lib/features/search/email/presentation/search_email_controller.dart b/lib/features/search/email/presentation/search_email_controller.dart index 4d088d674..769b8d423 100644 --- a/lib/features/search/email/presentation/search_email_controller.dart +++ b/lib/features/search/email/presentation/search_email_controller.dart @@ -33,6 +33,8 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_e import 'package:tmail_ui_user/features/contact/presentation/model/contact_arguments.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; @@ -46,6 +48,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/quick_search_email_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/save_recent_search_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart'; @@ -298,6 +301,21 @@ class SearchEmailController extends BaseController reactionState.successEmailIds, markStarAction: reactionState.markStarAction, ); + } else if (reactionState is DeleteEmailPermanentlySuccess) { + mailboxDashBoardController.handleDeleteEmailsInMailbox( + emailIds: [reactionState.emailId], + affectedMailboxId: reactionState.mailboxId, + ); + } else if (reactionState is DeleteMultipleEmailsPermanentlyAllSuccess) { + mailboxDashBoardController.handleDeleteEmailsInMailbox( + emailIds: reactionState.emailIds, + affectedMailboxId: reactionState.mailboxId, + ); + } else if (reactionState is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { + mailboxDashBoardController.handleDeleteEmailsInMailbox( + emailIds: reactionState.emailIds, + affectedMailboxId: reactionState.mailboxId, + ); } }); } diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 1a0718638..5b7a94d8d 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -20,6 +20,8 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_read_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; @@ -28,6 +30,7 @@ import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.d import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart' as search; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart'; @@ -377,6 +380,21 @@ class ThreadController extends BaseController with EmailActionController { reactionState.successEmailIds, markStarAction: reactionState.markStarAction, ); + } else if (reactionState is DeleteEmailPermanentlySuccess) { + mailboxDashBoardController.handleDeleteEmailsInMailbox( + emailIds: [reactionState.emailId], + affectedMailboxId: reactionState.mailboxId, + ); + } else if (reactionState is DeleteMultipleEmailsPermanentlyAllSuccess) { + mailboxDashBoardController.handleDeleteEmailsInMailbox( + emailIds: reactionState.emailIds, + affectedMailboxId: reactionState.mailboxId, + ); + } else if (reactionState is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { + mailboxDashBoardController.handleDeleteEmailsInMailbox( + emailIds: reactionState.emailIds, + affectedMailboxId: reactionState.mailboxId, + ); } }); }