From 16c5aed64e45b8631fae9453612bd1a43f6f63fd Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 15 Apr 2022 15:51:37 +0700 Subject: [PATCH] TF-153 Combine moveToMailbox and moveToTrash to moveToMailbox using EmailActionType object --- .../email_action_type_extension.dart | 11 ++ .../data/datasource/email_datasource.dart | 7 +- .../email_datasource_impl.dart | 14 +- .../email/data/network/email_api.dart | 33 +--- .../repository/email_repository_impl.dart | 10 +- .../email/domain/model}/move_action.dart | 3 +- ...uest.dart => move_to_mailbox_request.dart} | 12 +- .../domain/model/move_to_trash_request.dart | 28 ---- .../domain/repository/email_repository.dart | 7 +- .../domain/state/move_to_mailbox_state.dart | 15 +- .../domain/state/move_to_trash_state.dart | 35 ---- .../usecases/move_to_mailbox_interactor.dart | 11 +- .../usecases/move_to_trash_interactor.dart | 29 ---- .../email/presentation/email_bindings.dart | 2 - .../email/presentation/email_controller.dart | 75 +++++---- .../email/presentation/email_view.dart | 27 +-- .../widgets/app_bar_mail_widget_builder.dart | 25 +-- .../presentation/mailbox_controller.dart | 12 -- .../mailbox_dashboard_bindings.dart | 3 - .../mailbox_dashboard_controller.dart | 40 ++--- .../move_multiple_email_to_mailbox_state.dart | 31 +++- .../move_multiple_email_to_trash_state.dart | 67 -------- ...ark_as_multiple_email_read_interactor.dart | 2 +- ...ark_as_star_multiple_email_interactor.dart | 2 +- ..._multiple_email_to_mailbox_interactor.dart | 14 +- ...ve_multiple_email_to_trash_interactor.dart | 38 ----- .../thread/presentation/thread_bindings.dart | 3 - .../presentation/thread_controller.dart | 156 +++++++----------- .../thread/presentation/thread_view.dart | 4 +- ...bar_thread_select_mode_active_builder.dart | 153 ----------------- .../app_bar_thread_widget_builder.dart | 4 +- .../bottom_bar_thread_selection_widget.dart | 6 +- .../widgets/email_tile_builder.dart | 12 +- .../widgets/email_tile_web_builder.dart | 24 +-- lib/l10n/intl_messages.arb | 12 +- lib/main/localizations/app_localizations.dart | 13 +- model/lib/email/email_action_type.dart | 6 +- model/lib/email/filter_message_option.dart | 8 +- model/lib/email/presentation_email.dart | 6 +- model/lib/extensions/email_extension.dart | 6 +- .../extensions/list_email_id_extension.dart | 8 + .../list_presentation_email_extension.dart | 6 +- .../lib/extensions/mailbox_id_extension.dart | 6 + model/lib/mailbox/presentation_mailbox.dart | 3 + model/lib/model.dart | 1 - 45 files changed, 268 insertions(+), 722 deletions(-) rename {model/lib/email => lib/features/email/domain/model}/move_action.dart (51%) rename lib/features/email/domain/model/{move_request.dart => move_to_mailbox_request.dart} (70%) delete mode 100644 lib/features/email/domain/model/move_to_trash_request.dart delete mode 100644 lib/features/email/domain/state/move_to_trash_state.dart delete mode 100644 lib/features/email/domain/usecases/move_to_trash_interactor.dart delete mode 100644 lib/features/thread/domain/state/move_multiple_email_to_trash_state.dart delete mode 100644 lib/features/thread/domain/usecases/move_multiple_email_to_trash_interactor.dart delete mode 100644 lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart diff --git a/lib/features/composer/presentation/extensions/email_action_type_extension.dart b/lib/features/composer/presentation/extensions/email_action_type_extension.dart index b552e02f8..1aa60d4d2 100644 --- a/lib/features/composer/presentation/extensions/email_action_type_extension.dart +++ b/lib/features/composer/presentation/extensions/email_action_type_extension.dart @@ -25,4 +25,15 @@ extension EmailActionTypeExtension on EmailActionType { return ''; } } + + String getToastMessageMoveToMailboxSuccess(BuildContext context, {String? destinationPath}) { + switch(this) { + case EmailActionType.moveToMailbox: + return AppLocalizations.of(context).moved_to_mailbox(destinationPath ?? ''); + case EmailActionType.moveToTrash: + return AppLocalizations.of(context).moved_to_trash; + default: + return ''; + } + } } \ No newline at end of file diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 39129eafb..a7b79d018 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -3,8 +3,7 @@ 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/composer/domain/model/email_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; abstract class EmailDataSource { Future getEmailContent(AccountId accountId, EmailId emailId); @@ -35,9 +34,7 @@ abstract class EmailDataSource { AccountRequest accountRequest, ); - Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest); - - Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest); + Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest); Future> markAsStar( AccountId accountId, diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index 2b20366a7..4e0fbe39c 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -5,8 +5,7 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; class EmailDataSourceImpl extends EmailDataSource { @@ -71,7 +70,7 @@ class EmailDataSourceImpl extends EmailDataSource { } @override - Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest) { + Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { return Future.sync(() async { return await emailAPI.moveToMailbox(accountId, moveRequest); }).catchError((error) { @@ -124,15 +123,6 @@ class EmailDataSourceImpl extends EmailDataSource { }); } - @override - Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { - return Future.sync(() async { - return await emailAPI.moveToTrash(accountId, moveRequest); - }).catchError((error) { - throw error; - }); - } - @override Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds) { return Future.sync(() async { diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 43700eef0..6931723bf 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -26,8 +26,7 @@ import 'package:jmap_dart_client/jmap/mail/email/submission/set/set_email_submis import 'package:path_provider/path_provider.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; class EmailAPI { @@ -216,7 +215,7 @@ class EmailAPI { ); } - Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest) async { + Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) async { final setEmailMethod = SetEmailMethod(accountId) ..addUpdates(moveRequest.emailIds .generateMapUpdateObjectMoveToMailbox(moveRequest.currentMailboxId, moveRequest.destinationMailboxId)); @@ -354,34 +353,6 @@ class EmailAPI { }); } - Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) async { - final setEmailMethod = SetEmailMethod(accountId) - ..addUpdates(moveRequest.emailIds - .generateMapUpdateObjectMoveToMailbox(moveRequest.currentMailboxId, moveRequest.trashMailboxId)); - - final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); - - final setEmailInvocation = requestBuilder.invocation(setEmailMethod); - - final response = await (requestBuilder - ..usings(setEmailMethod.requiredCapabilities)) - .build() - .execute(); - - final setEmailResponse = response.parse( - setEmailInvocation.methodCallId, - SetEmailResponse.deserialize); - - return Future.sync(() async { - final mapUpdated = setEmailResponse!.updated!; - return moveRequest.emailIds - .where((emailId) => mapUpdated.containsKey(emailId.id)) - .toList(); - }).catchError((error) { - throw error; - }); - } - Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds) async { final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); final setEmailMethod = SetEmailMethod(accountId) diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index ee904d481..58ac28169 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -6,8 +6,7 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.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'; class EmailRepositoryImpl extends EmailRepository { @@ -59,7 +58,7 @@ class EmailRepositoryImpl extends EmailRepository { } @override - Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest) { + Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { return emailDataSource.moveToMailbox(accountId, moveRequest); } @@ -110,11 +109,6 @@ class EmailRepositoryImpl extends EmailRepository { return emailDataSource.downloadAttachmentForWeb(attachment, accountId, baseDownloadUrl, accountRequest); } - @override - Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { - return emailDataSource.moveToTrash(accountId, moveRequest); - } - @override Future> deleteMultipleEmailsPermanently(AccountId accountId, List emailIds) { return emailDataSource.deleteMultipleEmailsPermanently(accountId, emailIds); diff --git a/model/lib/email/move_action.dart b/lib/features/email/domain/model/move_action.dart similarity index 51% rename from model/lib/email/move_action.dart rename to lib/features/email/domain/model/move_action.dart index 7621ac232..1059f5ab1 100644 --- a/model/lib/email/move_action.dart +++ b/lib/features/email/domain/model/move_action.dart @@ -1,6 +1,5 @@ enum MoveAction { - moveTo, - moveToTrash, + moving, undo } \ No newline at end of file diff --git a/lib/features/email/domain/model/move_request.dart b/lib/features/email/domain/model/move_to_mailbox_request.dart similarity index 70% rename from lib/features/email/domain/model/move_request.dart rename to lib/features/email/domain/model/move_to_mailbox_request.dart index 2290db693..daa6ef270 100644 --- a/lib/features/email/domain/model/move_request.dart +++ b/lib/features/email/domain/model/move_to_mailbox_request.dart @@ -3,23 +3,24 @@ import 'package:equatable/equatable.dart'; 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/email/domain/model/move_action.dart'; -class MoveRequest with EquatableMixin { +class MoveToMailboxRequest with EquatableMixin { final List emailIds; final MailboxId currentMailboxId; final MailboxId destinationMailboxId; final MoveAction moveAction; + final EmailActionType emailActionType; final String? destinationPath; - MoveRequest( + MoveToMailboxRequest( this.emailIds, this.currentMailboxId, this.destinationMailboxId, this.moveAction, - { - this.destinationPath, - } + this.emailActionType, + {this.destinationPath} ); @override @@ -28,6 +29,7 @@ class MoveRequest with EquatableMixin { currentMailboxId, destinationMailboxId, moveAction, + emailActionType, destinationPath, ]; } \ No newline at end of file diff --git a/lib/features/email/domain/model/move_to_trash_request.dart b/lib/features/email/domain/model/move_to_trash_request.dart deleted file mode 100644 index b8e1d2b38..000000000 --- a/lib/features/email/domain/model/move_to_trash_request.dart +++ /dev/null @@ -1,28 +0,0 @@ - -import 'package:equatable/equatable.dart'; -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'; - -class MoveToTrashRequest with EquatableMixin { - - final List emailIds; - final MailboxId currentMailboxId; - final MailboxId trashMailboxId; - final MoveAction moveAction; - - MoveToTrashRequest( - this.emailIds, - this.currentMailboxId, - this.trashMailboxId, - this.moveAction, - ); - - @override - List get props => [ - emailIds, - currentMailboxId, - trashMailboxId, - moveAction, - ]; -} \ No newline at end of file diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 8553ba445..e8e1626e9 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -3,8 +3,7 @@ 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/composer/domain/model/email_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; abstract class EmailRepository { Future getEmailContent(AccountId accountId, EmailId emailId); @@ -35,9 +34,7 @@ abstract class EmailRepository { AccountRequest accountRequest, ); - Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest); - - Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest); + Future> moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest); Future> markAsStar( AccountId accountId, 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 0beea9b0b..ee86a75cd 100644 --- a/lib/features/email/domain/state/move_to_mailbox_state.dart +++ b/lib/features/email/domain/state/move_to_mailbox_state.dart @@ -2,12 +2,14 @@ import 'package:core/core.dart'; 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/email/domain/model/move_action.dart'; class MoveToMailboxSuccess extends UIState { final EmailId emailId; final MailboxId currentMailboxId; final MailboxId destinationMailboxId; final MoveAction moveAction; + final EmailActionType emailActionType; final String? destinationPath; MoveToMailboxSuccess( @@ -15,7 +17,9 @@ class MoveToMailboxSuccess extends UIState { this.currentMailboxId, this.destinationMailboxId, this.moveAction, - this.destinationPath); + this.emailActionType, + {this.destinationPath} + ); @override List get props => [ @@ -23,14 +27,17 @@ class MoveToMailboxSuccess extends UIState { currentMailboxId, destinationMailboxId, moveAction, - destinationPath]; + emailActionType, + destinationPath + ]; } class MoveToMailboxFailure extends FeatureFailure { + final EmailActionType emailActionType; final exception; - MoveToMailboxFailure(this.exception); + MoveToMailboxFailure(this.emailActionType, this.exception); @override - List get props => [exception]; + List get props => [emailActionType, exception]; } \ No newline at end of file diff --git a/lib/features/email/domain/state/move_to_trash_state.dart b/lib/features/email/domain/state/move_to_trash_state.dart deleted file mode 100644 index f1b04e521..000000000 --- a/lib/features/email/domain/state/move_to_trash_state.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:core/core.dart'; -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'; - -class MoveToTrashSuccess extends UIState { - final EmailId emailId; - final MailboxId currentMailboxId; - final MailboxId trashMailboxId; - final MoveAction moveAction; - - MoveToTrashSuccess( - this.emailId, - this.currentMailboxId, - this.trashMailboxId, - this.moveAction - ); - - @override - List get props => [ - emailId, - currentMailboxId, - trashMailboxId, - moveAction - ]; -} - -class MoveToTrashFailure extends FeatureFailure { - final exception; - - MoveToTrashFailure(this.exception); - - @override - List get props => [exception]; -} \ No newline at end of file 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 0919193d2..43d5a1f5c 100644 --- a/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart +++ b/lib/features/email/domain/usecases/move_to_mailbox_interactor.dart @@ -1,7 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.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'; @@ -10,7 +10,7 @@ class MoveToMailboxInteractor { MoveToMailboxInteractor(this.emailRepository); - Stream> execute(AccountId accountId, MoveRequest moveRequest) async* { + Stream> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* { try { final result = await emailRepository.moveToMailbox(accountId, moveRequest); if (result.isNotEmpty) { @@ -19,12 +19,13 @@ class MoveToMailboxInteractor { moveRequest.currentMailboxId, moveRequest.destinationMailboxId, moveRequest.moveAction, - moveRequest.destinationPath)); + moveRequest.emailActionType, + destinationPath: moveRequest.destinationPath)); } else { - yield Left(MoveToMailboxFailure(null)); + yield Left(MoveToMailboxFailure(moveRequest.emailActionType, null)); } } catch (e) { - yield Left(MoveToMailboxFailure(e)); + yield Left(MoveToMailboxFailure(moveRequest.emailActionType, e)); } } } \ No newline at end of file diff --git a/lib/features/email/domain/usecases/move_to_trash_interactor.dart b/lib/features/email/domain/usecases/move_to_trash_interactor.dart deleted file mode 100644 index 40ca5a9f4..000000000 --- a/lib/features/email/domain/usecases/move_to_trash_interactor.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:core/core.dart'; -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_trash_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_trash_state.dart'; - -class MoveToTrashInteractor { - final EmailRepository emailRepository; - - MoveToTrashInteractor(this.emailRepository); - - Stream> execute(AccountId accountId, MoveToTrashRequest moveRequest) async* { - try { - final result = await emailRepository.moveToTrash(accountId, moveRequest); - if (result.isNotEmpty) { - yield Right(MoveToTrashSuccess( - result.first, - moveRequest.currentMailboxId, - moveRequest.trashMailboxId, - moveRequest.moveAction)); - } else { - yield Left(MoveToTrashFailure(null)); - } - } catch (e) { - yield Left(MoveToTrashFailure(e)); - } - } -} \ No newline at end of file diff --git a/lib/features/email/presentation/email_bindings.dart b/lib/features/email/presentation/email_bindings.dart index 9b7040742..af1cb70ca 100644 --- a/lib/features/email/presentation/email_bindings.dart +++ b/lib/features/email/presentation/email_bindings.dart @@ -17,7 +17,6 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/email_controller.dart'; import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; @@ -76,7 +75,6 @@ class EmailBindings extends BaseBindings { Get.find(), Get.find(), )); - Get.lazyPut(() => MoveToTrashInteractor(Get.find())); } @override diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index cf95f52b8..b055fabda 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -15,8 +15,8 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart'; @@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_ import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_action.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -91,7 +92,7 @@ class EmailController extends BaseController { _resetToOriginalValue(); if (presentationEmail != null) { _getEmailContentAction(presentationEmail.id); - if (presentationEmail.isUnReadEmail()) { + if (!presentationEmail.hasRead) { markAsEmailRead(presentationEmail, ReadActions.markAsRead); } } @@ -331,7 +332,7 @@ class EmailController extends BaseController { } } - void moveToMailboxAction(BuildContext context, PresentationEmail email) async { + void moveToMailbox(BuildContext context, PresentationEmail email) async { final currentMailbox = mailboxDashBoardController.selectedMailbox.value; final accountId = mailboxDashBoardController.accountId.value; @@ -343,75 +344,73 @@ class EmailController extends BaseController { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.role == PresentationMailbox.roleTrash) { - _moveToTrash(context, accountId, MoveToTrashRequest( + _moveToTrashAction(context, accountId, MoveToMailboxRequest( [email.id], currentMailbox.id, destinationMailbox.id, - MoveAction.moveToTrash)); + MoveAction.moving, + EmailActionType.moveToTrash)); } else { - _moveToMailbox(accountId, MoveRequest( + _moveToMailbox(accountId, MoveToMailboxRequest( [email.id], currentMailbox.id, destinationMailbox.id, - MoveAction.moveTo, + MoveAction.moving, + EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } } } } - void _moveToMailbox(AccountId accountId, MoveRequest moveRequest) { + void _moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); } - void _moveToMailboxSuccess(Success success) { + void _moveToMailboxSuccess(MoveToMailboxSuccess success) { mailboxDashBoardController.dispatchState(Right(success)); - if (success is MoveToMailboxSuccess - && success.moveAction == MoveAction.moveTo - && currentContext != null && currentOverlayContext != null) { + if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) { _appToast.showToastWithAction( currentOverlayContext!, - AppLocalizations.of(currentContext!).moved_to_mailbox(success.destinationPath ?? ''), - AppLocalizations.of(currentContext!).undo_action, - () { - final newMoveRequest = MoveRequest( - [success.emailId], - success.destinationMailboxId, - success.currentMailboxId, - MoveAction.undo); - _undoMoveToMailbox(newMoveRequest); + success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath), + AppLocalizations.of(currentContext!).undo_action, () { + _undoMoveToMailbox(MoveToMailboxRequest( + [success.emailId], + success.destinationMailboxId, + success.currentMailboxId, + MoveAction.undo, + success.emailActionType)); } ); } } - void _undoMoveToMailbox(MoveRequest newMoveRequest) { + void _undoMoveToMailbox(MoveToMailboxRequest newMoveRequest) { final accountId = mailboxDashBoardController.accountId.value; - if (accountId != null) { _moveToMailbox(accountId, newMoveRequest); } } - void moveToTrashAction(BuildContext context, PresentationEmail email) async { - final currentMailbox = mailboxDashBoardController.selectedMailbox.value; + void moveToTrash(BuildContext context, PresentationEmail email) async { final accountId = mailboxDashBoardController.accountId.value; - final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash]; + final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash); - if (currentMailbox != null && accountId != null && trashMailboxId != null) { - _moveToTrash(context, accountId, MoveToTrashRequest( + if (accountId != null && currentMailbox != null && trashMailboxId != null) { + _moveToTrashAction(context, accountId, MoveToMailboxRequest( [email.id], - currentMailbox.id, + currentMailbox!.id, trashMailboxId, - MoveAction.moveToTrash) + MoveAction.moving, + EmailActionType.moveToTrash) ); } } - void _moveToTrash(BuildContext context, AccountId accountId, MoveToTrashRequest moveRequest) { + void _moveToTrashAction(BuildContext context, AccountId accountId, MoveToMailboxRequest moveRequest) { backToThreadView(context); - mailboxDashBoardController.moveToTrash(accountId, moveRequest); + mailboxDashBoardController.moveToMailbox(accountId, moveRequest); } void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async { @@ -435,17 +434,17 @@ class EmailController extends BaseController { popBack(); markAsEmailRead(presentationEmail, ReadActions.markAsUnread); break; - case EmailActionType.markAsStar: + case EmailActionType.markAsStarred: markAsStarEmail(presentationEmail, MarkStarAction.markStar); break; - case EmailActionType.markAsUnStar: + case EmailActionType.unMarkAsStarred: markAsStarEmail(presentationEmail, MarkStarAction.unMarkStar); break; - case EmailActionType.move: - moveToMailboxAction(context, presentationEmail); + case EmailActionType.moveToMailbox: + moveToMailbox(context, presentationEmail); break; case EmailActionType.moveToTrash: - moveToTrashAction(context, presentationEmail); + moveToTrash(context, presentationEmail); break; case EmailActionType.deletePermanently: deleteEmailPermanently(context, presentationEmail); diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 6af71af8e..ac4b9bef4 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -122,23 +122,12 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio Widget _buildAppBar(BuildContext context) { return Obx(() => Padding( padding: EdgeInsets.only(top: 6), - child: (AppBarMailWidgetBuilder( - context, - imagePaths, - responsiveUtils, - emailController.currentEmail, - emailController.currentMailbox) + child: (AppBarMailWidgetBuilder(context, imagePaths, responsiveUtils, emailController.currentEmail, emailController.currentMailbox) ..onBackActionClick(() => emailController.backToThreadView(context)) ..addOnEmailActionClick((email, action) => emailController.handleEmailAction(context, email, action)) - ..addOnMoreActionClick((email, position) => responsiveUtils.isMobileDevice(context) - ? emailController.openMoreMenuEmailAction( - context, - _emailActionMoreActionTile(context, email), - cancelButton: _buildCancelButton(context)) - : emailController.openMoreMenuEmailActionForTablet( - context, - position, - _popupMenuEmailActionTile(context, email)))) + ..addOnMoreActionClick((email, position) => responsiveUtils.isMobile(context) + ? emailController.openMoreMenuEmailAction(context, _emailActionMoreActionTile(context, email), cancelButton: _buildCancelButton(context)) + : emailController.openMoreMenuEmailActionForTablet(context, position, _popupMenuEmailActionTile(context, email)))) .build())); } @@ -554,7 +543,7 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio List _emailActionMoreActionTile(BuildContext context, PresentationEmail email) { return [ - _unreadEmailAction(context, email), + _markAsEmailUnreadAction(context, email), ]; } @@ -567,9 +556,9 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio ); } - Widget _unreadEmailAction(BuildContext context, PresentationEmail email) { + Widget _markAsEmailUnreadAction(BuildContext context, PresentationEmail email) { return (EmailActionCupertinoActionSheetActionBuilder( - Key('email_action_unread_action'), + Key('mark_as_unread_action'), SvgPicture.asset(imagePaths.icUnreadEmail, width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton), AppLocalizations.of(context).mark_as_unread, email, @@ -585,7 +574,7 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio List _popupMenuEmailActionTile(BuildContext context, PresentationEmail email) { return [ - PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _unreadEmailAction(context, email)), + PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _markAsEmailUnreadAction(context, email)), ]; } } \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart index 631404ce6..672ec239a 100644 --- a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart +++ b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart @@ -53,10 +53,8 @@ class AppBarMailWidgetBuilder { child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - if (_conditionShow(_context)) - _buildBackButton(), - if (_conditionShow(_context)) - Expanded(child: _buildMailboxName()), + if (_conditionShow(_context)) _buildBackButton(), + if (_conditionShow(_context)) Expanded(child: _buildMailboxName()), if (_presentationEmail != null) _buildListOptionButton(), ] ) @@ -98,21 +96,12 @@ class AppBarMailWidgetBuilder { buildIconWeb( icon: SvgPicture.asset(_imagePaths.icMoveEmail, fit: BoxFit.fill), tooltip: AppLocalizations.of(_context).move_message, - onTap: () { - if (_presentationEmail != null) { - _onEmailActionClick?.call(_presentationEmail!, EmailActionType.move); - } - }), + onTap: () => _onEmailActionClick?.call(_presentationEmail!, EmailActionType.moveToMailbox)), buildIconWeb( - icon: SvgPicture.asset((_presentationEmail != null && _presentationEmail!.isFlaggedEmail()) ? _imagePaths.icStar : _imagePaths.icUnStar, fit: BoxFit.fill), - tooltip: (_presentationEmail != null && _presentationEmail!.isFlaggedEmail()) - ? AppLocalizations.of(_context).mark_as_unstar - : AppLocalizations.of(_context).mark_as_star, - onTap: () { - if (_presentationEmail != null) { - _onEmailActionClick?.call(_presentationEmail!, _presentationEmail!.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar); - } - }), + icon: SvgPicture.asset(_presentationEmail!.hasStarred ? _imagePaths.icStar : _imagePaths.icUnStar, fit: BoxFit.fill), + tooltip: _presentationEmail!.hasStarred ? AppLocalizations.of(_context).not_starred : AppLocalizations.of(_context).mark_as_starred, + onTap: () => _onEmailActionClick?.call(_presentationEmail!, + _presentationEmail!.hasStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred)), buildIconWeb( icon: SvgPicture.asset(_imagePaths.icDeleteEmail, fit: BoxFit.fill), tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 64ad19a47..67c5ae928 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -21,7 +21,6 @@ import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanent 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/move_to_mailbox_state.dart'; -import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart'; @@ -56,7 +55,6 @@ import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; -import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_trash_state.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -109,7 +107,6 @@ class MailboxController extends BaseMailboxController { @override void onInit() { mailboxDashBoardController.accountId.listen((accountId) { - log('MailboxController::onReady(): accountId: $accountId'); if (accountId != null) { getAllMailboxAction(accountId); } @@ -123,16 +120,12 @@ class MailboxController extends BaseMailboxController { mailboxDashBoardController.viewState.listen((state) { state.fold( (failure) { - log('MailboxController::onReady(): ${failure.runtimeType}'); - if (failure is EmptyTrashFolderFailure) { mailboxDashBoardController.clearState(); refreshMailboxChanges(); } }, (success) { - log('MailboxController::onReady(): ${success.runtimeType}'); - if (success is MarkAsMultipleEmailReadAllSuccess || success is MarkAsMultipleEmailReadHasSomeEmailFailure) { mailboxDashBoardController.clearState(); @@ -141,10 +134,6 @@ class MailboxController extends BaseMailboxController { || success is MoveMultipleEmailToMailboxHasSomeEmailFailure) { mailboxDashBoardController.clearState(); refreshMailboxChanges(); - } else if (success is MoveMultipleEmailToTrashAllSuccess - || success is MoveMultipleEmailToTrashHasSomeEmailFailure) { - mailboxDashBoardController.clearState(); - refreshMailboxChanges(); } else if (success is DeleteMultipleEmailsPermanentlyAllSuccess || success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { mailboxDashBoardController.clearState(); @@ -154,7 +143,6 @@ class MailboxController extends BaseMailboxController { refreshMailboxChanges(); } else if (success is MarkAsEmailReadSuccess || success is MoveToMailboxSuccess - || success is MoveToTrashSuccess || success is DeleteEmailPermanentlySuccess || success is SaveEmailAsDraftsSuccess || success is RemoveEmailDraftsSuccess diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart index e7697e066..abd79acc9 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart @@ -11,7 +11,6 @@ import 'package:tmail_ui_user/features/email/data/repository/email_repository_im import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart'; import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart'; @@ -33,7 +32,6 @@ class MailboxDashBoardBindings extends BaseBindings { @override void bindingsController() { Get.put(MailboxDashBoardController( - Get.find(), Get.find(), Get.find(), )); @@ -58,7 +56,6 @@ class MailboxDashBoardBindings extends BaseBindings { void bindingsInteractor() { Get.lazyPut(() => GetUserProfileInteractor(Get.find())); Get.lazyPut(() => RemoveEmailDraftsInteractor(Get.find())); - Get.lazyPut(() => MoveToTrashInteractor(Get.find())); Get.lazyPut(() => MoveToMailboxInteractor(Get.find())); Get.lazyPut(() => DeleteEmailPermanentlyInteractor(Get.find())); } diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index be2355e47..c9a3505e4 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -22,13 +22,13 @@ import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.da import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; -import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart'; +import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; -import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; @@ -58,7 +58,6 @@ class MailboxDashBoardController extends ReloadableController { final ResponsiveUtils _responsiveUtils = Get.find(); final EmailReceiveManager _emailReceiveManager = Get.find(); - final MoveToTrashInteractor _moveToTrashInteractor; final MoveToMailboxInteractor _moveToMailboxInteractor; final DeleteEmailPermanentlyInteractor _deleteEmailPermanentlyInteractor; @@ -84,7 +83,6 @@ class MailboxDashBoardController extends ReloadableController { late StreamSubscription _emailReceiveManagerStreamSubscription; MailboxDashBoardController( - this._moveToTrashInteractor, this._moveToMailboxInteractor, this._deleteEmailPermanentlyInteractor, ); @@ -159,8 +157,8 @@ class MailboxDashBoardController extends ReloadableController { } else if (success is RemoveEmailDraftsSuccess || success is UpdateEmailDraftsSuccess) { clearState(); - } else if (success is MoveToTrashSuccess) { - _moveToTrashSuccess(success); + } else if (success is MoveToMailboxSuccess) { + _moveToMailboxSuccess(success); } else if (success is DeleteEmailPermanentlySuccess) { _deleteEmailPermanentlySuccess(success); } @@ -220,6 +218,9 @@ class MailboxDashBoardController extends ReloadableController { appInformation.value = info; } + MailboxId? getMailboxIdByRole(Role role) { + return mapDefaultMailboxId[role]; + } void setMapDefaultMailboxId(Map newMapMailboxId) { mapDefaultMailboxId = newMapMailboxId; @@ -308,29 +309,28 @@ class MailboxDashBoardController extends ReloadableController { } } - void moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { - consumeState(_moveToTrashInteractor.execute(accountId, moveRequest)); + void moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { + consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); } - void _moveToTrashSuccess(MoveToTrashSuccess success) { - if (success.moveAction == MoveAction.moveToTrash && currentContext != null && currentOverlayContext != null) { + void _moveToMailboxSuccess(MoveToMailboxSuccess success) { + if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) { _appToast.showToastWithAction( currentOverlayContext!, - AppLocalizations.of(currentContext!).moved_to_trash, - AppLocalizations.of(currentContext!).undo_action, - () { - final newMoveRequest = MoveRequest( + success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath), + AppLocalizations.of(currentContext!).undo_action, () { + _revertedToOriginalMailbox(MoveToMailboxRequest( [success.emailId], - success.trashMailboxId, + success.destinationMailboxId, success.currentMailboxId, - MoveAction.undo); - _revertedToOriginalMailbox(newMoveRequest); + MoveAction.undo, + success.emailActionType)); } ); } } - void _revertedToOriginalMailbox(MoveRequest newMoveRequest) { + void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { final currentAccountId = accountId.value; if (currentAccountId != null) { consumeState(_moveToMailboxInteractor.execute(currentAccountId, newMoveRequest)); 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 5c8cb2813..2df6e1f88 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,13 +1,15 @@ import 'package:core/core.dart'; 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:model/email/email_action_type.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; class MoveMultipleEmailToMailboxAllSuccess extends UIState { final List movedListEmailId; final MailboxId currentMailboxId; final MailboxId destinationMailboxId; final MoveAction moveAction; + final EmailActionType emailActionType; final String? destinationPath; MoveMultipleEmailToMailboxAllSuccess( @@ -15,7 +17,9 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState { this.currentMailboxId, this.destinationMailboxId, this.moveAction, - this.destinationPath); + this.emailActionType, + {this.destinationPath} + ); @override List get props => [ @@ -23,16 +27,19 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState { currentMailboxId, destinationMailboxId, moveAction, - destinationPath]; + emailActionType, + destinationPath + ]; } class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure { final MoveAction moveAction; + final EmailActionType emailActionType; - MoveMultipleEmailToMailboxAllFailure(this.moveAction); + MoveMultipleEmailToMailboxAllFailure(this.moveAction, this.emailActionType); @override - List get props => [moveAction]; + List get props => [moveAction, emailActionType]; } class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { @@ -40,6 +47,7 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { final MailboxId currentMailboxId; final MailboxId destinationMailboxId; final MoveAction moveAction; + final EmailActionType emailActionType; final String? destinationPath; MoveMultipleEmailToMailboxHasSomeEmailFailure( @@ -47,7 +55,9 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { this.currentMailboxId, this.destinationMailboxId, this.moveAction, - this.destinationPath); + this.emailActionType, + {this.destinationPath} + ); @override List get props => [ @@ -55,15 +65,18 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { currentMailboxId, destinationMailboxId, moveAction, - destinationPath]; + emailActionType, + destinationPath + ]; } class MoveMultipleEmailToMailboxFailure extends FeatureFailure { final exception; final MoveAction moveAction; + final EmailActionType emailActionType; - MoveMultipleEmailToMailboxFailure(this.exception, this.moveAction); + MoveMultipleEmailToMailboxFailure(this.exception, this.emailActionType, this.moveAction); @override - List get props => [exception, moveAction]; + List get props => [exception, emailActionType, moveAction]; } \ No newline at end of file diff --git a/lib/features/thread/domain/state/move_multiple_email_to_trash_state.dart b/lib/features/thread/domain/state/move_multiple_email_to_trash_state.dart deleted file mode 100644 index 426327f3b..000000000 --- a/lib/features/thread/domain/state/move_multiple_email_to_trash_state.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:core/core.dart'; -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'; - -class MoveMultipleEmailToTrashAllSuccess extends UIState { - final List movedListEmailId; - final MailboxId currentMailboxId; - final MailboxId trashMailboxId; - final MoveAction moveAction; - - MoveMultipleEmailToTrashAllSuccess( - this.movedListEmailId, - this.currentMailboxId, - this.trashMailboxId, - this.moveAction, - ); - - @override - List get props => [ - movedListEmailId, - currentMailboxId, - trashMailboxId, - moveAction, - ]; -} - -class MoveMultipleEmailToTrashAllFailure extends FeatureFailure { - final MoveAction moveAction; - - MoveMultipleEmailToTrashAllFailure(this.moveAction); - - @override - List get props => [moveAction]; -} - -class MoveMultipleEmailToTrashHasSomeEmailFailure extends UIState { - final List movedListEmailId; - final MailboxId currentMailboxId; - final MailboxId trashMailboxId; - final MoveAction moveAction; - - MoveMultipleEmailToTrashHasSomeEmailFailure( - this.movedListEmailId, - this.currentMailboxId, - this.trashMailboxId, - this.moveAction, - ); - - @override - List get props => [ - movedListEmailId, - currentMailboxId, - trashMailboxId, - moveAction, - ]; -} - -class MoveMultipleEmailToTrashFailure extends FeatureFailure { - final exception; - final MoveAction moveAction; - - MoveMultipleEmailToTrashFailure(this.exception, this.moveAction); - - @override - List get props => [exception, moveAction]; -} \ No newline at end of file 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 b682bb047..a7049b863 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 @@ -18,7 +18,7 @@ class MarkAsMultipleEmailReadInteractor { ) async* { try { final listEmailNeedMarkAsRead = emails - .where((email) => readAction == ReadActions.markAsUnread ? email.isReadEmail() : email.isUnReadEmail()) + .where((email) => readAction == ReadActions.markAsUnread ? email.hasRead : !email.hasRead) .toList(); final result = await _emailRepository.markAsRead(accountId, listEmailNeedMarkAsRead, 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 5d9f67d9d..18a9c8f96 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 @@ -18,7 +18,7 @@ class MarkAsStarMultipleEmailInteractor { ) async* { try { final listEmailNeedMarkStar = emails - .where((email) => markStarAction == MarkStarAction.unMarkStar ? email.isFlaggedEmail() : !email.isFlaggedEmail()) + .where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred) .toList(); final result = await _emailRepository.markAsStar(accountId, listEmailNeedMarkStar, 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 2c7ac6c83..9c233116f 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 @@ -3,7 +3,7 @@ import 'dart:async'; import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.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/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; @@ -12,7 +12,7 @@ class MoveMultipleEmailToMailboxInteractor { MoveMultipleEmailToMailboxInteractor(this._emailRepository); - Stream> execute(AccountId accountId, MoveRequest moveRequest) async* { + Stream> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* { try { final result = await _emailRepository.moveToMailbox(accountId, moveRequest); @@ -22,19 +22,21 @@ class MoveMultipleEmailToMailboxInteractor { moveRequest.currentMailboxId, moveRequest.destinationMailboxId, moveRequest.moveAction, - moveRequest.destinationPath)); + moveRequest.emailActionType, + destinationPath: moveRequest.destinationPath)); } else if (result.isEmpty) { - yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction)); + yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction, moveRequest.emailActionType)); } else { yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure( result, moveRequest.currentMailboxId, moveRequest.destinationMailboxId, moveRequest.moveAction, - moveRequest.destinationPath)); + moveRequest.emailActionType, + destinationPath: moveRequest.destinationPath)); } } catch (e) { - yield Left(MoveMultipleEmailToMailboxFailure(e, moveRequest.moveAction)); + yield Left(MoveMultipleEmailToMailboxFailure(e, moveRequest.emailActionType, moveRequest.moveAction)); } } } \ No newline at end of file diff --git a/lib/features/thread/domain/usecases/move_multiple_email_to_trash_interactor.dart b/lib/features/thread/domain/usecases/move_multiple_email_to_trash_interactor.dart deleted file mode 100644 index a93e4fa4e..000000000 --- a/lib/features/thread/domain/usecases/move_multiple_email_to_trash_interactor.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'dart:async'; - -import 'package:core/core.dart'; -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_trash_request.dart'; -import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; -import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_trash_state.dart'; - -class MoveMultipleEmailToTrashInteractor { - final EmailRepository _emailRepository; - - MoveMultipleEmailToTrashInteractor(this._emailRepository); - - Stream> execute(AccountId accountId, MoveToTrashRequest moveRequest) async* { - try { - final result = await _emailRepository.moveToTrash(accountId, moveRequest); - - if (moveRequest.emailIds.length == result.length) { - yield Right(MoveMultipleEmailToTrashAllSuccess( - result, - moveRequest.currentMailboxId, - moveRequest.trashMailboxId, - moveRequest.moveAction)); - } else if (result.isEmpty) { - yield Left(MoveMultipleEmailToTrashAllFailure(moveRequest.moveAction)); - } else { - yield Right(MoveMultipleEmailToTrashHasSomeEmailFailure( - result, - moveRequest.currentMailboxId, - moveRequest.trashMailboxId, - moveRequest.moveAction)); - } - } catch (e) { - yield Left(MoveMultipleEmailToTrashFailure(e, moveRequest.moveAction)); - } - } -} \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_bindings.dart b/lib/features/thread/presentation/thread_bindings.dart index 41fe38f07..bb42f8239 100644 --- a/lib/features/thread/presentation/thread_bindings.dart +++ b/lib/features/thread/presentation/thread_bindings.dart @@ -29,7 +29,6 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_i import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart'; -import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_trash_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart'; @@ -56,7 +55,6 @@ class ThreadBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), - Get.find(), Get.find(), Get.find(), Get.find(), @@ -98,7 +96,6 @@ class ThreadBindings extends BaseBindings { Get.lazyPut(() => LoadMoreEmailsInMailboxInteractor(Get.find())); Get.lazyPut(() => SearchEmailInteractor(Get.find())); Get.lazyPut(() => SearchMoreEmailInteractor(Get.find())); - Get.lazyPut(() => MoveMultipleEmailToTrashInteractor(Get.find())); Get.lazyPut(() => DeleteMultipleEmailsPermanentlyInteractor(Get.find())); Get.lazyPut(() => EmptyTrashFolderInteractor(Get.find())); Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find())); diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index ca712a8a8..0acd82ddc 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -20,15 +20,15 @@ import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_request.dart'; -import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_action.dart'; +import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.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/domain/state/move_to_mailbox_state.dart'; -import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart'; @@ -46,7 +46,6 @@ import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_stat import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; -import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_trash_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart'; @@ -56,7 +55,6 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/load_more_emails_i import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_star_multiple_email_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart'; -import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_trash_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_all_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart'; @@ -85,7 +83,6 @@ class ThreadController extends BaseController { final LoadMoreEmailsInMailboxInteractor _loadMoreEmailsInMailboxInteractor; final SearchEmailInteractor _searchEmailInteractor; final SearchMoreEmailInteractor _searchMoreEmailInteractor; - final MoveMultipleEmailToTrashInteractor _moveMultipleEmailToTrashInteractor; final DeleteMultipleEmailsPermanentlyInteractor _deleteMultipleEmailsPermanentlyInteractor; final EmptyTrashFolderInteractor _emptyTrashFolderInteractor; final MarkAsEmailReadInteractor _markAsEmailReadInteractor; @@ -123,7 +120,6 @@ class ThreadController extends BaseController { this._loadMoreEmailsInMailboxInteractor, this._searchEmailInteractor, this._searchMoreEmailInteractor, - this._moveMultipleEmailToTrashInteractor, this._deleteMultipleEmailsPermanentlyInteractor, this._emptyTrashFolderInteractor, this._markAsEmailReadInteractor, @@ -150,14 +146,11 @@ class ThreadController extends BaseController { super.onReady(); mailboxDashBoardController.viewState.listen((state) { state.map((success) { - log('ThreadController::onReady(): ${success.runtimeType}'); - if (success is SearchEmailNewQuery){ mailboxDashBoardController.clearState(); _searchEmail(); } else if (success is MarkAsEmailReadSuccess || success is MoveToMailboxSuccess - || success is MoveToTrashSuccess || success is MarkAsStarEmailSuccess || success is DeleteEmailPermanentlySuccess || success is SaveEmailAsDraftsSuccess @@ -240,9 +233,6 @@ class ThreadController extends BaseController { } else if (success is MarkAsStarMultipleEmailAllSuccess || success is MarkAsStarMultipleEmailHasSomeEmailFailure) { _markAsStarMultipleEmailSuccess(success); - } else if (success is MoveMultipleEmailToTrashAllSuccess - || success is MoveMultipleEmailToTrashHasSomeEmailFailure) { - _moveSelectedMultipleEmailToTrashSuccess(success); } else if (success is DeleteMultipleEmailsPermanentlyAllSuccess || success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { _deleteMultipleEmailsPermanentlySuccess(success); @@ -572,26 +562,26 @@ class ThreadController extends BaseController { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.role == PresentationMailbox.roleTrash) { - _moveSelectedEmailMultipleToTrash(_accountId!, MoveToTrashRequest( + _moveSelectedEmailMultipleToTrash(_accountId!, MoveToMailboxRequest( listEmailIds, currentMailbox.id, destinationMailbox.id, - MoveAction.moveToTrash)); + MoveAction.moving, + EmailActionType.moveToTrash)); } else { - _moveSelectedEmailMultipleToMailbox( - _accountId!, - MoveRequest( - listEmailIds, - currentMailbox.id, - destinationMailbox.id, - MoveAction.moveTo, - destinationPath: destinationMailbox.mailboxPath)); + _moveSelectedEmailMultipleToMailbox(_accountId!, MoveToMailboxRequest( + listEmailIds, + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToMailbox, + destinationPath: destinationMailbox.mailboxPath)); } } } } - void _moveSelectedEmailMultipleToMailbox(AccountId accountId, MoveRequest moveRequest) { + void _moveSelectedEmailMultipleToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { cancelSelectEmail(); consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest)); } @@ -604,6 +594,7 @@ class ThreadController extends BaseController { MailboxId? currentMailboxId; MailboxId? destinationMailboxId; MoveAction? moveAction; + EmailActionType? emailActionType; if (success is MoveMultipleEmailToMailboxAllSuccess) { destinationPath = success.destinationPath; @@ -611,29 +602,31 @@ class ThreadController extends BaseController { currentMailboxId = success.currentMailboxId; destinationMailboxId = success.destinationMailboxId; moveAction = success.moveAction; + emailActionType = success.emailActionType; } else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) { destinationPath = success.destinationPath; movedEmailIds = success.movedListEmailId; currentMailboxId = success.currentMailboxId; destinationMailboxId = success.destinationMailboxId; moveAction = success.moveAction; + emailActionType = success.emailActionType; } if (currentContext != null && currentOverlayContext != null - && destinationPath != null && moveAction == MoveAction.moveTo) { + && emailActionType != null && moveAction == MoveAction.moving) { _appToast.showToastWithAction( currentOverlayContext!, - AppLocalizations.of(currentContext!).moved_to_mailbox(destinationPath), - AppLocalizations.of(currentContext!).undo_action, - () { + emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: destinationPath), + AppLocalizations.of(currentContext!).undo_action, () { final newCurrentMailboxId = destinationMailboxId; final newDestinationMailboxId = currentMailboxId; if (newCurrentMailboxId != null && newDestinationMailboxId != null) { - _undoMoveSelectedMultipleEmailToMailbox(MoveRequest( + _revertedToOriginalMailbox(MoveToMailboxRequest( movedEmailIds, newCurrentMailboxId, newDestinationMailboxId, MoveAction.undo, + emailActionType!, destinationPath: destinationPath)); } } @@ -643,67 +636,28 @@ class ThreadController extends BaseController { _refreshEmailChanges(); } - void _undoMoveSelectedMultipleEmailToMailbox(MoveRequest moveRequest) { - if (_accountId != null) { - _moveSelectedEmailMultipleToMailbox(_accountId!, moveRequest); - } - } - void moveSelectedMultipleEmailToTrashAction(List listEmail) async { final currentMailbox = mailboxDashBoardController.selectedMailbox.value; - final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash]; + final trashMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleTrash); if (currentMailbox != null && _accountId != null && trashMailboxId != null) { final listEmailIds = listEmail.map((email) => email.id).toList(); - _moveSelectedEmailMultipleToTrash( - _accountId!, - MoveToTrashRequest(listEmailIds, currentMailbox.id, trashMailboxId, MoveAction.moveToTrash) + _moveSelectedEmailMultipleToTrash(_accountId!, MoveToMailboxRequest( + listEmailIds, + currentMailbox.id, + trashMailboxId, + MoveAction.moving, + EmailActionType.moveToTrash) ); } } - void _moveSelectedEmailMultipleToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { + void _moveSelectedEmailMultipleToTrash(AccountId accountId, MoveToMailboxRequest moveRequest) { cancelSelectEmail(); - consumeState(_moveMultipleEmailToTrashInteractor.execute(accountId, moveRequest)); + consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest)); } - void _moveSelectedMultipleEmailToTrashSuccess(Success success) { - mailboxDashBoardController.dispatchState(Right(success)); - - List movedEmailIds = []; - MailboxId? currentMailboxId; - MailboxId? trashMailboxId; - MoveAction? moveAction; - - if (success is MoveMultipleEmailToTrashAllSuccess) { - movedEmailIds = success.movedListEmailId; - currentMailboxId = success.currentMailboxId; - trashMailboxId = success.trashMailboxId; - moveAction = success.moveAction; - } else if (success is MoveMultipleEmailToTrashHasSomeEmailFailure) { - movedEmailIds = success.movedListEmailId; - currentMailboxId = success.currentMailboxId; - trashMailboxId = success.trashMailboxId; - moveAction = success.moveAction; - } - - if (currentContext != null && currentOverlayContext != null && moveAction == MoveAction.moveToTrash) { - _appToast.showToastWithAction( - currentOverlayContext!, - AppLocalizations.of(currentContext!).moved_to_trash, - AppLocalizations.of(currentContext!).undo_action, - () { - if (trashMailboxId != null && currentMailboxId != null) { - _revertedToOriginalMailbox(MoveRequest(movedEmailIds, trashMailboxId, currentMailboxId, MoveAction.undo)); - } - } - ); - } - - _refreshEmailChanges(); - } - - void _revertedToOriginalMailbox(MoveRequest newMoveRequest) { + void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { if (_accountId != null) { consumeState(_moveMultipleEmailToMailboxInteractor.execute(_accountId!, newMoveRequest)); } @@ -841,11 +795,11 @@ class ThreadController extends BaseController { case EmailActionType.markAsUnread: markAsReadSelectedMultipleEmail(selectionEmail); break; - case EmailActionType.markAsStar: - case EmailActionType.markAsUnStar: + case EmailActionType.markAsStarred: + case EmailActionType.unMarkAsStarred: markAsStarSelectedMultipleEmail(selectionEmail); break; - case EmailActionType.move: + case EmailActionType.moveToMailbox: moveSelectedMultipleEmailToMailboxAction(selectionEmail); break; case EmailActionType.moveToTrash: @@ -877,13 +831,13 @@ class ThreadController extends BaseController { case EmailActionType.markAsUnread: markAsEmailRead(selectedEmail, ReadActions.markAsUnread); break; - case EmailActionType.markAsStar: + case EmailActionType.markAsStarred: markAsStarEmail(selectedEmail, MarkStarAction.markStar); break; - case EmailActionType.markAsUnStar: + case EmailActionType.unMarkAsStarred: markAsStarEmail(selectedEmail, MarkStarAction.unMarkStar); break; - case EmailActionType.move: + case EmailActionType.moveToMailbox: moveToMailboxAction(context, selectedEmail); break; case EmailActionType.moveToTrash: @@ -909,57 +863,58 @@ class ThreadController extends BaseController { if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { if (destinationMailbox.role == PresentationMailbox.roleTrash) { - _moveToTrash(accountId, MoveToTrashRequest( + _moveToTrash(accountId, MoveToMailboxRequest( [email.id], currentMailbox.id, destinationMailbox.id, - MoveAction.moveToTrash)); + MoveAction.moving, + EmailActionType.moveToTrash)); } else { - _moveToMailbox(accountId, MoveRequest( + _moveToMailbox(accountId, MoveToMailboxRequest( [email.id], currentMailbox.id, destinationMailbox.id, - MoveAction.moveTo, + MoveAction.moving, + EmailActionType.moveToMailbox, destinationPath: destinationMailbox.mailboxPath)); } } } } - void _moveToMailbox(AccountId accountId, MoveRequest moveRequest) { + void _moveToMailbox(AccountId accountId, MoveToMailboxRequest moveRequest) { consumeState(_moveToMailboxInteractor.execute(accountId, moveRequest)); } - void _moveToMailboxSuccess(Success success) { + void _moveToMailboxSuccess(MoveToMailboxSuccess success) { mailboxDashBoardController.dispatchState(Right(success)); - if (success is MoveToMailboxSuccess - && success.moveAction == MoveAction.moveTo - && currentContext != null && currentOverlayContext != null) { + if (success.moveAction == MoveAction.moving && currentContext != null && currentOverlayContext != null) { _appToast.showToastWithAction( currentOverlayContext!, AppLocalizations.of(currentContext!).moved_to_mailbox(success.destinationPath ?? ''), AppLocalizations.of(currentContext!).undo_action, () { - final newMoveRequest = MoveRequest( + final newMoveRequest = MoveToMailboxRequest( [success.emailId], success.destinationMailboxId, success.currentMailboxId, - MoveAction.undo); + MoveAction.undo, + success.emailActionType); _undoMoveToMailbox(newMoveRequest); } ); } } - void _undoMoveToMailbox(MoveRequest newMoveRequest) { + void _undoMoveToMailbox(MoveToMailboxRequest newMoveRequest) { if (_accountId != null) { _moveToMailbox(_accountId!, newMoveRequest); } } - void _moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { - mailboxDashBoardController.moveToTrash(accountId, moveRequest); + void _moveToTrash(AccountId accountId, MoveToMailboxRequest moveRequest) { + mailboxDashBoardController.moveToMailbox(accountId, moveRequest); } void moveToTrashAction(PresentationEmail email) async { @@ -968,11 +923,12 @@ class ThreadController extends BaseController { final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash]; if (currentMailbox != null && accountId != null && trashMailboxId != null) { - _moveToTrash(accountId, MoveToTrashRequest( + _moveToTrash(accountId, MoveToMailboxRequest( [email.id], currentMailbox.id, trashMailboxId, - MoveAction.moveToTrash) + MoveAction.moving, + EmailActionType.moveToTrash) ); } } diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 444c040ad..322bc8aa2 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -211,12 +211,12 @@ class ThreadView extends GetWidget with UserSettingPopupMenuMi tooltip: controller.listEmailSelected.isAllEmailStarred ? AppLocalizations.of(context).not_starred : AppLocalizations.of(context).starred, onTap: () => controller.pressEmailSelectionAction( context, - controller.listEmailSelected.isAllEmailStarred ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, + controller.listEmailSelected.isAllEmailStarred ? EmailActionType.markAsStarred : EmailActionType.unMarkAsStarred, controller.listEmailSelected)), buildIconWeb( icon: SvgPicture.asset(_imagePaths.icMove, fit: BoxFit.fill), tooltip: AppLocalizations.of(context).move, - onTap: () => controller.pressEmailSelectionAction(context, EmailActionType.move, controller.listEmailSelected)), + onTap: () => controller.pressEmailSelectionAction(context, EmailActionType.moveToMailbox, controller.listEmailSelected)), buildIconWeb( icon: SvgPicture.asset(_imagePaths.icDelete, fit: BoxFit.fill), tooltip: controller.mailboxDashBoardController.selectedMailbox.value?.role != PresentationMailbox.roleTrash diff --git a/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart b/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart deleted file mode 100644 index c6a0888da..000000000 --- a/lib/features/thread/presentation/widgets/app_bar_thread_select_mode_active_builder.dart +++ /dev/null @@ -1,153 +0,0 @@ - -import 'package:core/core.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; -import 'package:model/email/presentation_email.dart'; -import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; - -typedef OnCloseActionClick = void Function(); -typedef OnMarkAsEmailReadActionClick = void Function(List listEmail); -typedef OnRemoveEmailActionClick = void Function(List listEmail); -typedef OnOpenContextMenuActionClick = void Function(List listEmail); -typedef OnOpenPopupMenuActionClick = void Function(List listEmail, RelativeRect position); - -class AppBarThreadSelectModeActiveBuilder { - OnCloseActionClick? _onCloseActionClick; - OnMarkAsEmailReadActionClick? _onMarkAsEmailReadActionClick; - // OnRemoveEmailActionClick? _onRemoveEmailActionClick; - OnOpenContextMenuActionClick? _onOpenContextMenuActionClick; - OnOpenPopupMenuActionClick? _onOpenPopupMenuActionClick; - - final BuildContext _context; - final ImagePaths _imagePaths; - final List _listEmail; - final ResponsiveUtils _responsiveUtils; - - AppBarThreadSelectModeActiveBuilder(this._context, this._imagePaths, this._listEmail, this._responsiveUtils); - - void addCloseActionClick(OnCloseActionClick onCloseActionClick) { - _onCloseActionClick = onCloseActionClick; - } - - void addOnMarkAsEmailReadActionClick(OnMarkAsEmailReadActionClick onMarkAsEmailReadActionClick) { - _onMarkAsEmailReadActionClick = onMarkAsEmailReadActionClick; - } - - // void addRemoveEmailActionClick(OnRemoveEmailActionClick onRemoveEmailActionClick) { - // _onRemoveEmailActionClick = onRemoveEmailActionClick; - // } - - void addOpenContextMenuActionClick(OnOpenContextMenuActionClick onOpenContextMenuActionClick) { - _onOpenContextMenuActionClick = onOpenContextMenuActionClick; - } - - void addOnOpenPopupMenuActionClick(OnOpenPopupMenuActionClick onOpenPopupMenuActionClick) { - _onOpenPopupMenuActionClick = onOpenPopupMenuActionClick; - } - - Widget build() { - return Container( - key: Key('app_bar_thread_select_mode_active'), - alignment: Alignment.topCenter, - color: Colors.white, - margin: EdgeInsets.zero, - padding: EdgeInsets.only(left: 10, right: 16, top: 10, bottom: 10), - child: MediaQuery( - data: MediaQueryData(padding: EdgeInsets.zero), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.end, - children: [ - _buildBackButton(), - Expanded(child: _buildCountItemSelected()), - _buildListOptionButton(), - ] - ) - ) - ); - } - - Widget _buildCountItemSelected() { - return Padding( - padding: EdgeInsets.only(left: 12), - child: Text( - AppLocalizations.of(_context).count_email_selected(_listEmail.length), - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 18, color: AppColor.nameUserColor, fontWeight: FontWeight.w500))); - } - - Widget _buildBackButton() { - return Material( - borderRadius: BorderRadius.circular(12), - color: Colors.transparent, - child: IconButton( - color: AppColor.baseTextColor, - icon: SvgPicture.asset(_imagePaths.icComposerClose, color: AppColor.baseTextColor, fit: BoxFit.fill), - onPressed: () => { - if (_onCloseActionClick != null) { - _onCloseActionClick!() - } - } - )); - } - - Widget _buildListOptionButton() { - return Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - // IconButton( - // key: Key('button_remove_email_selected'), - // color: AppColor.baseTextColor, - // icon: SvgPicture.asset(_imagePaths.icTrash, color: AppColor.baseTextColor, fit: BoxFit.fill), - // onPressed: () => { - // if (_onRemoveEmailActionClick != null) { - // _onRemoveEmailActionClick!(_listEmail) - // } - // }), - Material( - borderRadius: BorderRadius.circular(12), - color: Colors.transparent, - child: IconButton( - key: Key('button_unread_email_selected'), - color: AppColor.baseTextColor, - icon: SvgPicture.asset(_imagePaths.icEyeDisable, color: AppColor.baseTextColor, fit: BoxFit.fill), - onPressed: () => { - if (_onMarkAsEmailReadActionClick != null) { - _onMarkAsEmailReadActionClick!(_listEmail) - } - })), - GestureDetector( - key: Key('button_menu_select_email'), - onTap: () => { - if (_onOpenContextMenuActionClick != null && _responsiveUtils.isMobile(_context)) { - _onOpenContextMenuActionClick!(_listEmail) - } - }, - child: Padding( - padding: EdgeInsets.all(8), - child: SvgPicture.asset( - _imagePaths.icComposerMenu, - color: AppColor.baseTextColor, - width: 24, - height: 24, - fit: BoxFit.fill), - ), - onTapDown: (detail) { - if (_onOpenPopupMenuActionClick != null && !_responsiveUtils.isMobile(_context)) { - final screenSize = MediaQuery.of(_context).size; - final offset = detail.globalPosition; - final position = RelativeRect.fromLTRB( - offset.dx, - offset.dy, - screenSize.width - offset.dx, - screenSize.height - offset.dy, - ); - _onOpenPopupMenuActionClick!(_listEmail, position); - } - }) - ] - ); - } -} \ No newline at end of file diff --git a/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart b/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart index e51bf09ee..61b5d0ead 100644 --- a/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart +++ b/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart @@ -107,12 +107,12 @@ class AppBarThreadWidgetBuilder { icon: SvgPicture.asset(_listSelectionEmail.isAllEmailStarred ? _imagePaths.icUnStar : _imagePaths.icStar, fit: BoxFit.fill), tooltip: _listSelectionEmail.isAllEmailStarred ? AppLocalizations.of(_context).not_starred : AppLocalizations.of(_context).starred, onTap: () => _onEmailSelectionAction?.call( - _listSelectionEmail.isAllEmailStarred ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, + _listSelectionEmail.isAllEmailStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred, _listSelectionEmail)), buildIconWeb( icon: SvgPicture.asset(_imagePaths.icMove, fit: BoxFit.fill), tooltip: AppLocalizations.of(_context).move, - onTap: () => _onEmailSelectionAction?.call(EmailActionType.move, _listSelectionEmail)), + onTap: () => _onEmailSelectionAction?.call(EmailActionType.moveToMailbox, _listSelectionEmail)), buildIconWeb( icon: SvgPicture.asset(_imagePaths.icDelete, fit: BoxFit.fill), tooltip: _presentationMailbox?.role != PresentationMailbox.roleTrash diff --git a/lib/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart b/lib/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart index e1f5837f6..6bf58a547 100644 --- a/lib/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart +++ b/lib/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart @@ -65,10 +65,10 @@ class BottomBarThreadSelectionWidget { ..onPressActionClick(() { if (_onPressEmailSelectionActionClick != null) { _onPressEmailSelectionActionClick!( - _listSelectionEmail.isAllEmailStarred ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, + _listSelectionEmail.isAllEmailStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred, _listSelectionEmail); }}) - ..text(_listSelectionEmail.isAllEmailStarred ? AppLocalizations.of(_context).mark_as_unstar : AppLocalizations.of(_context).mark_as_star, + ..text(_listSelectionEmail.isAllEmailStarred ? AppLocalizations.of(_context).not_starred : AppLocalizations.of(_context).starred, isVertical: _responsiveUtils.isMobile(_context))) .build()), Expanded(child: (ButtonBuilder(_imagePaths.icMove) @@ -77,7 +77,7 @@ class BottomBarThreadSelectionWidget { ..textStyle(TextStyle(fontSize: 12, color: AppColor.colorTextButton)) ..onPressActionClick(() { if (_onPressEmailSelectionActionClick != null) { - _onPressEmailSelectionActionClick!(EmailActionType.move, _listSelectionEmail); + _onPressEmailSelectionActionClick!(EmailActionType.moveToMailbox, _listSelectionEmail); }}) ..text(AppLocalizations.of(_context).move, isVertical: _responsiveUtils.isMobile(_context))) .build()), diff --git a/lib/features/thread/presentation/widgets/email_tile_builder.dart b/lib/features/thread/presentation/widgets/email_tile_builder.dart index 03663984a..2942ba542 100644 --- a/lib/features/thread/presentation/widgets/email_tile_builder.dart +++ b/lib/features/thread/presentation/widgets/email_tile_builder.dart @@ -80,7 +80,7 @@ class EmailTileBuilder { ), title: Row( children: [ - if (_presentationEmail.isUnReadEmail()) + if (!_presentationEmail.hasRead) Padding( padding: EdgeInsets.only(right: 5), child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)), @@ -155,7 +155,7 @@ class EmailTileBuilder { style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold), ) ), - if (_presentationEmail.isFlaggedEmail() ) + if (_presentationEmail.hasStarred) (ButtonBuilder(_imagePaths.icStar) ..paddingIcon(EdgeInsets.zero) ..size(15)) @@ -199,18 +199,18 @@ class EmailTileBuilder { Container( padding: EdgeInsets.only(left: 16, right: 16), alignment: Alignment.center, - child: _presentationEmail.isUnReadEmail() + child: !_presentationEmail.hasRead ? SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill) : SizedBox(width: 9)), buildIconWeb( icon: SvgPicture.asset( - _presentationEmail.isFlaggedEmail() ? _imagePaths.icStar : _imagePaths.icUnStar, + _presentationEmail.hasStarred ? _imagePaths.icStar : _imagePaths.icUnStar, width: 20, height: 20, fit: BoxFit.fill), - tooltip: _presentationEmail.isFlaggedEmail() ? AppLocalizations.of(_context).starred : AppLocalizations.of(_context).not_starred, + tooltip: _presentationEmail.hasStarred ? AppLocalizations.of(_context).starred : AppLocalizations.of(_context).not_starred, onTap: () => _emailActionClick?.call( - _presentationEmail.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, + _presentationEmail.hasStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred, _presentationEmail)), if (_selectModeAll == SelectMode.INACTIVE) SizedBox(width: 8), GestureDetector( diff --git a/lib/features/thread/presentation/widgets/email_tile_web_builder.dart b/lib/features/thread/presentation/widgets/email_tile_web_builder.dart index 0070f9a80..5e9b88fe0 100644 --- a/lib/features/thread/presentation/widgets/email_tile_web_builder.dart +++ b/lib/features/thread/presentation/widgets/email_tile_web_builder.dart @@ -108,7 +108,7 @@ class EmailTileBuilder { child: _buildAvatarIcon(), ), title: Row(children: [ - if (_presentationEmail.isUnReadEmail()) + if (!_presentationEmail.hasRead) Padding( padding: EdgeInsets.only(right: 5), child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)), @@ -178,7 +178,7 @@ class EmailTileBuilder { style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold), ) ), - if (_presentationEmail.isFlaggedEmail() ) + if (_presentationEmail.hasStarred) (ButtonBuilder(_imagePaths.icStar) ..paddingIcon(EdgeInsets.zero) ..size(15)) @@ -230,7 +230,7 @@ class EmailTileBuilder { Transform( transform: Matrix4.translationValues(0.0, isHoverItem ? -10.0 : 0.0, 0.0), child: Row(children: [ - if (_presentationEmail.isUnReadEmail()) + if (!_presentationEmail.hasRead) Padding( padding: EdgeInsets.only(right: 5), child: SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill)), @@ -287,7 +287,7 @@ class EmailTileBuilder { style: TextStyle(fontSize: 10, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold), ) ), - if (_presentationEmail.isFlaggedEmail() ) + if (_presentationEmail.hasStarred) (ButtonBuilder(_imagePaths.icStar) ..paddingIcon(EdgeInsets.zero) ..size(15)) @@ -335,18 +335,18 @@ class EmailTileBuilder { Container( padding: EdgeInsets.only(left: 16, right: 16), alignment: Alignment.center, - child: _presentationEmail.isUnReadEmail() + child: !_presentationEmail.hasRead ? SvgPicture.asset(_imagePaths.icUnreadStatus, width: 9, height: 9, fit: BoxFit.fill) : SizedBox(width: 9)), buildIconWeb( icon: SvgPicture.asset( - _presentationEmail.isFlaggedEmail() ? _imagePaths.icStar : _imagePaths.icUnStar, + _presentationEmail.hasStarred ? _imagePaths.icStar : _imagePaths.icUnStar, width: 20, height: 20, fit: BoxFit.fill), - tooltip: _presentationEmail.isFlaggedEmail() ? AppLocalizations.of(_context).starred : AppLocalizations.of(_context).not_starred, + tooltip: _presentationEmail.hasStarred ? AppLocalizations.of(_context).starred : AppLocalizations.of(_context).not_starred, onTap: () => _emailActionClick?.call( - _presentationEmail.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar, + _presentationEmail.hasStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred, _presentationEmail)), if (_selectModeAll == SelectMode.INACTIVE) SizedBox(width: 8), GestureDetector( @@ -396,15 +396,15 @@ class EmailTileBuilder { return Row(children: [ buildIconWeb( icon: SvgPicture.asset( - _presentationEmail.isReadEmail() ? _imagePaths.icRead : _imagePaths.icUnread, + _presentationEmail.hasRead ? _imagePaths.icRead : _imagePaths.icUnread, color: AppColor.colorActionButtonHover, width: _responsiveUtils.isDesktop(_context) ? 16 : 14, height: _responsiveUtils.isDesktop(_context) ? 16 : 14, fit: BoxFit.fill), splashRadius: _responsiveUtils.isDesktop(_context) ? 15 : 10, - tooltip: _presentationEmail.isReadEmail() ? AppLocalizations.of(_context).mark_as_unread : AppLocalizations.of(_context).mark_as_read, + tooltip: _presentationEmail.hasRead ? AppLocalizations.of(_context).mark_as_unread : AppLocalizations.of(_context).mark_as_read, onTap: () => _emailActionClick?.call( - _presentationEmail.isReadEmail() ? EmailActionType.markAsUnread : EmailActionType.markAsRead, + _presentationEmail.hasRead ? EmailActionType.markAsUnread : EmailActionType.markAsRead, _presentationEmail)), buildIconWeb( icon: SvgPicture.asset( @@ -415,7 +415,7 @@ class EmailTileBuilder { fit: BoxFit.fill), splashRadius: _responsiveUtils.isDesktop(_context) ? 15 : 10, tooltip: AppLocalizations.of(_context).move, - onTap: () => _emailActionClick?.call(EmailActionType.move, _presentationEmail)), + onTap: () => _emailActionClick?.call(EmailActionType.moveToMailbox, _presentationEmail)), buildIconWeb( icon: SvgPicture.asset( _imagePaths.icDelete, diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index d384a81d7..4896d9353 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-04-14T15:13:36.565629", + "@@last_modified": "2022-04-15T15:46:44.683811", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -214,8 +214,8 @@ "placeholders_order": [], "placeholders": {} }, - "mark_as_star": "Star", - "@mark_as_star": { + "mark_as_starred": "Mark as starred", + "@mark_as_starred": { "type": "text", "placeholders_order": [], "placeholders": {} @@ -354,12 +354,6 @@ "placeholders_order": [], "placeholders": {} }, - "mark_as_unstar": "Unstar", - "@mark_as_unstar": { - "type": "text", - "placeholders_order": [], - "placeholders": {} - }, "marked_star_multiple_item": "Marked star {count} item", "@marked_star_multiple_item": { "type": "text", diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index eb2922894..4ab243ba1 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -243,10 +243,10 @@ class AppLocalizations { ); } - String get mark_as_star { + String get mark_as_starred { return Intl.message( - 'Star', - name: 'mark_as_star', + 'Mark as starred', + name: 'mark_as_starred', ); } @@ -388,13 +388,6 @@ class AppLocalizations { ); } - String get mark_as_unstar { - return Intl.message( - 'Unstar', - name: 'mark_as_unstar', - ); - } - String marked_star_multiple_item(int count) { return Intl.message( 'Marked star $count item', diff --git a/model/lib/email/email_action_type.dart b/model/lib/email/email_action_type.dart index 4c12f14b1..fe14be783 100644 --- a/model/lib/email/email_action_type.dart +++ b/model/lib/email/email_action_type.dart @@ -6,9 +6,9 @@ enum EmailActionType { compose, markAsRead, markAsUnread, - markAsStar, - markAsUnStar, - move, + markAsStarred, + unMarkAsStarred, + moveToMailbox, edit, composeFromEmailAddress, moveToTrash, diff --git a/model/lib/email/filter_message_option.dart b/model/lib/email/filter_message_option.dart index dfbfe4c65..5f617a7c2 100644 --- a/model/lib/email/filter_message_option.dart +++ b/model/lib/email/filter_message_option.dart @@ -17,11 +17,11 @@ extension FilterMessageOptionExtension on FilterMessageOption { case FilterMessageOption.all: return true; case FilterMessageOption.unread: - return email.isUnReadEmail(); + return !email.hasRead; case FilterMessageOption.attachments: return email.withAttachments; case FilterMessageOption.starred: - return email.isFlaggedEmail(); + return email.hasStarred; } } @@ -30,11 +30,11 @@ extension FilterMessageOptionExtension on FilterMessageOption { case FilterMessageOption.all: return true; case FilterMessageOption.unread: - return email.isUnReadEmail(); + return !email.hasRead; case FilterMessageOption.attachments: return email.withAttachments; case FilterMessageOption.starred: - return email.isFlaggedEmail(); + return email.hasStarred; } } } \ No newline at end of file diff --git a/model/lib/email/presentation_email.dart b/model/lib/email/presentation_email.dart index 0fde20751..68de84ac1 100644 --- a/model/lib/email/presentation_email.dart +++ b/model/lib/email/presentation_email.dart @@ -80,11 +80,9 @@ class PresentationEmail with EquatableMixin { String getPartialContent() => preview ?? ''; - bool isUnReadEmail() => !(keywords?.containsKey(KeyWordIdentifier.emailSeen) == true); + bool get hasRead => keywords?.containsKey(KeyWordIdentifier.emailSeen) == true; - bool isReadEmail() => keywords?.containsKey(KeyWordIdentifier.emailSeen) == true; - - bool isFlaggedEmail() => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true; + bool get hasStarred => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true; bool get withAttachments => hasAttachment == true; diff --git a/model/lib/extensions/email_extension.dart b/model/lib/extensions/email_extension.dart index 0c6bb7c2d..0551da954 100644 --- a/model/lib/extensions/email_extension.dart +++ b/model/lib/extensions/email_extension.dart @@ -8,11 +8,9 @@ import 'package:model/model.dart'; extension EmailExtension on Email { - bool isUnReadEmail() => !(keywords?.containsKey(KeyWordIdentifier.emailSeen) == true); + bool get hasRead => keywords?.containsKey(KeyWordIdentifier.emailSeen) == true; - bool isReadEmail() => keywords?.containsKey(KeyWordIdentifier.emailSeen) == true; - - bool isFlaggedEmail() => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true; + bool get hasStarred => keywords?.containsKey(KeyWordIdentifier.emailFlagged) == true; bool get withAttachments => hasAttachment == true; diff --git a/model/lib/extensions/list_email_id_extension.dart b/model/lib/extensions/list_email_id_extension.dart index cbfd18d06..e5f344a17 100644 --- a/model/lib/extensions/list_email_id_extension.dart +++ b/model/lib/extensions/list_email_id_extension.dart @@ -32,4 +32,12 @@ extension ListEmailIdExtension on List { }); return maps; } + + Map generateMapUpdateObjectMarkAsSpam(MailboxId spamMailboxId) { + final Map maps = {}; + forEach((emailId) { + maps[emailId.id] = spamMailboxId.generateActionPath(); + }); + return maps; + } } \ No newline at end of file diff --git a/model/lib/extensions/list_presentation_email_extension.dart b/model/lib/extensions/list_presentation_email_extension.dart index f4908c133..bb81cb32a 100644 --- a/model/lib/extensions/list_presentation_email_extension.dart +++ b/model/lib/extensions/list_presentation_email_extension.dart @@ -3,11 +3,11 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; extension ListPresentationEmailExtension on List { - bool get isAllEmailRead => every((email) => email.isReadEmail()); + bool get isAllEmailRead => every((email) => email.hasRead); - bool get isAllEmailStarred => every((email) => email.isFlaggedEmail()); + bool get isAllEmailStarred => every((email) => email.hasStarred); - List get allEmailUnread => where((email) => email.isUnReadEmail()).toList(); + List get allEmailUnread => where((email) => !email.hasRead).toList(); PresentationEmail? findEmail(EmailId emailId) { try { diff --git a/model/lib/extensions/mailbox_id_extension.dart b/model/lib/extensions/mailbox_id_extension.dart index 497921463..03a8fadfa 100644 --- a/model/lib/extensions/mailbox_id_extension.dart +++ b/model/lib/extensions/mailbox_id_extension.dart @@ -12,4 +12,10 @@ extension MailboxIdExtension on MailboxId { destinationMailboxId.generatePath(): true }); } + + PatchObject generateActionPath() { + return PatchObject({ + generatePath(): true, + }); + } } \ No newline at end of file diff --git a/model/lib/mailbox/presentation_mailbox.dart b/model/lib/mailbox/presentation_mailbox.dart index 93770a59a..73fbf6c8e 100644 --- a/model/lib/mailbox/presentation_mailbox.dart +++ b/model/lib/mailbox/presentation_mailbox.dart @@ -11,6 +11,7 @@ class PresentationMailbox with EquatableMixin { static final roleTemplates = Role('templates'); static final roleOutbox = Role('outbox'); static final roleDrafts = Role('drafts'); + static final roleSpam = Role('spam'); final MailboxId id; final MailboxName? name; @@ -56,6 +57,8 @@ class PresentationMailbox with EquatableMixin { return unreadEmails!.value.value <= 999 ? '${unreadEmails!.value.value}' : '999+'; } + bool get isSpam => role == roleSpam; + @override List get props => [ id, diff --git a/model/lib/model.dart b/model/lib/model.dart index af547b579..fb1275c0b 100644 --- a/model/lib/model.dart +++ b/model/lib/model.dart @@ -25,7 +25,6 @@ export 'email/presentation_email_address.dart'; export 'email/email_address_cache.dart'; export 'email/read_actions.dart'; export 'email/attachment.dart'; -export 'email/move_action.dart'; export 'email/mark_star_action.dart'; export 'email/email_property.dart'; export 'email/email_filter.dart';