TF-1718 Show Unsubscribe action in context menu action on mobile

(cherry picked from commit 2d6b426f05bcfcc75d4e57f2443576a9f3f69689)
This commit is contained in:
dab246
2023-11-15 15:27:43 +07:00
committed by Dat Vu
parent 0c974e2316
commit 7cf5c08ef5
7 changed files with 119 additions and 208 deletions
@@ -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;
}
+72 -205
View File
@@ -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();
}
}
@@ -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,