diff --git a/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart b/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart index 34f6204ed..5462c197d 100644 --- a/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart +++ b/core/lib/presentation/views/dialog/confirmation_dialog_builder.dart @@ -186,7 +186,7 @@ class ConfirmDialogBuilder { )), if (_iconWidget != null) Container( - margin: _marginIcon ?? const EdgeInsets.only(top: 24), + margin: _marginIcon ?? EdgeInsets.zero, alignment: Alignment.center, child: _iconWidget, ), diff --git a/lib/features/base/mixin/mailbox_action_handler_mixin.dart b/lib/features/base/mixin/mailbox_action_handler_mixin.dart index a543cfb3a..20f77239e 100644 --- a/lib/features/base/mixin/mailbox_action_handler_mixin.dart +++ b/lib/features/base/mixin/mailbox_action_handler_mixin.dart @@ -98,4 +98,64 @@ mixin MailboxActionHandlerMixin { .build())); } } + + void emptySpamAction( + BuildContext context, + PresentationMailbox mailbox, + MailboxDashBoardController dashboardController + ) { + if (dashboardController.isDrawerOpen) { + dashboardController.closeMailboxMenuDrawer(); + } + + final responsiveUtils = Get.find(); + final imagePaths = Get.find(); + final appToast = Get.find(); + + 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 (mailbox.countEmails > 0) { + dashboardController.emptySpamFolderAction(spamFolderId: mailbox.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 (mailbox.countEmails > 0) { + dashboardController.emptySpamFolderAction(spamFolderId: mailbox.id); + } else { + appToast.showToastWarningMessage( + context, + AppLocalizations.of(context).noEmailInYourCurrentMailbox + ); + } + }) + ..onCancelButtonAction(AppLocalizations.of(context).cancel, popBack) + ).build())); + } + } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index a6281bcf9..6742e316b 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -68,6 +68,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_bindings.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; @@ -246,6 +247,8 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM _refreshMailboxChanges(currentMailboxState: success.currentMailboxState); } else if (success is UpdateEmailDraftsSuccess) { _refreshMailboxChanges(currentMailboxState: success.currentMailboxState); + } else if (success is EmptySpamFolderSuccess) { + _refreshMailboxChanges(currentMailboxState: success.currentMailboxState); } }); }); @@ -931,6 +934,9 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM case MailboxActions.emptyTrash: emptyTrashAction(context, mailbox, mailboxDashBoardController); break; + case MailboxActions.emptySpam: + emptySpamAction(context, mailbox, mailboxDashBoardController); + break; default: break; } diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index 1f38c3216..0b507008d 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -117,6 +117,7 @@ import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart'; import 'package:tmail_ui_user/features/thread/data/repository/thread_repository_impl.dart'; import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'; +import 'package:tmail_ui_user/features/thread/domain/usecases/empty_spam_folder_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/empty_trash_folder_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/get_email_by_id_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart'; @@ -181,6 +182,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), )); Get.put(AdvancedFilterController()); } @@ -313,6 +315,11 @@ class MailboxDashBoardBindings extends BaseBindings { Get.find(), Get.find(), Get.find())); + Get.lazyPut(() => EmptySpamFolderInteractor( + Get.find(), + Get.find(), + Get.find() + )); Get.lazyPut(() => GetAppDashboardConfigurationInteractor( Get.find())); Get.lazyPut(() => GetEmailByIdInteractor( 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 f7e31c92f..29017f86a 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -108,11 +108,13 @@ import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_ import 'package:tmail_ui_user/features/session/domain/usecases/store_session_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/get_email_by_id_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; +import 'package:tmail_ui_user/features/thread/domain/usecases/empty_spam_folder_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/empty_trash_folder_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/get_email_by_id_interactor.dart'; import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart'; @@ -161,6 +163,7 @@ class MailboxDashBoardController extends ReloadableController { final UpdateSendingEmailInteractor _updateSendingEmailInteractor; final GetAllSendingEmailInteractor _getAllSendingEmailInteractor; final StoreSessionInteractor _storeSessionInteractor; + final EmptySpamFolderInteractor _emptySpamFolderInteractor; GetAllVacationInteractor? _getAllVacationInteractor; UpdateVacationInteractor? _updateVacationInteractor; @@ -234,6 +237,7 @@ class MailboxDashBoardController extends ReloadableController { this._updateSendingEmailInteractor, this._getAllSendingEmailInteractor, this._storeSessionInteractor, + this._emptySpamFolderInteractor, ) : super( getAuthenticatedAccountInteractor, updateAuthenticationAccountInteractor @@ -342,6 +346,8 @@ class MailboxDashBoardController extends ReloadableController { _handleGetAllSendingEmailsSuccess(success); } else if (success is UpdateSendingEmailSuccess) { _handleUpdateSendingEmailSuccess(success); + } else if (success is EmptySpamFolderSuccess) { + _emptySpamFolderSuccess(success); } } @@ -1949,6 +1955,29 @@ class MailboxDashBoardController extends ReloadableController { void _storeSessionAction(Session session) { consumeState(_storeSessionInteractor.execute(session)); } + + void emptySpamFolderAction({Function? onCancelSelectionEmail, MailboxId? spamFolderId}) { + onCancelSelectionEmail?.call(); + + final spamMailboxId = spamFolderId ?? mapDefaultMailboxIdByRole[PresentationMailbox.roleSpam]; + if (sessionCurrent != null && accountId.value != null && spamMailboxId != null) { + consumeState( + _emptySpamFolderInteractor.execute( + sessionCurrent!, + accountId.value!, + spamMailboxId + ) + ); + } + } + + void _emptySpamFolderSuccess(EmptySpamFolderSuccess success) { + if (currentOverlayContext != null && currentContext != null) { + _appToast.showToastSuccessMessage( + currentOverlayContext!, + AppLocalizations.of(currentContext!).toast_message_empty_trash_folder_success); + } + } @override void onClose() { diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 789def246..91b4b1379 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -44,6 +44,7 @@ import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; import 'package:tmail_ui_user/features/thread/domain/model/get_email_request.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/get_email_by_id_state.dart'; @@ -334,7 +335,7 @@ class ThreadController extends BaseController with EmailActionController { _refreshEmailChanges(currentEmailState: success.currentEmailState); } else if (success is MarkAsMultipleEmailReadHasSomeEmailFailure) { _refreshEmailChanges(currentEmailState: success.currentEmailState); - } else if (success is EmptyTrashFolderSuccess) { + } else if (success is EmptyTrashFolderSuccess || success is EmptySpamFolderSuccess) { refreshAllEmail(); } });