From 750063d1f465bbea6aad15d892e16a6f5b9474f9 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 15 Apr 2022 16:20:02 +0700 Subject: [PATCH] TF-153 Mark as spam when open email --- assets/images/ic_avatar_spam.svg | 3 ++ assets/images/ic_not_spam.svg | 3 ++ assets/images/ic_spam.svg | 4 +- assets/images/ic_toast_not_spam.svg | 4 ++ assets/images/ic_toast_spam.svg | 4 ++ .../presentation/resources/image_paths.dart | 4 ++ .../email_action_type_extension.dart | 2 + .../email/presentation/email_controller.dart | 37 +++++++++++++++++-- .../email/presentation/email_view.dart | 23 ++++++++++++ lib/main/localizations/app_localizations.dart | 22 +++++++++++ model/lib/email/email_action_type.dart | 2 + model/lib/mailbox/presentation_mailbox.dart | 4 ++ 12 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 assets/images/ic_avatar_spam.svg create mode 100644 assets/images/ic_not_spam.svg create mode 100644 assets/images/ic_toast_not_spam.svg create mode 100644 assets/images/ic_toast_spam.svg diff --git a/assets/images/ic_avatar_spam.svg b/assets/images/ic_avatar_spam.svg new file mode 100644 index 000000000..7e254176a --- /dev/null +++ b/assets/images/ic_avatar_spam.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/ic_not_spam.svg b/assets/images/ic_not_spam.svg new file mode 100644 index 000000000..cd5ddd1e8 --- /dev/null +++ b/assets/images/ic_not_spam.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/ic_spam.svg b/assets/images/ic_spam.svg index 871ece0a7..315ee2e19 100644 --- a/assets/images/ic_spam.svg +++ b/assets/images/ic_spam.svg @@ -1,3 +1,3 @@ - - + + diff --git a/assets/images/ic_toast_not_spam.svg b/assets/images/ic_toast_not_spam.svg new file mode 100644 index 000000000..b3d6ac6cc --- /dev/null +++ b/assets/images/ic_toast_not_spam.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/ic_toast_spam.svg b/assets/images/ic_toast_spam.svg new file mode 100644 index 000000000..81835cc65 --- /dev/null +++ b/assets/images/ic_toast_spam.svg @@ -0,0 +1,4 @@ + + + + diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index af69a5171..3840d4d77 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -88,6 +88,10 @@ class ImagePaths { String get icNotConnection => _getImagePath('ic_not_connection.svg'); String get icDeleteTrash => _getImagePath('ic_delete_trash.svg'); String get icMenuDrawer => _getImagePath('ic_menu_drawer.svg'); + String get icToastSpam => _getImagePath('ic_toast_spam.svg'); + String get icToastNotSpam => _getImagePath('ic_toast_not_spam.svg'); + String get icNotSpam => _getImagePath('ic_not_spam.svg'); + String get icAvatarSpam => _getImagePath('ic_avatar_spam.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; 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 1aa60d4d2..7dfbcef63 100644 --- a/lib/features/composer/presentation/extensions/email_action_type_extension.dart +++ b/lib/features/composer/presentation/extensions/email_action_type_extension.dart @@ -32,6 +32,8 @@ extension EmailActionTypeExtension on EmailActionType { return AppLocalizations.of(context).moved_to_mailbox(destinationPath ?? ''); case EmailActionType.moveToTrash: return AppLocalizations.of(context).moved_to_trash; + case EmailActionType.moveToSpam: + return AppLocalizations.of(context).marked_as_spam; default: return ''; } diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index b055fabda..e37b7e322 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -343,13 +343,20 @@ class EmailController extends BaseController { ); if (destinationMailbox != null && destinationMailbox is PresentationMailbox) { - if (destinationMailbox.role == PresentationMailbox.roleTrash) { + if (destinationMailbox.isTrash) { _moveToTrashAction(context, accountId, MoveToMailboxRequest( [email.id], currentMailbox.id, destinationMailbox.id, MoveAction.moving, EmailActionType.moveToTrash)); + } else if (destinationMailbox.isSpam) { + _moveToSpamAction(context, accountId, MoveToMailboxRequest( + [email.id], + currentMailbox.id, + destinationMailbox.id, + MoveAction.moving, + EmailActionType.moveToSpam)); } else { _moveToMailbox(accountId, MoveToMailboxRequest( [email.id], @@ -375,7 +382,7 @@ class EmailController extends BaseController { currentOverlayContext!, success.emailActionType.getToastMessageMoveToMailboxSuccess(currentContext!, destinationPath: success.destinationPath), AppLocalizations.of(currentContext!).undo_action, () { - _undoMoveToMailbox(MoveToMailboxRequest( + _revertedToOriginalMailbox(MoveToMailboxRequest( [success.emailId], success.destinationMailboxId, success.currentMailboxId, @@ -386,7 +393,7 @@ class EmailController extends BaseController { } } - void _undoMoveToMailbox(MoveToMailboxRequest newMoveRequest) { + void _revertedToOriginalMailbox(MoveToMailboxRequest newMoveRequest) { final accountId = mailboxDashBoardController.accountId.value; if (accountId != null) { _moveToMailbox(accountId, newMoveRequest); @@ -413,6 +420,26 @@ class EmailController extends BaseController { mailboxDashBoardController.moveToMailbox(accountId, moveRequest); } + void moveToSpam(BuildContext context, PresentationEmail email) async { + final accountId = mailboxDashBoardController.accountId.value; + final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam); + + if (accountId != null && currentMailbox != null && spamMailboxId != null) { + _moveToSpamAction(context, accountId, MoveToMailboxRequest( + [email.id], + currentMailbox!.id, + spamMailboxId, + MoveAction.moving, + EmailActionType.moveToSpam) + ); + } + } + + void _moveToSpamAction(BuildContext context, AccountId accountId, MoveToMailboxRequest moveRequest) { + backToThreadView(context); + mailboxDashBoardController.moveToMailbox(accountId, moveRequest); + } + void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async { final accountId = mailboxDashBoardController.accountId.value; final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; @@ -449,6 +476,10 @@ class EmailController extends BaseController { case EmailActionType.deletePermanently: deleteEmailPermanently(context, presentationEmail); break; + case EmailActionType.moveToSpam: + popBack(); + moveToSpam(context, presentationEmail); + break; default: break; } diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index ac4b9bef4..caa8d4691 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -544,6 +544,7 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio List _emailActionMoreActionTile(BuildContext context, PresentationEmail email) { return [ _markAsEmailUnreadAction(context, email), + _markAsEmailSpamOrUnSpamAction(context, email), ]; } @@ -572,9 +573,31 @@ class EmailView extends GetView with UserSettingPopupMenuMixin, NetworkConnectio .build(); } + Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) { + return (EmailActionCupertinoActionSheetActionBuilder( + Key('mark_as_spam_or_un_spam_action'), + SvgPicture.asset( + emailController.currentMailbox?.isSpam == true ? imagePaths.icNotSpam : imagePaths.icSpam, + width: 28, height: 28, fit: BoxFit.fill, color: AppColor.colorTextButton), + emailController.currentMailbox?.isSpam == true + ? AppLocalizations.of(context).remove_from_spam + : AppLocalizations.of(context).mark_as_spam, + email, + iconLeftPadding: responsiveUtils.isMobile(context) + ? EdgeInsets.only(left: 12, right: 16) + : EdgeInsets.only(right: 12), + iconRightPadding: responsiveUtils.isMobile(context) + ? EdgeInsets.only(right: 12) + : EdgeInsets.zero) + ..onActionClick((email) => emailController.handleEmailAction(context, email, + emailController.currentMailbox?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam))) + .build(); + } + List _popupMenuEmailActionTile(BuildContext context, PresentationEmail email) { return [ PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _markAsEmailUnreadAction(context, email)), + PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _markAsEmailSpamOrUnSpamAction(context, email)), ]; } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 4ab243ba1..1198f6ead 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -1104,4 +1104,26 @@ class AppLocalizations { name: 'date', ); } + + String get mark_as_spam { + return Intl.message( + 'Mark as spam', + name: 'mark_as_spam', + ); + } + + String get remove_from_spam { + return Intl.message( + 'Remove from spam', + name: 'remove_from_spam', + ); + } + + String get marked_as_spam { + return Intl.message( + 'Marked as spam', + name: 'marked_as_spam', + ); + } + } \ 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 fe14be783..3e69876c8 100644 --- a/model/lib/email/email_action_type.dart +++ b/model/lib/email/email_action_type.dart @@ -15,4 +15,6 @@ enum EmailActionType { deletePermanently, preview, selection, + moveToSpam, + unSpam, } \ No newline at end of file diff --git a/model/lib/mailbox/presentation_mailbox.dart b/model/lib/mailbox/presentation_mailbox.dart index 73fbf6c8e..851120016 100644 --- a/model/lib/mailbox/presentation_mailbox.dart +++ b/model/lib/mailbox/presentation_mailbox.dart @@ -59,6 +59,10 @@ class PresentationMailbox with EquatableMixin { bool get isSpam => role == roleSpam; + bool get isTrash => role == roleTrash; + + bool get isDrafts => role == roleDrafts; + @override List get props => [ id,