From 0b49cf36eef43005fd82c13e3e6edcabaed91460 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 16 Nov 2023 00:14:40 +0700 Subject: [PATCH] TF-1718 Show dialog unsubscribe mail Signed-off-by: dab246 (cherry picked from commit d29ea95dc63719c35676fd87a82c73c55ee9db0d) --- .../extensions/color_extension.dart | 2 + .../controller/single_email_controller.dart | 41 +++++++++++++++++-- .../email/presentation/email_view.dart | 13 +++++- ...formation_sender_and_receiver_builder.dart | 5 +++ lib/l10n/intl_messages.arb | 14 ++++++- lib/main/localizations/app_localizations.dart | 14 +++++++ 6 files changed, 83 insertions(+), 6 deletions(-) diff --git a/core/lib/presentation/extensions/color_extension.dart b/core/lib/presentation/extensions/color_extension.dart index 262e0aac5..e8cb7cca8 100644 --- a/core/lib/presentation/extensions/color_extension.dart +++ b/core/lib/presentation/extensions/color_extension.dart @@ -229,6 +229,8 @@ extension AppColor on Color { static const colorScrollbarThumbColor = Color(0xFFD8E1EB); static const colorDropDownTitleComposer = Color(0xFF79747E); static const colorDropDownItemTitleComposer = Color(0xFF0A0A0A); + static const messageDialogColor = Color(0xFF8C9CAF); + static const messageDialogHighlightColor = Color(0xFF37383A); static const mapGradientColor = [ [Color(0xFF21D4FD), Color(0xFFB721FF)], diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 6586e493a..0d608d321 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -440,6 +440,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin { if (isShowMessageReadReceipt) { _handleReadReceipt(); } + + if (success.emailCurrent?.hasListUnsubscribe == true) { + _handleUnsubscribe(success.emailCurrent!.listUnsubscribe); + } else { + emailUnsubscribe.value = null; + } } } @@ -956,7 +962,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void handleEmailAction(BuildContext context, PresentationEmail presentationEmail, EmailActionType actionType) { switch(actionType) { case EmailActionType.markAsUnread: - popBack(); markAsEmailRead(presentationEmail, ReadActions.markAsUnread, MarkReadAction.tap); break; case EmailActionType.markAsStarred: @@ -975,16 +980,17 @@ class SingleEmailController extends BaseController with AppLoaderMixin { deleteEmailPermanently(context, presentationEmail); break; case EmailActionType.moveToSpam: - popBack(); moveToSpam(context, presentationEmail); break; case EmailActionType.unSpam: - popBack(); unSpam(context, presentationEmail); break; case EmailActionType.createRule: quickCreatingRule(context, presentationEmail.from!.first); break; + case EmailActionType.unsubscribe: + _unsubscribeEmail(context, presentationEmail); + break; default: break; } @@ -1392,4 +1398,33 @@ class SingleEmailController extends BaseController with AppLoaderMixin { ); } } + + void _unsubscribeEmail(BuildContext context, PresentationEmail presentationEmail) { + showConfirmDialogAction( + context, + '', + AppLocalizations.of(context).unsubscribe, + onConfirmAction: () => {}, + showAsBottomSheet: true, + title: AppLocalizations.of(context).unsubscribeMail, + icon: SvgPicture.asset(imagePaths.icEmpty), + messageStyle: const TextStyle( + color: AppColor.messageDialogColor, + fontSize: 14, + fontWeight: FontWeight.w500 + ), + listTextSpan: [ + TextSpan(text: AppLocalizations.of(context).unsubscribeMailDialogMessage), + TextSpan( + text: ' ${presentationEmail.getSenderName()}', + style: const TextStyle( + color: AppColor.messageDialogHighlightColor, + fontSize: 15, + fontWeight: FontWeight.w500 + ), + ), + const TextSpan(text: ' ?'), + ] + ); + } } \ No newline at end of file diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index ec0c69cdb..d0df5abdd 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/email/presentation/widgets/information_se import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart'; class EmailView extends GetWidget { @@ -304,6 +305,7 @@ class EmailView extends GetWidget { responsiveUtils: controller.responsiveUtils, emailUnsubscribe: controller.emailUnsubscribe.value, openEmailAddressDetailAction: controller.openEmailAddressDialog, + onEmailActionClick: (presentationEmail, actionType) => controller.handleEmailAction(context, presentationEmail, actionType), )), Obx(() { final attachments = controller.attachments.listAttachmentsDisplayedOutSide; @@ -472,7 +474,10 @@ class EmailView extends GetWidget { ? const EdgeInsetsDirectional.only(end: 12) : EdgeInsets.zero ) - ..onActionClick((presentationEmail) => controller.handleEmailAction(context, presentationEmail, action))).build(); + ..onActionClick((presentationEmail) { + popBack(); + controller.handleEmailAction(context, presentationEmail, action); + })).build(); }).toList(); } @@ -483,6 +488,7 @@ class EmailView extends GetWidget { ) { return actionTypes.map((action) { return PopupMenuItem( + key: Key('${action.name}_action'), padding: EdgeInsets.zero, child: PopupItemWidget( action.getIcon(controller.imagePaths), @@ -494,7 +500,10 @@ class EmailView extends GetWidget { fontSize: 16, color: Colors.black ), - onCallbackAction: () => controller.handleEmailAction(context, presentationEmail, action) + onCallbackAction: () { + popBack(); + controller.handleEmailAction(context, presentationEmail, action); + } ) ); }).toList(); diff --git a/lib/features/email/presentation/widgets/information_sender_and_receiver_builder.dart b/lib/features/email/presentation/widgets/information_sender_and_receiver_builder.dart index b48f9b6b5..8f6d913df 100644 --- a/lib/features/email/presentation/widgets/information_sender_and_receiver_builder.dart +++ b/lib/features/email/presentation/widgets/information_sender_and_receiver_builder.dart @@ -3,12 +3,14 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; +import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/extensions/presentation_email_extension.dart'; import 'package:tmail_ui_user/features/base/widget/email_avatar_builder.dart'; import 'package:tmail_ui_user/features/email/presentation/model/email_unsubscribe.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_receiver_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_sender_builder.dart'; +import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_app_bar_widget.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/received_time_builder.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -19,6 +21,7 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget { final ImagePaths imagePaths; final EmailUnsubscribe? emailUnsubscribe; final OnOpenEmailAddressDetailAction? openEmailAddressDetailAction; + final OnEmailActionClick? onEmailActionClick; const InformationSenderAndReceiverBuilder({ Key? key, @@ -27,6 +30,7 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget { required this.imagePaths, required this.emailUnsubscribe, this.openEmailAddressDetailAction, + this.onEmailActionClick, }) : super(key: key); @override @@ -70,6 +74,7 @@ class InformationSenderAndReceiverBuilder extends StatelessWidget { ), padding: const EdgeInsetsDirectional.symmetric(vertical: 5, horizontal: 8), backgroundColor: Colors.transparent, + onTapActionCallback: () => onEmailActionClick?.call(emailSelected, EmailActionType.unsubscribe), ), ], ) diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index d636070ee..33d71fd7c 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-11-15T14:44:16.030072", + "@@last_modified": "2023-11-16T00:13:28.374001", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3499,5 +3499,17 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "unsubscribeMail": "Unsubscribe mail", + "@unsubscribeMail": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "unsubscribeMailDialogMessage": "Are you sure you'd like to stop receiving similar messages from", + "@unsubscribeMailDialogMessage": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index b3e975c75..6668ad58e 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3631,4 +3631,18 @@ class AppLocalizations { name: 'unsubscribe', ); } + + String get unsubscribeMail { + return Intl.message( + 'Unsubscribe mail', + name: 'unsubscribeMail', + ); + } + + String get unsubscribeMailDialogMessage { + return Intl.message( + 'Are you sure you\'d like to stop receiving similar messages from', + name: 'unsubscribeMailDialogMessage', + ); + } } \ No newline at end of file