From 7efe5ed31d8cd74739e3fadffb2b7bd0d97d29c2 Mon Sep 17 00:00:00 2001 From: Dat PHAM HOANG Date: Tue, 31 Dec 2024 13:02:46 +0700 Subject: [PATCH] TF-3372 Handling error for empty trash failure --- .../mixin/mailbox_action_handler_mixin.dart | 4 +- .../mailbox_dashboard_controller.dart | 8 +- .../mark_mailbox_as_read_loading_banner.dart | 9 +- .../data/network/thread_isolate_worker.dart | 6 +- .../thread/presentation/thread_view.dart | 85 ++++++++++++------- lib/l10n/intl_messages.arb | 8 +- lib/main/localizations/app_localizations.dart | 6 ++ lib/main/utils/toast_manager.dart | 3 + 8 files changed, 86 insertions(+), 43 deletions(-) diff --git a/lib/features/base/mixin/mailbox_action_handler_mixin.dart b/lib/features/base/mixin/mailbox_action_handler_mixin.dart index bf23a00ed..ca34bba97 100644 --- a/lib/features/base/mixin/mailbox_action_handler_mixin.dart +++ b/lib/features/base/mixin/mailbox_action_handler_mixin.dart @@ -131,7 +131,7 @@ mixin MailboxActionHandlerMixin { ..onConfirmAction(AppLocalizations.of(context).delete_all, () { popBack(); if (mailbox.countTotalEmails > 0) { - dashboardController.emptySpamFolderAction(spamFolderId: mailbox.id); + dashboardController.emptySpamFolderAction(spamFolderId: mailbox.id, totalEmails: mailbox.countTotalEmails); } else { appToast.showToastWarningMessage( context, @@ -156,7 +156,7 @@ mixin MailboxActionHandlerMixin { ..onConfirmButtonAction(AppLocalizations.of(context).delete_all, () { popBack(); if (mailbox.countTotalEmails > 0) { - dashboardController.emptySpamFolderAction(spamFolderId: mailbox.id); + dashboardController.emptySpamFolderAction(spamFolderId: mailbox.id, totalEmails: mailbox.countTotalEmails); } else { appToast.showToastWarningMessage( context, 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 3e6b32384..8fafc74f2 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1396,12 +1396,14 @@ class MailboxDashBoardController extends ReloadableController onCancelSelectionEmail?.call(); final trashMailboxId = trashFolderId ?? mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash]; + final trashMailbox = mapMailboxById[trashMailboxId]; + final totalEmailsInTrash = totalEmails == 0 ? trashMailbox?.countTotalEmails : totalEmails; if (sessionCurrent != null && accountId.value != null && trashMailboxId != null) { consumeState(_emptyTrashFolderInteractor.execute( sessionCurrent!, accountId.value!, trashMailboxId, - totalEmails, + totalEmailsInTrash ?? 0, _progressStateController )); } @@ -2458,7 +2460,7 @@ class MailboxDashBoardController extends ReloadableController ..onConfirmAction(AppLocalizations.of(context).delete_all, () { popBack(); if (spamMailbox.countTotalEmails > 0) { - emptySpamFolderAction(spamFolderId: spamMailbox.id); + emptySpamFolderAction(spamFolderId: spamMailbox.id, totalEmails: spamMailbox.countTotalEmails); } else { appToast.showToastWarningMessage( context, @@ -2483,7 +2485,7 @@ class MailboxDashBoardController extends ReloadableController ..onConfirmButtonAction(AppLocalizations.of(context).delete_all, () { popBack(); if (spamMailbox.countTotalEmails > 0) { - emptySpamFolderAction(spamFolderId: spamMailbox.id); + emptySpamFolderAction(spamFolderId: spamMailbox.id, totalEmails: spamMailbox.countTotalEmails); } else { appToast.showToastWarningMessage( context, diff --git a/lib/features/mailbox_dashboard/presentation/widgets/mark_mailbox_as_read_loading_banner.dart b/lib/features/mailbox_dashboard/presentation/widgets/mark_mailbox_as_read_loading_banner.dart index 806a063cf..083f353b9 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/mark_mailbox_as_read_loading_banner.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/mark_mailbox_as_read_loading_banner.dart @@ -25,11 +25,9 @@ class MarkMailboxAsReadLoadingBanner extends StatelessWidget with AppLoaderMixin padding: MarkMailboxAsReadLoadingBannerStyle.bannerMargin, child: horizontalLoadingWidget); } else if (success is UpdatingMarkAsMailboxReadState) { - final percent = success.countRead / success.totalUnread; - return _buildProgressBanner(percent); + return _buildProgressBanner(success.countRead, success.totalUnread); } else if (success is EmptyingFolderState) { - final percent = success.countEmailsDeleted / success.totalEmails; - return _buildProgressBanner(percent); + return _buildProgressBanner(success.countEmailsDeleted, success.totalEmails); } else { return const SizedBox.shrink(); } @@ -37,7 +35,8 @@ class MarkMailboxAsReadLoadingBanner extends StatelessWidget with AppLoaderMixin ); } - Padding _buildProgressBanner(double percent) { + Padding _buildProgressBanner(int progress, int total) { + final percent = total > 0 ? progress / total : 0.68; return Padding( padding: MarkMailboxAsReadLoadingBannerStyle.bannerMargin, child: horizontalPercentLoadingWidget(percent) diff --git a/lib/features/thread/data/network/thread_isolate_worker.dart b/lib/features/thread/data/network/thread_isolate_worker.dart index bd9a8b37b..03ffe5112 100644 --- a/lib/features/thread/data/network/thread_isolate_worker.dart +++ b/lib/features/thread/data/network/thread_isolate_worker.dart @@ -61,7 +61,7 @@ class ThreadIsolateWorker { fun1: _emptyMailboxFolderAction, notification: (value) { if (value is List) { - log('ThreadIsolateWorker::emptyMailboxFolder(): onUpdateProgress ${value.length / totalEmails}'); + log('ThreadIsolateWorker::emptyMailboxFolder(): processed ${value.length} - totalEmails $totalEmails'); onProgressController.add(Right(EmptyingFolderState( mailboxId, value.length, totalEmails ))); @@ -120,7 +120,7 @@ class ThreadIsolateWorker { args.accountId, newEmailList.listEmailIds); emailListCompleted.addAll(listEmailIdDeleted); - sendPort.send(listEmailIdDeleted); + sendPort.send(emailListCompleted); } else { hasEmails = false; } @@ -176,7 +176,7 @@ class ThreadIsolateWorker { emailListCompleted.addAll(listEmailIdDeleted); onProgressController.add(Right(EmptyingFolderState( - mailboxId, listEmailIdDeleted.length, totalEmails + mailboxId, emailListCompleted.length, totalEmails ))); } else { hasEmails = false; diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 21eb08538..5d8924ac2 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -1,4 +1,5 @@ import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -164,7 +165,7 @@ class ThreadView extends GetWidget } }), if (!controller.responsiveUtils.isDesktop(context)) - _buildMarkAsMailboxReadLoading(context), + _buildMailboxActionProgressBanner(context), Obx(() => ThreadViewLoadingBarWidget(viewState: controller.viewState.value)), Expanded( child: Container( @@ -864,42 +865,68 @@ class ThreadView extends GetWidget ); } - Widget _buildMarkAsMailboxReadLoading(BuildContext context) { + Widget _buildMailboxActionProgressBanner(BuildContext context) { return Obx(() { - final viewState = controller.mailboxDashBoardController.viewStateMailboxActionProgress.value; - return viewState.fold( - (failure) => const SizedBox.shrink(), - (success) { - if (success is MarkAsMailboxReadLoading - || success is EmptySpamFolderLoading - || success is EmptyTrashFolderLoading - ) { - return Padding( - padding: EdgeInsets.only( - top: controller.responsiveUtils.isDesktop(context) ? 16 : 0, - left: 16, - right: 16, - bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16), - child: horizontalLoadingWidget); - } else if (success is UpdatingMarkAsMailboxReadState) { - final percent = success.countRead / success.totalUnread; - return _buildProgressBanner(context, percent); - } else if (success is EmptyingFolderState) { - final percent = success.countEmailsDeleted / success.totalEmails; - return _buildProgressBanner(context, percent); - } - return const SizedBox.shrink(); - }); + return _MailboxActionProgressBanner( + viewState: controller.mailboxDashBoardController.viewStateMailboxActionProgress.value, + responsiveUtils: controller.responsiveUtils, + ); }); } +} - Padding _buildProgressBanner(BuildContext context, double percent) { +class _MailboxActionProgressBanner extends StatelessWidget with AppLoaderMixin { + final Either viewState; + final ResponsiveUtils responsiveUtils; + + const _MailboxActionProgressBanner({ + required this.viewState, + required this.responsiveUtils, + }); + + @override + Widget build(BuildContext context) { + return viewState.fold( + (failure) => const SizedBox.shrink(), + (success) { + if (success is MarkAsMailboxReadLoading || + success is EmptySpamFolderLoading || + success is EmptyTrashFolderLoading) { + return Padding( + padding: EdgeInsets.only( + top: responsiveUtils.isDesktop(context) ? 16 : 0, + left: 16, + right: 16, + bottom: responsiveUtils.isDesktop(context) ? 0 : 16, + ), + child: horizontalLoadingWidget, + ); + } else if (success is UpdatingMarkAsMailboxReadState) { + return _buildProgressBanner( + context, + success.countRead, + success.totalUnread, + ); + } else if (success is EmptyingFolderState) { + return _buildProgressBanner( + context, + success.countEmailsDeleted, + success.totalEmails, + ); + } + return const SizedBox.shrink(); + }, + ); + } + + Padding _buildProgressBanner(BuildContext context, int progress, int total) { + final percent = total > 0 ? progress / total : 0.68; return Padding( padding: EdgeInsets.only( - top: controller.responsiveUtils.isDesktop(context) ? 16 : 0, + top: responsiveUtils.isDesktop(context) ? 16 : 0, left: 16, right: 16, - bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16), + bottom: responsiveUtils.isDesktop(context) ? 0 : 16), child: horizontalPercentLoadingWidget(percent)); } } \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index ababfd56d..c86038fb0 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2024-10-31T13:18:32.336494", + "@@last_modified": "2024-12-31T12:11:05.777668", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3970,6 +3970,12 @@ "placeholders_order": [], "placeholders": {} }, + "emptyTrashFolderFailed": "Empty trash folder failed", + "@emptyTrashFolderFailed": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, "markAsSpamFailed": "Mark as spam failed", "@markAsSpamFailed": { "type": "text", diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 01ff076bd..0af16a8f8 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -4162,6 +4162,12 @@ class AppLocalizations { name: 'emptySpamFolderFailed'); } + String get emptyTrashFolderFailed { + return Intl.message( + 'Empty trash folder failed', + name: 'emptyTrashFolderFailed'); + } + String get markAsSpamFailed { return Intl.message( 'Mark as spam failed', diff --git a/lib/main/utils/toast_manager.dart b/lib/main/utils/toast_manager.dart index 595b20f6a..fd0d076bb 100644 --- a/lib/main/utils/toast_manager.dart +++ b/lib/main/utils/toast_manager.dart @@ -12,6 +12,7 @@ import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_ex import 'package:tmail_ui_user/features/starting_page/domain/state/sign_in_twake_workplace_state.dart'; import 'package:tmail_ui_user/features/starting_page/domain/state/sign_up_twake_workplace_state.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/move_multiple_email_to_mailbox_state.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -63,6 +64,8 @@ class ToastManager { ?? AppLocalizations.of(currentContext!).unknownError; } else if (failure is EmptySpamFolderFailure) { message = AppLocalizations.of(currentContext!).emptySpamFolderFailed; + } else if (failure is EmptyTrashFolderFailure) { + message = AppLocalizations.of(currentContext!).emptyTrashFolderFailed; } else if (failure is MoveMultipleEmailToMailboxFailure && failure.emailActionType == EmailActionType.moveToSpam && failure.moveAction == MoveAction.moving) {