From 7f35974b3bf5915d4dacfb7e957544624c5b99ea Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 3 Aug 2023 18:42:40 +0700 Subject: [PATCH] TF-1710 Show banner delete all spam emails (cherry picked from commit 6b45dcd8de1ca83225994d8918c0998515634d40) --- .../mailbox_dashboard_controller.dart | 71 +++++++++++++++++ .../mailbox_dashboard_view_web.dart | 17 ++++ .../banner_delete_all_spam_emails_styles.dart | 21 +++++ .../thread/presentation/thread_view.dart | 16 ++++ .../banner_delete_all_spam_emails_widget.dart | 79 +++++++++++++++++++ lib/l10n/intl_messages.arb | 8 +- lib/main/localizations/app_localizations.dart | 12 +++ 7 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 lib/features/thread/presentation/styles/banner_delete_all_spam_emails_styles.dart create mode 100644 lib/features/thread/presentation/widgets/banner_delete_all_spam_emails_widget.dart diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 29017f86a..b8d56bf96 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1978,6 +1978,77 @@ class MailboxDashBoardController extends ReloadableController { AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success); } } + + bool isEmptySpamBannerEnabledOnWeb(BuildContext context) { + return selectedMailbox.value != null && + selectedMailbox.value!.isSpam && + selectedMailbox.value!.countEmails > 0 && + !searchController.isSearchActive() && + _responsiveUtils.isWebDesktop(context); + } + + bool isEmptySpamBannerEnabledOnMobile(BuildContext context) { + return selectedMailbox.value != null && + selectedMailbox.value!.isSpam && + selectedMailbox.value!.countEmails > 0 && + !searchController.isSearchActive() && + !_responsiveUtils.isWebDesktop(context); + } + + void openDialogEmptySpamFolder(BuildContext context) { + final spamMailbox = selectedMailbox.value; + if (spamMailbox == null || !spamMailbox.isSpam) { + logError('MailboxDashBoardController::openDialogEmptySpamFolder: Selected mailbox is not spam'); + return; + + } + if (_responsiveUtils.isScreenWithShortestSide(context)) { + (ConfirmationDialogActionSheetBuilder(context) + ..messageText(AppLocalizations.of(context).emptySpamMessageDialog) + ..onCancelAction(AppLocalizations.of(context).cancel, popBack) + ..onConfirmAction(AppLocalizations.of(context).delete_all, () { + popBack(); + if (spamMailbox.countEmails > 0) { + emptySpamFolderAction(spamFolderId: spamMailbox.id); + } else { + _appToast.showToastWarningMessage( + context, + AppLocalizations.of(context).noEmailInYourCurrentMailbox + ); + } + })) + .show(); + } else { + showDialog( + context: context, + barrierColor: AppColor.colorDefaultCupertinoActionSheet, + builder: (context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths) + ..key(const Key('confirm_dialog_empty_spam')) + ..title(AppLocalizations.of(context).emptySpamFolder) + ..content(AppLocalizations.of(context).emptySpamMessageDialog) + ..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, fit: BoxFit.fill)) + ..colorConfirmButton(AppColor.colorConfirmActionDialog) + ..styleTextConfirmButton(const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w500, + color: AppColor.colorActionDeleteConfirmDialog)) + ..onCloseButtonAction(popBack) + ..onConfirmButtonAction(AppLocalizations.of(context).delete_all, () { + popBack(); + if (spamMailbox.countEmails > 0) { + emptySpamFolderAction(spamFolderId: spamMailbox.id); + } else { + _appToast.showToastWarningMessage( + context, + AppLocalizations.of(context).noEmailInYourCurrentMailbox + ); + } + }) + ..onCancelButtonAction(AppLocalizations.of(context).cancel, popBack) + ).build()) + ); + } + } @override void onClose() { diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index c384c76ac..6fb671051 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -21,6 +21,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/download/download_task_item_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/search_input_form_widget.dart'; +import 'package:tmail_ui_user/features/thread/presentation/styles/banner_delete_all_spam_emails_styles.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/banner_delete_all_spam_emails_widget.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/spam_banner/spam_report_banner_web_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/top_bar_thread_selection.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; @@ -124,6 +126,21 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { Expanded(child: Column(children: [ const SpamReportBannerWebWidget(), _buildEmptyTrashButton(context), + Obx(() { + if (controller.isEmptySpamBannerEnabledOnWeb(context)) { + return Padding( + padding: const EdgeInsetsDirectional.only( + top: BannerDeleteAllSpamEmailsStyles.webTopMargin, + end: BannerDeleteAllSpamEmailsStyles.webEndMargin + ), + child: BannerDeleteAllSpamEmailsWidget( + onTapAction: () => controller.openDialogEmptySpamFolder(context) + ), + ); + } else { + return const SizedBox.shrink(); + } + }), QuotasWarningBannerWidget( margin: EdgeInsets.only( right: AppUtils.isDirectionRTL(context) ? 0 : 16, diff --git a/lib/features/thread/presentation/styles/banner_delete_all_spam_emails_styles.dart b/lib/features/thread/presentation/styles/banner_delete_all_spam_emails_styles.dart new file mode 100644 index 000000000..6535b5e1c --- /dev/null +++ b/lib/features/thread/presentation/styles/banner_delete_all_spam_emails_styles.dart @@ -0,0 +1,21 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; + +class BannerDeleteAllSpamEmailsStyles { + static const double borderRadius = 14; + static const double buttonBorderRadius = 20; + static const double horizontalPadding = 16; + static const double verticalPadding = 10; + static const double webEndMargin = 16; + static const double webTopMargin = 8; + static const double mobileMargin = 16; + static const double labelTextSize = 13; + static const double buttonTextSize = 17; + static const double iconSize = 20; + static const double space = 8; + static const Color backgroundColor = Colors.white; + static const Color borderStrokeColor = AppColor.colorBorderBodyThread; + static const Color labelTextColor = AppColor.colorSubtitle; + static const Color buttonTextColor = AppColor.toastErrorBackgroundColor; +} \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index a0ecc636d..aef4ae839 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -20,8 +20,10 @@ import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart'; +import 'package:tmail_ui_user/features/thread/presentation/styles/banner_delete_all_spam_emails_styles.dart'; import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart'; +import 'package:tmail_ui_user/features/thread/presentation/widgets/banner_delete_all_spam_emails_widget.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart'; import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart' if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart'; @@ -77,6 +79,20 @@ class ThreadView extends GetWidget _buildVacationNotificationMessage(context), ], _buildEmptyTrashButton(context), + Obx(() { + if (controller.mailboxDashBoardController.isEmptySpamBannerEnabledOnMobile(context)) { + return Padding( + padding: const EdgeInsetsDirectional.symmetric( + horizontal: BannerDeleteAllSpamEmailsStyles.mobileMargin + ), + child: BannerDeleteAllSpamEmailsWidget( + onTapAction: () => controller.mailboxDashBoardController.openDialogEmptySpamFolder(context) + ), + ); + } else { + return const SizedBox.shrink(); + } + }), if (!_responsiveUtils.isDesktop(context)) _buildMarkAsMailboxReadLoading(context), _buildLoadingView(), diff --git a/lib/features/thread/presentation/widgets/banner_delete_all_spam_emails_widget.dart b/lib/features/thread/presentation/widgets/banner_delete_all_spam_emails_widget.dart new file mode 100644 index 000000000..19e4d9074 --- /dev/null +++ b/lib/features/thread/presentation/widgets/banner_delete_all_spam_emails_widget.dart @@ -0,0 +1,79 @@ + +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/thread/presentation/styles/banner_delete_all_spam_emails_styles.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class BannerDeleteAllSpamEmailsWidget extends StatelessWidget { + + final VoidCallback onTapAction; + + const BannerDeleteAllSpamEmailsWidget({super.key, required this.onTapAction}); + + @override + Widget build(BuildContext context) { + final imagePaths = Get.find(); + return Container( + decoration: const ShapeDecoration( + color: BannerDeleteAllSpamEmailsStyles.backgroundColor, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: BannerDeleteAllSpamEmailsStyles.borderStrokeColor, + ), + borderRadius: BorderRadius.all(Radius.circular(BannerDeleteAllSpamEmailsStyles.borderRadius)), + ), + ), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: onTapAction, + borderRadius: const BorderRadius.all(Radius.circular(BannerDeleteAllSpamEmailsStyles.borderRadius)), + child: Padding( + padding: const EdgeInsetsDirectional.symmetric( + horizontal: BannerDeleteAllSpamEmailsStyles.horizontalPadding, + vertical: BannerDeleteAllSpamEmailsStyles.verticalPadding + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SvgPicture.asset( + imagePaths.icDeleteRuleMobile, + width: BannerDeleteAllSpamEmailsStyles.iconSize, + height: BannerDeleteAllSpamEmailsStyles.iconSize, + fit: BoxFit.fill + ), + const SizedBox(width: BannerDeleteAllSpamEmailsStyles.space), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context).deleteAllSpamEmailsNow, + style: const TextStyle( + fontSize: BannerDeleteAllSpamEmailsStyles.buttonTextSize, + fontWeight: FontWeight.w500, + color: BannerDeleteAllSpamEmailsStyles.buttonTextColor + ) + ), + Text( + AppLocalizations.of(context).bannerDeleteAllSpamEmailsMessage, + style: const TextStyle( + color: BannerDeleteAllSpamEmailsStyles.labelTextColor, + fontSize: BannerDeleteAllSpamEmailsStyles.labelTextSize, + fontWeight: FontWeight.w400 + ) + ), + ] + ) + ) + ] + ), + ), + ), + ), + ); + } +} diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index fecc4410d..16f1eb08d 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-08-03T15:58:37.476969", + "@@last_modified": "2023-08-03T18:37:14.070879", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3125,5 +3125,11 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "bannerDeleteAllSpamEmailsMessage": "All messages in Spam will be deleted if you reach limited storage.", + "@bannerDeleteAllSpamEmailsMessage": { + "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 6115cab09..f788c916b 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3222,4 +3222,16 @@ class AppLocalizations { 'You are about to permanently delete all items in Spam . Do you want to continue?', name: 'emptySpamMessageDialog'); } + + String get bannerDeleteAllSpamEmailsMessage { + return Intl.message( + 'All messages in Spam will be deleted if you reach limited storage.', + name: 'bannerDeleteAllSpamEmailsMessage'); + } + + String get deleteAllSpamEmailsNow { + return Intl.message( + 'Delete all spam emails now', + name: 'deleteAllSpamEmailsNow'); + } } \ No newline at end of file