diff --git a/assets/images/ic_unsubscribe.svg b/assets/images/ic_unsubscribe.svg new file mode 100644 index 000000000..00ba8046d --- /dev/null +++ b/assets/images/ic_unsubscribe.svg @@ -0,0 +1,3 @@ + + + diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index 07c8782e1..70aedc2b5 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -206,6 +206,7 @@ class ImagePaths { String get icDropZoneIcon => _getImagePath('ic_drop_zone_icon.svg'); String get icArrowUpOutline => _getImagePath('ic_arrow_up_outline.svg'); String get icFilterSB => _getImagePath('ic_filter_sb.svg'); + String get icUnsubscribe => _getImagePath('ic_unsubscribe.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 eeaa336a7..d2755ba03 100644 --- a/lib/features/composer/presentation/extensions/email_action_type_extension.dart +++ b/lib/features/composer/presentation/extensions/email_action_type_extension.dart @@ -1,5 +1,6 @@ import 'package:core/presentation/extensions/html_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; import 'package:flutter/cupertino.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; @@ -117,4 +118,38 @@ extension EmailActionTypeExtension on EmailActionType { return null; } } + + String getIcon(ImagePaths imagePaths) { + switch(this) { + case EmailActionType.markAsUnread: + return imagePaths.icUnreadEmail; + case EmailActionType.unSpam: + return imagePaths.icNotSpam; + case EmailActionType.moveToSpam: + return imagePaths.icSpam; + case EmailActionType.createRule: + return imagePaths.icQuickCreatingRule; + case EmailActionType.unsubscribe: + return imagePaths.icUnsubscribe; + default: + return ''; + } + } + + String getTitle(BuildContext context) { + switch(this) { + case EmailActionType.markAsUnread: + return AppLocalizations.of(context).mark_as_unread; + case EmailActionType.unSpam: + return AppLocalizations.of(context).remove_from_spam; + case EmailActionType.moveToSpam: + return AppLocalizations.of(context).mark_as_spam; + case EmailActionType.createRule: + return AppLocalizations.of(context).quickCreatingRule; + case EmailActionType.unsubscribe: + return AppLocalizations.of(context).unsubscribe; + default: + return ''; + } + } } \ No newline at end of file diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 1330adf84..b9edb37dd 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -968,6 +968,9 @@ class SingleEmailController extends BaseController with AppLoaderMixin { popBack(); unSpam(context, presentationEmail); break; + case EmailActionType.createRule: + quickCreatingRule(context, presentationEmail.from!.first); + break; default: break; } diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index dea4e03db..9c2944e54 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -18,6 +18,7 @@ import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_event_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_styles.dart'; @@ -64,20 +65,7 @@ class EmailView extends GetWidget { isSearchActivated: controller.mailboxDashBoardController.searchController.isSearchEmailRunning, onBackAction: () => controller.closeEmailView(context), onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action), - onMoreActionClick: (email, position) { - if (position == null) { - controller.openContextMenuAction( - context, - _emailActionMoreActionTile(context, email) - ); - } else { - controller.openPopupMenuAction( - context, - position, - _popupMenuEmailActionTile(context, email) - ); - } - }, + onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(context: context, presentationEmail: presentationEmail, position: position) ), ); } else { @@ -111,20 +99,7 @@ class EmailView extends GetWidget { isSearchActivated: controller.mailboxDashBoardController.searchController.isSearchEmailRunning, onBackAction: () => controller.closeEmailView(context), onEmailActionClick: (email, action) => controller.handleEmailAction(context, email, action), - onMoreActionClick: (email, position) { - if (position == null) { - controller.openContextMenuAction( - context, - _emailActionMoreActionTile(context, email) - ); - } else { - controller.openPopupMenuAction( - context, - position, - _popupMenuEmailActionTile(context, email) - ); - } - }, + onMoreActionClick: (presentationEmail, position) => _handleMoreEmailAction(context: context, presentationEmail: presentationEmail, position: position), optionsWidget: PlatformInfo.isWeb && controller.emailSupervisorController.supportedPageView.isTrue ? _buildNavigatorPageViewWidgets(context) : null, @@ -440,194 +415,86 @@ class EmailView extends GetWidget { ); } - List _emailActionMoreActionTile(BuildContext context, PresentationEmail email) { - return [ - _markAsEmailUnreadAction(context, email), - _markAsEmailSpamOrUnSpamAction(context, email), - if (email.from?.isNotEmpty == true) - _quickCreatingRuleAction(context, email), + void _handleMoreEmailAction({ + required BuildContext context, + required PresentationEmail presentationEmail, + RelativeRect? position + }) { + final mailboxContain = controller.getMailboxContain(presentationEmail); + final moreActions = [ + EmailActionType.markAsUnread, + if (mailboxContain?.isSpam == true) + EmailActionType.unSpam + else + EmailActionType.moveToSpam, + if (presentationEmail.from?.isNotEmpty == true) + EmailActionType.createRule, + EmailActionType.unsubscribe ]; - } - Widget _markAsEmailUnreadAction(BuildContext context, PresentationEmail email) { - return (EmailActionCupertinoActionSheetActionBuilder( - const Key('mark_as_unread_action'), - SvgPicture.asset( - controller.imagePaths.icUnreadEmail, - width: 24, - height: 24, - fit: BoxFit.fill, - colorFilter: AppColor.colorTextButton.asFilter() - ), - AppLocalizations.of(context).mark_as_unread, - email, - iconLeftPadding: controller.responsiveUtils.isMobile(context) - ? EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 16 : 12, - right: AppUtils.isDirectionRTL(context) ? 12 : 16, - ) - : EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 12 : 0, - right: AppUtils.isDirectionRTL(context) ? 0 : 12, - ), - iconRightPadding: controller.responsiveUtils.isMobile(context) - ? EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 12 : 0, - right: AppUtils.isDirectionRTL(context) ? 0 : 12, - ) - : EdgeInsets.zero) - ..onActionClick((email) => controller.handleEmailAction( + if (position == null) { + controller.openContextMenuAction( context, - email, - EmailActionType.markAsUnread) - ) - ).build(); - } - - Widget _markAsEmailSpamOrUnSpamAction(BuildContext context, PresentationEmail email) { - final currentMailbox = controller.getMailboxContain(email); - - return (EmailActionCupertinoActionSheetActionBuilder( - const Key('mark_as_spam_or_un_spam_action'), - SvgPicture.asset( - currentMailbox?.isSpam == true ? controller.imagePaths.icNotSpam : controller.imagePaths.icSpam, - width: 24, - height: 24, - fit: BoxFit.fill, - colorFilter: AppColor.colorTextButton.asFilter() - ), - currentMailbox?.isSpam == true - ? AppLocalizations.of(context).remove_from_spam - : AppLocalizations.of(context).mark_as_spam, - email, - iconLeftPadding: controller.responsiveUtils.isMobile(context) - ? EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 16 : 12, - right: AppUtils.isDirectionRTL(context) ? 12 : 16, - ) - : EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 12 : 0, - right: AppUtils.isDirectionRTL(context) ? 0 : 12, - ), - iconRightPadding: controller.responsiveUtils.isMobile(context) - ? EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 12 : 0, - right: AppUtils.isDirectionRTL(context) ? 0 : 12, - ) - : EdgeInsets.zero) - ..onActionClick((email) => controller.handleEmailAction( + _emailActionMoreActionTile(context, presentationEmail, moreActions) + ); + } else { + controller.openPopupMenuAction( context, - email, - currentMailbox?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam) - ) - ).build(); + position, + _popupMenuEmailActionTile(context, presentationEmail, moreActions) + ); + } } - Widget _quickCreatingRuleAction(BuildContext context, PresentationEmail email) { - return (EmailActionCupertinoActionSheetActionBuilder( - const Key('quick_creating_rule_action'), - SvgPicture.asset( - controller.imagePaths.icQuickCreatingRule, - width: 24, - height: 24, - fit: BoxFit.fill, - colorFilter: AppColor.colorTextButton.asFilter()), - AppLocalizations.of(context).quickCreatingRule, - email, - iconLeftPadding: controller.responsiveUtils.isMobile(context) - ? EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 16 : 12, - right: AppUtils.isDirectionRTL(context) ? 12 : 16, - ) - : EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 12 : 0, - right: AppUtils.isDirectionRTL(context) ? 0 : 12, - ), - iconRightPadding: controller.responsiveUtils.isMobile(context) - ? EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 12 : 0, - right: AppUtils.isDirectionRTL(context) ? 0 : 12, - ) - : EdgeInsets.zero) - ..onActionClick((email) => controller.quickCreatingRule(context, email.from!.first))) - .build(); - } - - List _popupMenuEmailActionTile(BuildContext context, PresentationEmail email) { - final mailboxContain = controller.getMailboxContain(email); - return [ - _markAsEmailUnreadPopupItemAction(context, email), - _markAsEmailSpamOrUnSpamPopupItemAction(context, email, mailboxContain), - if (email.from?.isNotEmpty == true) - _quickCreatingRulePopupItemAction(context, email) - ]; - } - - PopupMenuEntry _markAsEmailUnreadPopupItemAction(BuildContext context, PresentationEmail email) { - return PopupMenuItem( - padding: EdgeInsets.zero, - child: PopupItemWidget( - controller.imagePaths.icUnreadEmail, - AppLocalizations.of(context).mark_as_unread, - colorIcon: AppColor.colorTextButton, - padding: const EdgeInsetsDirectional.only(start: 12), - styleName: const TextStyle( - fontWeight: FontWeight.w500, - fontSize: 16, - color: Colors.black - ), - onCallbackAction: () => controller.handleEmailAction( - context, - email, - EmailActionType.markAsUnread - ) - ) - ); - } - - PopupMenuEntry _markAsEmailSpamOrUnSpamPopupItemAction( + List _emailActionMoreActionTile( BuildContext context, - PresentationEmail email, - PresentationMailbox? mailboxContain + PresentationEmail presentationEmail, + List actionTypes, ) { - return PopupMenuItem( - padding: EdgeInsets.zero, - child: PopupItemWidget( - mailboxContain?.isSpam == true ? controller.imagePaths.icNotSpam : controller.imagePaths.icSpam, - mailboxContain?.isSpam == true - ? AppLocalizations.of(context).remove_from_spam - : AppLocalizations.of(context).mark_as_spam, - colorIcon: AppColor.colorTextButton, - padding: const EdgeInsetsDirectional.only(start: 12), - styleName: const TextStyle( - fontWeight: FontWeight.w500, - fontSize: 16, - color: Colors.black + return actionTypes.map((action) { + return (EmailActionCupertinoActionSheetActionBuilder( + Key('${action.name}_action'), + SvgPicture.asset( + action.getIcon(controller.imagePaths), + width: 24, + height: 24, + fit: BoxFit.fill, + colorFilter: AppColor.colorTextButton.asFilter() ), - onCallbackAction: () => controller.handleEmailAction( - context, - email, - mailboxContain?.isSpam == true ? EmailActionType.unSpam : EmailActionType.moveToSpam - ) + action.getTitle(context), + presentationEmail, + iconLeftPadding: controller.responsiveUtils.isScreenWithShortestSide(context) + ? const EdgeInsetsDirectional.only(start: 12, end: 16) + : const EdgeInsetsDirectional.only(end: 12), + iconRightPadding: controller.responsiveUtils.isScreenWithShortestSide(context) + ? const EdgeInsetsDirectional.only(end: 12) + : EdgeInsets.zero ) - ); + ..onActionClick((presentationEmail) => controller.handleEmailAction(context, presentationEmail, action))).build(); + }).toList(); } - PopupMenuEntry _quickCreatingRulePopupItemAction(BuildContext context, PresentationEmail email) { - return PopupMenuItem( - padding: EdgeInsets.zero, - child: PopupItemWidget( - controller.imagePaths.icQuickCreatingRule, - AppLocalizations.of(context).quickCreatingRule, - colorIcon: AppColor.colorTextButton, - padding: const EdgeInsetsDirectional.only(start: 12), - styleName: const TextStyle( - fontWeight: FontWeight.w500, - fontSize: 16, - color: Colors.black - ), - onCallbackAction: () => controller.quickCreatingRule(context, email.from!.first) - ) - ); + List _popupMenuEmailActionTile( + BuildContext context, + PresentationEmail presentationEmail, + List actionTypes + ) { + return actionTypes.map((action) { + return PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + action.getIcon(controller.imagePaths), + action.getTitle(context), + colorIcon: AppColor.colorTextButton, + padding: const EdgeInsetsDirectional.only(start: 12), + styleName: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16, + color: Colors.black + ), + onCallbackAction: () => controller.handleEmailAction(context, presentationEmail, action) + ) + ); + }).toList(); } } \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart b/lib/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart index ae218faee..f35f1c2fe 100644 --- a/lib/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart +++ b/lib/features/email/presentation/widgets/email_action_cupertino_action_sheet_action_builder.dart @@ -10,8 +10,8 @@ class EmailActionCupertinoActionSheetActionBuilder extends CupertinoActionSheetA final PresentationEmail presentationEmail; final SvgPicture? actionSelected; final Color? bgColor; - final EdgeInsets? iconLeftPadding; - final EdgeInsets? iconRightPadding; + final EdgeInsetsGeometry? iconLeftPadding; + final EdgeInsetsGeometry? iconRightPadding; EmailActionCupertinoActionSheetActionBuilder( Key key, diff --git a/model/lib/email/email_action_type.dart b/model/lib/email/email_action_type.dart index 2ea30b84f..921bdceb7 100644 --- a/model/lib/email/email_action_type.dart +++ b/model/lib/email/email_action_type.dart @@ -22,5 +22,7 @@ enum EmailActionType { selection, moveToSpam, unSpam, - openInNewTab + openInNewTab, + createRule, + unsubscribe, } \ No newline at end of file