diff --git a/core/lib/presentation/extensions/color_extension.dart b/core/lib/presentation/extensions/color_extension.dart index 8d6c2b97d..5489b98f3 100644 --- a/core/lib/presentation/extensions/color_extension.dart +++ b/core/lib/presentation/extensions/color_extension.dart @@ -139,6 +139,7 @@ extension AppColor on Color { static const colorDividerRuleFilter = Color(0xFFE7E8EC); static const colorIconTextField = Color(0xFFB8C1CC); static const colorVacationNotificationMessageBackground = Color(0x2999A2AD); + static const colorDeletePermanentlyButton = Color(0xffE64646); static const mapGradientColor = [ [Color(0xFF21D4FD), Color(0xFFB721FF)], diff --git a/lib/features/email/domain/state/delete_email_permanently_state.dart b/lib/features/email/domain/state/delete_email_permanently_state.dart index a33ff2f18..de50c93d2 100644 --- a/lib/features/email/domain/state/delete_email_permanently_state.dart +++ b/lib/features/email/domain/state/delete_email_permanently_state.dart @@ -2,6 +2,14 @@ import 'package:core/core.dart'; import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +class StartDeleteEmailPermanently extends UIState { + + StartDeleteEmailPermanently(); + + @override + List get props => []; +} + class DeleteEmailPermanentlySuccess extends UIActionState { DeleteEmailPermanentlySuccess({ diff --git a/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart b/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart index e298ad514..4cce03b57 100644 --- a/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart +++ b/lib/features/email/domain/usecases/delete_email_permanently_interactor.dart @@ -14,6 +14,8 @@ class DeleteEmailPermanentlyInteractor { Stream> execute(AccountId accountId, EmailId emailId) async* { try { + yield Right(StartDeleteEmailPermanently()); + final listState = await Future.wait([ _mailboxRepository.getMailboxState(), _emailRepository.getEmailState(), 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 8e7dc907f..8dafc1010 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -421,12 +421,17 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { } }), Obx(() => buildIconWeb( - icon: SvgPicture.asset(imagePaths.icDelete, fit: BoxFit.fill), - tooltip: controller.selectedMailbox.value?.isTrash == true + icon: SvgPicture.asset( + canDeletePermanently ? imagePaths.icDeleteComposer : imagePaths.icDelete, + color: canDeletePermanently ? AppColor.colorDeletePermanentlyButton : AppColor.primaryColor, + width: 20, + height: 20, + fit: BoxFit.fill), + tooltip: canDeletePermanently ? AppLocalizations.of(context).delete_permanently : AppLocalizations.of(context).move_to_trash, onTap: () { - if (controller.selectedMailbox.value?.isTrash == true) { + if (canDeletePermanently) { return controller.dispatchAction(HandleEmailActionTypeAction(context, controller.listEmailSelected, EmailActionType.deletePermanently)); @@ -439,6 +444,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ]); } + bool get canDeletePermanently { + return controller.selectedMailbox.value?.isTrash == true || + controller.selectedMailbox.value?.isDrafts == true; + } + Widget _buildSearchForm(BuildContext context) { return Row( children: [ diff --git a/lib/features/thread/presentation/model/delete_action_type.dart b/lib/features/thread/presentation/model/delete_action_type.dart index 78cc5b1da..75685bfdd 100644 --- a/lib/features/thread/presentation/model/delete_action_type.dart +++ b/lib/features/thread/presentation/model/delete_action_type.dart @@ -21,12 +21,14 @@ extension DeleteActionTypeExtension on DeleteActionType { } } - String getContentDialog(BuildContext context, {int? count}) { + String getContentDialog(BuildContext context, {int? count, String? mailboxName}) { switch(this) { case DeleteActionType.all: return AppLocalizations.of(context).empty_trash_dialog_message; case DeleteActionType.multiple: - return AppLocalizations.of(context).delete_multiple_messages_dialog(count ?? 0); + return AppLocalizations.of(context).delete_multiple_messages_dialog( + count ?? 0, + mailboxName ?? ''); case DeleteActionType.single: return AppLocalizations.of(context).delete_single_message_dialog; } diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 9e15adce4..66990f4dc 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -928,7 +928,11 @@ class ThreadController extends BaseController { moveSelectedMultipleEmailToTrash(selectionEmail); break; case EmailActionType.deletePermanently: - deleteSelectionEmailsPermanently(context, DeleteActionType.multiple, selectedEmails: selectionEmail); + deleteSelectionEmailsPermanently( + context, + DeleteActionType.multiple, + selectedEmails: selectionEmail, + presentationMailbox: currentMailbox); break; case EmailActionType.moveToSpam: moveSelectedMultipleEmailToSpam(selectionEmail); @@ -1144,10 +1148,20 @@ class ThreadController extends BaseController { bool get isMailboxTrash => mailboxDashBoardController.selectedMailbox.value?.role == PresentationMailbox.roleTrash; - void deleteSelectionEmailsPermanently(BuildContext context, DeleteActionType actionType, {List? selectedEmails}) { + void deleteSelectionEmailsPermanently( + BuildContext context, + DeleteActionType actionType, + { + List? selectedEmails, + PresentationMailbox? presentationMailbox + } + ) { if (_responsiveUtils.isMobile(context)) { (ConfirmationDialogActionSheetBuilder(context) - ..messageText(actionType.getContentDialog(context, count: selectedEmails?.length)) + ..messageText(actionType.getContentDialog( + context, + count: selectedEmails?.length, + mailboxName: presentationMailbox?.name?.name)) ..onCancelAction(AppLocalizations.of(context).cancel, () => popBack()) ..onConfirmAction(actionType.getConfirmActionName(context), () => _deleteSelectionEmailsPermanentlyAction(actionType))) .show(); @@ -1158,7 +1172,10 @@ class ThreadController extends BaseController { builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths) ..key(const Key('confirm_dialog_delete_emails_permanently')) ..title(actionType.getTitleDialog(context)) - ..content(actionType.getContentDialog(context, count: selectedEmails?.length)) + ..content(actionType.getContentDialog( + context, + count: selectedEmails?.length, + mailboxName: presentationMailbox?.name?.name)) ..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, fit: BoxFit.fill)) ..colorConfirmButton(AppColor.colorConfirmActionDialog) ..styleTextConfirmButton(const TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorActionDeleteConfirmDialog)) diff --git a/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart b/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart index 008717cc1..b50c44248 100644 --- a/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart +++ b/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart @@ -190,21 +190,25 @@ class AppBarThreadWidgetBuilder { iconPadding: const EdgeInsets.all(5), splashRadius: 15, icon: SvgPicture.asset( - _imagePaths.icDeleteComposer, - width: 18, - height: 18, - color: AppColor.textFieldErrorBorderColor, + canDeletePermanently ? _imagePaths.icDeleteComposer : _imagePaths.icDelete, + color: canDeletePermanently ? AppColor.colorDeletePermanentlyButton : AppColor.primaryColor, + width: 20, + height: 20, fit: BoxFit.fill), - tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash - ? AppLocalizations.of(_context).move_to_trash - : AppLocalizations.of(_context).delete_permanently, - onTap: () => _currentMailbox?.isTrash == true + tooltip: canDeletePermanently + ? AppLocalizations.of(_context).delete_permanently + : AppLocalizations.of(_context).move_to_trash, + onTap: () => canDeletePermanently ? _onEmailSelectionAction?.call(EmailActionType.deletePermanently, _listSelectionEmail) : _onEmailSelectionAction?.call(EmailActionType.moveToTrash, _listSelectionEmail)), const SizedBox(width: 10), ]); } + bool get canDeletePermanently { + return _currentMailbox?.isTrash == true || _currentMailbox?.isDrafts == true; + } + Widget _buildBodyAppBarForMobile() { return Row(children: [ Expanded(child: Stack( diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 37bcce936..b11b4842e 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-09-08T14:02:20.481140", + "@@last_modified": "2022-09-08T15:46:55.686024", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -1036,14 +1036,16 @@ "placeholders_order": [], "placeholders": {} }, - "delete_multiple_messages_dialog": "You are about to permanently delete {count} items in Trash . Do you want to continue?", + "delete_multiple_messages_dialog": "You are about to permanently delete {count} items in {mailboxName} . Do you want to continue?", "@delete_multiple_messages_dialog": { "type": "text", "placeholders_order": [ - "count" + "count", + "mailboxName" ], "placeholders": { - "count": {} + "count": {}, + "mailboxName": {} } }, "delete_single_message_dialog": "You are about to permanently delete this message. Do you want to continue?", diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index a8df23e4b..a210cd4c4 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -1075,11 +1075,11 @@ class AppLocalizations { name: 'delete_message_forever'); } - String delete_multiple_messages_dialog(int count) { + String delete_multiple_messages_dialog(int count, String mailboxName) { return Intl.message( - 'You are about to permanently delete $count items in Trash . Do you want to continue?', + 'You are about to permanently delete $count items in $mailboxName . Do you want to continue?', name: 'delete_multiple_messages_dialog', - args: [count]); + args: [count, mailboxName]); } String get delete_single_message_dialog {