From 8bf80db4de116cdad398671a48dd741ac14675e4 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 30 Mar 2022 16:50:50 +0700 Subject: [PATCH] TF-314 Implement delete an email in EmailView --- .../data/datasource/email_datasource.dart | 3 ++ .../email_datasource_impl.dart | 10 +++++ .../email/data/network/email_api.dart | 29 ++++++++++++ .../repository/email_repository_impl.dart | 6 +++ .../domain/model/move_to_trash_request.dart | 28 ++++++++++++ .../domain/repository/email_repository.dart | 3 ++ .../domain/state/move_to_trash_state.dart | 35 +++++++++++++++ .../usecases/move_to_trash_interactor.dart | 29 ++++++++++++ .../email/presentation/email_bindings.dart | 2 + .../email/presentation/email_controller.dart | 25 ++++++++++- .../widgets/app_bar_mail_widget_builder.dart | 9 ++++ .../presentation/mailbox_controller.dart | 2 + .../mailbox_dashboard_bindings.dart | 9 +++- .../mailbox_dashboard_controller.dart | 44 ++++++++++++++++++- .../presentation/thread_controller.dart | 2 + lib/main/localizations/app_localizations.dart | 7 +++ model/lib/email/email_action_type.dart | 3 +- model/lib/email/move_action.dart | 1 + 18 files changed, 242 insertions(+), 5 deletions(-) create mode 100644 lib/features/email/domain/model/move_to_trash_request.dart create mode 100644 lib/features/email/domain/state/move_to_trash_state.dart create mode 100644 lib/features/email/domain/usecases/move_to_trash_interactor.dart diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 9c75fb7e1..cd6b0484e 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -4,6 +4,7 @@ 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'; abstract class EmailDataSource { Future getEmailContent(AccountId accountId, EmailId emailId); @@ -36,6 +37,8 @@ abstract class EmailDataSource { Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest); + Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest); + Future> markAsStar( AccountId accountId, List emails, 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 2415c3a18..6a3b72004 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -6,6 +6,7 @@ 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'; class EmailDataSourceImpl extends EmailDataSource { @@ -122,4 +123,13 @@ class EmailDataSourceImpl extends EmailDataSource { throw error; }); } + + @override + Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { + return Future.sync(() async { + return await emailAPI.moveToTrash(accountId, moveRequest); + }).catchError((error) { + throw error; + }); + } } \ No newline at end of file diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 7965a7fa1..d27c988f2 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -27,6 +27,7 @@ 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'; class EmailAPI { @@ -352,4 +353,32 @@ class EmailAPI { throw error; }); } + + 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; + }); + } } \ No newline at end of file diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index fead87f91..4b4529205 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -7,6 +7,7 @@ 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/repository/email_repository.dart'; class EmailRepositoryImpl extends EmailRepository { @@ -108,4 +109,9 @@ class EmailRepositoryImpl extends EmailRepository { Future downloadAttachmentForWeb(Attachment attachment, AccountId accountId, String baseDownloadUrl, AccountRequest accountRequest) { return emailDataSource.downloadAttachmentForWeb(attachment, accountId, baseDownloadUrl, accountRequest); } + + @override + Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { + return emailDataSource.moveToTrash(accountId, moveRequest); + } } \ 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 new file mode 100644 index 000000000..b8e1d2b38 --- /dev/null +++ b/lib/features/email/domain/model/move_to_trash_request.dart @@ -0,0 +1,28 @@ + +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 ad67c79e6..fe4c6ac9d 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -4,6 +4,7 @@ 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'; abstract class EmailRepository { Future getEmailContent(AccountId accountId, EmailId emailId); @@ -36,6 +37,8 @@ abstract class EmailRepository { Future> moveToMailbox(AccountId accountId, MoveRequest moveRequest); + Future> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest); + Future> markAsStar( AccountId accountId, List emails, diff --git a/lib/features/email/domain/state/move_to_trash_state.dart b/lib/features/email/domain/state/move_to_trash_state.dart new file mode 100644 index 000000000..f1b04e521 --- /dev/null +++ b/lib/features/email/domain/state/move_to_trash_state.dart @@ -0,0 +1,35 @@ +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_trash_interactor.dart b/lib/features/email/domain/usecases/move_to_trash_interactor.dart new file mode 100644 index 000000000..40ca5a9f4 --- /dev/null +++ b/lib/features/email/domain/usecases/move_to_trash_interactor.dart @@ -0,0 +1,29 @@ +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 af1cb70ca..9b7040742 100644 --- a/lib/features/email/presentation/email_bindings.dart +++ b/lib/features/email/presentation/email_bindings.dart @@ -17,6 +17,7 @@ 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'; @@ -75,6 +76,7 @@ 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 b00fba373..520a9d385 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -15,6 +15,7 @@ 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/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'; @@ -380,6 +381,26 @@ class EmailController extends BaseController { } } + void moveToTrashAction(BuildContext context, PresentationEmail email) async { + final currentMailbox = mailboxDashBoardController.selectedMailbox.value; + final accountId = mailboxDashBoardController.accountId.value; + final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash]; + + if (currentMailbox != null && accountId != null && trashMailboxId != null) { + _moveToTrash(context, accountId, MoveToTrashRequest( + [email.id], + currentMailbox.id, + trashMailboxId, + MoveAction.moveToTrash) + ); + } + } + + void _moveToTrash(BuildContext context, AccountId accountId, MoveToTrashRequest moveRequest) { + backToThreadView(context); + mailboxDashBoardController.moveToTrash(accountId, moveRequest); + } + void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async { final accountId = mailboxDashBoardController.accountId.value; final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; @@ -410,8 +431,8 @@ class EmailController extends BaseController { case EmailActionType.move: moveToMailboxAction(presentationEmail); break; - case EmailActionType.delete: - _appToast.showToast(AppLocalizations.of(context).the_feature_is_under_development); + case EmailActionType.moveToTrash: + moveToTrashAction(context, presentationEmail); break; default: break; 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 9a9996ad7..ab61e9f94 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 @@ -113,6 +113,15 @@ class AppBarMailWidgetBuilder { _onEmailActionClick?.call(_presentationEmail!, _presentationEmail!.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar); } }), + if (_currentMailbox?.role != PresentationMailbox.roleTrash) + buildIconWeb( + icon: SvgPicture.asset(_imagePaths.icDeleteEmail, fit: BoxFit.fill), + tooltip: AppLocalizations.of(_context).move_to_trash, + onTap: () { + if (_presentationEmail != null) { + _onEmailActionClick?.call(_presentationEmail!, EmailActionType.moveToTrash); + } + }), Padding( padding: EdgeInsets.only(left: 10, right: 16), child: buildIconWebHasPosition( diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 05accc084..7fdc10580 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -18,6 +18,7 @@ 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/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'; @@ -122,6 +123,7 @@ class MailboxController extends BaseMailboxController { refreshMailboxChanges(); } else if (success is MarkAsEmailReadSuccess || success is MoveToMailboxSuccess + || success is MoveToTrashSuccess || success is SaveEmailAsDraftsSuccess || success is RemoveEmailDraftsSuccess || success is SendEmailSuccess diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart index db8121e55..567044252 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart @@ -9,6 +9,8 @@ import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/repository/email_repository_impl.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.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'; @@ -29,7 +31,10 @@ class MailboxDashBoardBindings extends BaseBindings { @override void bindingsController() { - Get.put(MailboxDashBoardController()); + Get.put(MailboxDashBoardController( + Get.find(), + Get.find(), + )); } @override @@ -51,6 +56,8 @@ 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())); } @override diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index c63f5626e..ce49efaa7 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -18,6 +18,11 @@ 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/email/domain/state/move_to_trash_state.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'; @@ -43,6 +48,9 @@ class MailboxDashBoardController extends ReloadableController { final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find(); final CachingManager _cachingManager = Get.find(); + final MoveToTrashInteractor _moveToTrashInteractor; + final MoveToMailboxInteractor _moveToMailboxInteractor; + final scaffoldKey = GlobalKey(); final selectedMailbox = Rxn(); final selectedEmail = Rxn(); @@ -61,7 +69,10 @@ class MailboxDashBoardController extends ReloadableController { FocusNode searchFocus = FocusNode(); RouterArguments? routerArguments; - MailboxDashBoardController(); + MailboxDashBoardController( + this._moveToTrashInteractor, + this._moveToMailboxInteractor, + ); @override void onReady() { @@ -125,6 +136,8 @@ class MailboxDashBoardController extends ReloadableController { } else if (success is RemoveEmailDraftsSuccess || success is UpdateEmailDraftsSuccess) { clearState(); + } else if (success is MoveToTrashSuccess) { + _moveToTrashSuccess(success); } } ); @@ -240,6 +253,35 @@ class MailboxDashBoardController extends ReloadableController { } } + void moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) { + consumeState(_moveToTrashInteractor.execute(accountId, moveRequest)); + } + + void _moveToTrashSuccess(MoveToTrashSuccess success) { + if (success.moveAction == MoveAction.moveToTrash && currentContext != null && currentOverlayContext != null) { + _appToast.showToastWithAction( + currentOverlayContext!, + AppLocalizations.of(currentContext!).moved_to_trash, + AppLocalizations.of(currentContext!).undo_action, + () { + final newMoveRequest = MoveRequest( + [success.emailId], + success.trashMailboxId, + success.currentMailboxId, + MoveAction.undo); + _revertedToOriginalMailbox(newMoveRequest); + } + ); + } + } + + void _revertedToOriginalMailbox(MoveRequest newMoveRequest) { + final currentAccountId = accountId.value; + if (currentAccountId != null) { + consumeState(_moveToMailboxInteractor.execute(currentAccountId, newMoveRequest)); + } + } + void _discardEmail(Email email) { final currentAccountId = accountId.value; if (currentAccountId != null) { diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 13fb938ac..177774ff8 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_request.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/mark_as_star_email_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; @@ -133,6 +134,7 @@ class ThreadController extends BaseController { _searchEmail(); } else if (success is MarkAsEmailReadSuccess || success is MoveToMailboxSuccess + || success is MoveToTrashSuccess || success is MarkAsStarEmailSuccess || success is SaveEmailAsDraftsSuccess || success is RemoveEmailDraftsSuccess diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index dd8038107..d331b4da1 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -963,4 +963,11 @@ class AppLocalizations { name: 'your_download_has_started' ); } + + String get moved_to_trash { + return Intl.message( + 'Moved to Trash', + name: 'moved_to_trash' + ); + } } \ No newline at end of file diff --git a/model/lib/email/email_action_type.dart b/model/lib/email/email_action_type.dart index a6bfce7ac..0883fb4ab 100644 --- a/model/lib/email/email_action_type.dart +++ b/model/lib/email/email_action_type.dart @@ -13,5 +13,6 @@ enum EmailActionType { markAsSpam, delete, edit, - composeFromEmailAddress + composeFromEmailAddress, + moveToTrash, } \ No newline at end of file diff --git a/model/lib/email/move_action.dart b/model/lib/email/move_action.dart index ce4376e55..7621ac232 100644 --- a/model/lib/email/move_action.dart +++ b/model/lib/email/move_action.dart @@ -1,5 +1,6 @@ enum MoveAction { moveTo, + moveToTrash, undo } \ No newline at end of file