diff --git a/core/lib/presentation/extensions/color_extension.dart b/core/lib/presentation/extensions/color_extension.dart index e2d6739d2..98f1c13b5 100644 --- a/core/lib/presentation/extensions/color_extension.dart +++ b/core/lib/presentation/extensions/color_extension.dart @@ -57,6 +57,7 @@ extension AppColor on Color { static const enableSendEmailButtonColor = Color(0xFF007AFF); static const disableSendEmailButtonColor = Color(0xFFA9B4C2); static const borderLeftEmailContentColor = Color(0xFFEFEFEF); + static const toastWarningBackgroundColor = Color(0xFFFFC107); static const toastSuccessBackgroundColor = Color(0xFF4BB34B); static const toastErrorBackgroundColor = Color(0xFFE64646); static const toastWithActionBackgroundColor = Color(0xFF3F3F3F); diff --git a/core/lib/presentation/utils/app_toast.dart b/core/lib/presentation/utils/app_toast.dart index 3bdff7d88..beea665c0 100644 --- a/core/lib/presentation/utils/app_toast.dart +++ b/core/lib/presentation/utils/app_toast.dart @@ -48,6 +48,25 @@ class AppToast { ); } + void showToastWarningMessage( + BuildContext context, + String message, + { + Color? leadingSVGIconColor, + String? leadingSVGIcon, + } + ) { + final imagePaths = Get.find(); + showToastMessage( + context, + message, + backgroundColor: AppColor.toastWarningBackgroundColor, + textColor: Colors.white, + leadingSVGIconColor: leadingSVGIconColor ?? (leadingSVGIcon == null ? Colors.white : null), + leadingSVGIcon: leadingSVGIcon ?? imagePaths.icInfoCircleOutline + ); + } + void showToastMessage( BuildContext context, String message, diff --git a/lib/features/base/mixin/mailbox_action_handler_mixin.dart b/lib/features/base/mixin/mailbox_action_handler_mixin.dart index da5d3eea5..8fcfd3e78 100644 --- a/lib/features/base/mixin/mailbox_action_handler_mixin.dart +++ b/lib/features/base/mixin/mailbox_action_handler_mixin.dart @@ -1,10 +1,8 @@ import 'package:core/core.dart'; -import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; -import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/extensions/presentation_mailbox_extension.dart'; @@ -47,11 +45,12 @@ mixin MailboxActionHandlerMixin { void emptyTrashAction( BuildContext context, - MailboxId mailboxId, + PresentationMailbox mailbox, MailboxDashBoardController dashboardController ) { final responsiveUtils = Get.find(); final imagePaths = Get.find(); + final appToast = Get.find(); if (responsiveUtils.isScreenWithShortestSide(context)) { (ConfirmationDialogActionSheetBuilder(context) @@ -59,7 +58,14 @@ mixin MailboxActionHandlerMixin { ..onCancelAction(AppLocalizations.of(context).cancel, popBack) ..onConfirmAction(AppLocalizations.of(context).delete, () { popBack(); - dashboardController.emptyTrashFolderAction(trashFolderId: mailboxId); + if (mailbox.countEmails > 0) { + dashboardController.emptyTrashFolderAction(trashFolderId: mailbox.id); + } else { + appToast.showToastWarningMessage( + context, + AppLocalizations.of(context).noEmailInYourCurrentMailbox + ); + } })) .show(); } else { @@ -78,8 +84,15 @@ mixin MailboxActionHandlerMixin { color: AppColor.colorActionDeleteConfirmDialog)) ..onCloseButtonAction(popBack) ..onConfirmButtonAction(AppLocalizations.of(context).delete, () { - popBack(); - dashboardController.emptyTrashFolderAction(trashFolderId: mailboxId); + popBack(); + if (mailbox.countEmails > 0) { + dashboardController.emptyTrashFolderAction(trashFolderId: mailbox.id); + } else { + appToast.showToastWarningMessage( + context, + AppLocalizations.of(context).noEmailInYourCurrentMailbox + ); + } }) ..onCancelButtonAction(AppLocalizations.of(context).cancel, popBack)) .build())); diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index eba944adc..af6d53592 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -940,7 +940,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM _unsubscribeMailboxAction(mailbox.id); break; case MailboxActions.emptyTrash: - emptyTrashAction(context, mailbox.id, mailboxDashBoardController); + emptyTrashAction(context, mailbox, mailboxDashBoardController); break; default: break; 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 358214410..f1ba08f21 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1394,9 +1394,11 @@ class MailboxDashBoardController extends ReloadableController { } } - - - bool get isMailboxTrash => selectedMailbox.value?.isTrash == true; + bool get isMailboxTrashValid { + return selectedMailbox.value != null + && selectedMailbox.value!.isTrash + && selectedMailbox.value!.countEmails > 0; + } void emptyTrashAction(BuildContext context) { dispatchAction(EmptyTrashAction(context)); 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 156ac5ab2..5c1e65476 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -639,15 +639,16 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { .toList(); } - bool supportEmptyTrash(BuildContext context) { - return controller.isMailboxTrash - && !controller.searchController.isSearchActive() - && responsiveUtils.isWebDesktop(context); + bool _supportEmptyTrash(BuildContext context) { + return controller.isMailboxTrashValid + && !controller.searchController.isSearchActive() + && responsiveUtils.isWebDesktop(context); } Widget _buildEmptyTrashButton(BuildContext context) { return Obx(() { - if (supportEmptyTrash(context)) { + log('MailboxDashBoardView::_buildEmptyTrashButton():'); + if (_supportEmptyTrash(context)) { return Container( decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(14)), diff --git a/lib/features/search/mailbox/presentation/search_mailbox_controller.dart b/lib/features/search/mailbox/presentation/search_mailbox_controller.dart index 12566b37b..aae346434 100644 --- a/lib/features/search/mailbox/presentation/search_mailbox_controller.dart +++ b/lib/features/search/mailbox/presentation/search_mailbox_controller.dart @@ -278,7 +278,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa ); break; case MailboxActions.emptyTrash: - emptyTrashAction(context, mailbox.id, dashboardController); + emptyTrashAction(context, mailbox, dashboardController); break; default: break; diff --git a/model/lib/mailbox/presentation_mailbox.dart b/model/lib/mailbox/presentation_mailbox.dart index 35a223f1f..94dbb2cfc 100644 --- a/model/lib/mailbox/presentation_mailbox.dart +++ b/model/lib/mailbox/presentation_mailbox.dart @@ -79,6 +79,8 @@ class PresentationMailbox with EquatableMixin { return unreadEmails!.value.value <= 999 ? '${unreadEmails!.value.value}' : '999+'; } + int get countEmails => totalEmails?.value.value.toInt() ?? 0; + bool get isSpam => role == roleSpam; bool get isTrash => role == roleTrash;