TF-1718 Show Unsubscribe action in context menu action on mobile
(cherry picked from commit 2d6b426f05bcfcc75d4e57f2443576a9f3f69689)
This commit is contained in:
@@ -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 '';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<SingleEmailController> {
|
||||
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<SingleEmailController> {
|
||||
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<SingleEmailController> {
|
||||
);
|
||||
}
|
||||
|
||||
List<Widget> _emailActionMoreActionTile(BuildContext context, PresentationEmail email) {
|
||||
return <Widget>[
|
||||
_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<PopupMenuEntry> _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<Widget> _emailActionMoreActionTile(
|
||||
BuildContext context,
|
||||
PresentationEmail email,
|
||||
PresentationMailbox? mailboxContain
|
||||
PresentationEmail presentationEmail,
|
||||
List<EmailActionType> 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<PopupMenuEntry> _popupMenuEmailActionTile(
|
||||
BuildContext context,
|
||||
PresentationEmail presentationEmail,
|
||||
List<EmailActionType> 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();
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user