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