Skip to content

Commit 83f1c02

Browse files
committed
TF-3372 Handle Empty mailbox success + failure states
1 parent 3efd2ac commit 83f1c02

File tree

6 files changed

+75
-23
lines changed

6 files changed

+75
-23
lines changed

lib/features/base/mixin/mailbox_action_handler_mixin.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ mixin MailboxActionHandlerMixin {
6464
..onConfirmAction(AppLocalizations.of(context).delete, () {
6565
popBack();
6666
if (mailbox.countTotalEmails > 0) {
67-
dashboardController.emptyTrashFolderAction(trashFolderId: mailbox.id);
67+
dashboardController.emptyTrashFolderAction(
68+
trashFolderId: mailbox.id,
69+
totalEmails: mailbox.countTotalEmails
70+
);
6871
} else {
6972
appToast.showToastWarningMessage(
7073
context,
@@ -89,7 +92,10 @@ mixin MailboxActionHandlerMixin {
8992
..onConfirmButtonAction(AppLocalizations.of(context).delete, () {
9093
popBack();
9194
if (mailbox.countTotalEmails > 0) {
92-
dashboardController.emptyTrashFolderAction(trashFolderId: mailbox.id);
95+
dashboardController.emptyTrashFolderAction(
96+
trashFolderId: mailbox.id,
97+
totalEmails: mailbox.countTotalEmails,
98+
);
9399
} else {
94100
appToast.showToastWarningMessage(
95101
context,

lib/features/mailbox/data/network/mailbox_isolate_worker.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import 'package:dartz/dartz.dart';
88
import 'package:jmap_dart_client/jmap/account_id.dart';
99
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
1010
import 'package:jmap_dart_client/jmap/core/session/session.dart';
11+
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
1112
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
1213
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
13-
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
1414
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
1515
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
1616
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
@@ -69,7 +69,7 @@ class MailboxIsolateWorker {
6969
),
7070
fun1: _handleMarkAsMailboxReadAction,
7171
notification: (value) {
72-
if (value is List<Email>) {
72+
if (value is List<EmailId>) {
7373
log('MailboxIsolateWorker::markAsMailboxRead(): onUpdateProgress: PERCENT ${value.length / totalEmailUnread}');
7474
onProgressController.add(Right(UpdatingMarkAsMailboxReadState(
7575
mailboxId: mailboxId,

lib/features/mailbox/presentation/mailbox_controller.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,9 +1359,15 @@ class MailboxController extends BaseMailboxController
13591359
void emptyMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
13601360
log('MailboxController::emptyMailboxAction:presentationMailbox: ${presentationMailbox.name}');
13611361
if (presentationMailbox.isTrash) {
1362-
mailboxDashBoardController.emptyTrashFolderAction(trashFolderId: presentationMailbox.id);
1362+
mailboxDashBoardController.emptyTrashFolderAction(
1363+
trashFolderId: presentationMailbox.id,
1364+
totalEmails: presentationMailbox.countTotalEmails
1365+
);
13631366
} else if (presentationMailbox.isSpam) {
1364-
mailboxDashBoardController.emptySpamFolderAction(spamFolderId: presentationMailbox.id);
1367+
mailboxDashBoardController.emptySpamFolderAction(
1368+
spamFolderId: presentationMailbox.id,
1369+
totalEmails: presentationMailbox.countTotalEmails
1370+
);
13651371
}
13661372
}
13671373

lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -439,8 +439,11 @@ class MailboxDashBoardController extends ReloadableController
439439
_handleRestoreDeletedMessageFailed();
440440
} else if (failure is GetRestoredDeletedMessageFailure) {
441441
_handleRestoreDeletedMessageFailed();
442-
} else if (failure is EmptySpamFolderFailure
443-
|| failure is MoveMultipleEmailToMailboxFailure) {
442+
} else if (failure is EmptySpamFolderFailure) {
443+
_handleEmptySpamFolderFailure(failure);
444+
} else if (failure is EmptyTrashFolderFailure) {
445+
_handleEmptyTrashFolderFailure(failure);
446+
} else if (failure is MoveMultipleEmailToMailboxFailure) {
444447
toastManager.showMessageFailure(failure);
445448
} else if (failure is GetComposerCacheFailure) {
446449
_handleIdentityCache();
@@ -1385,12 +1388,22 @@ class MailboxDashBoardController extends ReloadableController
13851388
}
13861389
}
13871390

1388-
void emptyTrashFolderAction({Function? onCancelSelectionEmail, MailboxId? trashFolderId}) {
1391+
void emptyTrashFolderAction({
1392+
Function? onCancelSelectionEmail,
1393+
MailboxId? trashFolderId,
1394+
int totalEmails = 0,
1395+
}) {
13891396
onCancelSelectionEmail?.call();
13901397

13911398
final trashMailboxId = trashFolderId ?? mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash];
13921399
if (sessionCurrent != null && accountId.value != null && trashMailboxId != null) {
1393-
consumeState(_emptyTrashFolderInteractor.execute(sessionCurrent!, accountId.value!, trashMailboxId));
1400+
consumeState(_emptyTrashFolderInteractor.execute(
1401+
sessionCurrent!,
1402+
accountId.value!,
1403+
trashMailboxId,
1404+
totalEmails,
1405+
_progressStateController
1406+
));
13941407
}
13951408
}
13961409

@@ -2371,7 +2384,11 @@ class MailboxDashBoardController extends ReloadableController
23712384
consumeState(_storeSessionInteractor.execute(session));
23722385
}
23732386

2374-
void emptySpamFolderAction({Function? onCancelSelectionEmail, MailboxId? spamFolderId}) {
2387+
void emptySpamFolderAction({
2388+
Function? onCancelSelectionEmail,
2389+
MailboxId? spamFolderId,
2390+
int totalEmails = 0
2391+
}) {
23752392
onCancelSelectionEmail?.call();
23762393

23772394
spamFolderId ??= spamMailboxId;
@@ -2389,7 +2406,9 @@ class MailboxDashBoardController extends ReloadableController
23892406
consumeState(_emptySpamFolderInteractor.execute(
23902407
sessionCurrent!,
23912408
accountId.value!,
2392-
spamFolderId
2409+
spamFolderId,
2410+
totalEmails,
2411+
_progressStateController
23932412
));
23942413
}
23952414

lib/features/mailbox_dashboard/presentation/widgets/mark_mailbox_as_read_loading_banner.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
55
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
66
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
77
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/mark_mailbox_as_read_loading_banner_style.dart';
8+
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
89

910
class MarkMailboxAsReadLoadingBanner extends StatelessWidget with AppLoaderMixin {
1011
final Either<Failure, Success> viewState;
@@ -25,13 +26,21 @@ class MarkMailboxAsReadLoadingBanner extends StatelessWidget with AppLoaderMixin
2526
child: horizontalLoadingWidget);
2627
} else if (success is UpdatingMarkAsMailboxReadState) {
2728
final percent = success.countRead / success.totalUnread;
28-
return Padding(
29-
padding: MarkMailboxAsReadLoadingBannerStyle.bannerMargin,
30-
child: horizontalPercentLoadingWidget(percent));
29+
return _buildProgressBanner(percent);
30+
} else if (success is EmptyingFolderState) {
31+
final percent = success.countEmailsDeleted / success.totalEmails;
32+
return _buildProgressBanner(percent);
3133
} else {
3234
return const SizedBox.shrink();
3335
}
3436
}
3537
);
3638
}
39+
40+
Padding _buildProgressBanner(double percent) {
41+
return Padding(
42+
padding: MarkMailboxAsReadLoadingBannerStyle.bannerMargin,
43+
child: horizontalPercentLoadingWidget(percent)
44+
);
45+
}
3746
}

lib/features/thread/presentation/thread_view.dart

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widg
1818
import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_banner_widget.dart';
1919
import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_banner_widget.dart';
2020
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
21+
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
22+
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
2123
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
2224
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
2325
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
@@ -868,7 +870,10 @@ class ThreadView extends GetWidget<ThreadController>
868870
return viewState.fold(
869871
(failure) => const SizedBox.shrink(),
870872
(success) {
871-
if (success is MarkAsMailboxReadLoading) {
873+
if (success is MarkAsMailboxReadLoading
874+
|| success is EmptySpamFolderLoading
875+
|| success is EmptyTrashFolderLoading
876+
) {
872877
return Padding(
873878
padding: EdgeInsets.only(
874879
top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
@@ -878,16 +883,23 @@ class ThreadView extends GetWidget<ThreadController>
878883
child: horizontalLoadingWidget);
879884
} else if (success is UpdatingMarkAsMailboxReadState) {
880885
final percent = success.countRead / success.totalUnread;
881-
return Padding(
882-
padding: EdgeInsets.only(
883-
top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
884-
left: 16,
885-
right: 16,
886-
bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
887-
child: horizontalPercentLoadingWidget(percent));
886+
return _buildProgressBanner(context, percent);
887+
} else if (success is EmptyingFolderState) {
888+
final percent = success.countEmailsDeleted / success.totalEmails;
889+
return _buildProgressBanner(context, percent);
888890
}
889891
return const SizedBox.shrink();
890892
});
891893
});
892894
}
895+
896+
Padding _buildProgressBanner(BuildContext context, double percent) {
897+
return Padding(
898+
padding: EdgeInsets.only(
899+
top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
900+
left: 16,
901+
right: 16,
902+
bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
903+
child: horizontalPercentLoadingWidget(percent));
904+
}
893905
}

0 commit comments

Comments
 (0)