TF-3372 Handle Empty mailbox success + failure states
This commit is contained in:
committed by
Dat H. Pham
parent
06adc9e6a8
commit
b07a142bcc
@@ -64,7 +64,10 @@ mixin MailboxActionHandlerMixin {
|
|||||||
..onConfirmAction(AppLocalizations.of(context).delete, () {
|
..onConfirmAction(AppLocalizations.of(context).delete, () {
|
||||||
popBack();
|
popBack();
|
||||||
if (mailbox.countTotalEmails > 0) {
|
if (mailbox.countTotalEmails > 0) {
|
||||||
dashboardController.emptyTrashFolderAction(trashFolderId: mailbox.id);
|
dashboardController.emptyTrashFolderAction(
|
||||||
|
trashFolderId: mailbox.id,
|
||||||
|
totalEmails: mailbox.countTotalEmails
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
appToast.showToastWarningMessage(
|
appToast.showToastWarningMessage(
|
||||||
context,
|
context,
|
||||||
@@ -89,7 +92,10 @@ mixin MailboxActionHandlerMixin {
|
|||||||
..onConfirmButtonAction(AppLocalizations.of(context).delete, () {
|
..onConfirmButtonAction(AppLocalizations.of(context).delete, () {
|
||||||
popBack();
|
popBack();
|
||||||
if (mailbox.countTotalEmails > 0) {
|
if (mailbox.countTotalEmails > 0) {
|
||||||
dashboardController.emptyTrashFolderAction(trashFolderId: mailbox.id);
|
dashboardController.emptyTrashFolderAction(
|
||||||
|
trashFolderId: mailbox.id,
|
||||||
|
totalEmails: mailbox.countTotalEmails,
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
appToast.showToastWarningMessage(
|
appToast.showToastWarningMessage(
|
||||||
context,
|
context,
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ import 'package:dartz/dartz.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
|
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_comparator.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_comparator_property.dart';
|
||||||
@@ -69,7 +69,7 @@ class MailboxIsolateWorker {
|
|||||||
),
|
),
|
||||||
fun1: _handleMarkAsMailboxReadAction,
|
fun1: _handleMarkAsMailboxReadAction,
|
||||||
notification: (value) {
|
notification: (value) {
|
||||||
if (value is List<Email>) {
|
if (value is List<EmailId>) {
|
||||||
log('MailboxIsolateWorker::markAsMailboxRead(): onUpdateProgress: PERCENT ${value.length / totalEmailUnread}');
|
log('MailboxIsolateWorker::markAsMailboxRead(): onUpdateProgress: PERCENT ${value.length / totalEmailUnread}');
|
||||||
onProgressController.add(Right(UpdatingMarkAsMailboxReadState(
|
onProgressController.add(Right(UpdatingMarkAsMailboxReadState(
|
||||||
mailboxId: mailboxId,
|
mailboxId: mailboxId,
|
||||||
|
|||||||
@@ -1359,9 +1359,15 @@ class MailboxController extends BaseMailboxController
|
|||||||
void emptyMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
|
void emptyMailboxAction(BuildContext context, PresentationMailbox presentationMailbox) {
|
||||||
log('MailboxController::emptyMailboxAction:presentationMailbox: ${presentationMailbox.name}');
|
log('MailboxController::emptyMailboxAction:presentationMailbox: ${presentationMailbox.name}');
|
||||||
if (presentationMailbox.isTrash) {
|
if (presentationMailbox.isTrash) {
|
||||||
mailboxDashBoardController.emptyTrashFolderAction(trashFolderId: presentationMailbox.id);
|
mailboxDashBoardController.emptyTrashFolderAction(
|
||||||
|
trashFolderId: presentationMailbox.id,
|
||||||
|
totalEmails: presentationMailbox.countTotalEmails
|
||||||
|
);
|
||||||
} else if (presentationMailbox.isSpam) {
|
} else if (presentationMailbox.isSpam) {
|
||||||
mailboxDashBoardController.emptySpamFolderAction(spamFolderId: presentationMailbox.id);
|
mailboxDashBoardController.emptySpamFolderAction(
|
||||||
|
spamFolderId: presentationMailbox.id,
|
||||||
|
totalEmails: presentationMailbox.countTotalEmails
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+25
-6
@@ -439,8 +439,11 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
_handleRestoreDeletedMessageFailed();
|
_handleRestoreDeletedMessageFailed();
|
||||||
} else if (failure is GetRestoredDeletedMessageFailure) {
|
} else if (failure is GetRestoredDeletedMessageFailure) {
|
||||||
_handleRestoreDeletedMessageFailed();
|
_handleRestoreDeletedMessageFailed();
|
||||||
} else if (failure is EmptySpamFolderFailure
|
} else if (failure is EmptySpamFolderFailure) {
|
||||||
|| failure is MoveMultipleEmailToMailboxFailure) {
|
_handleEmptySpamFolderFailure(failure);
|
||||||
|
} else if (failure is EmptyTrashFolderFailure) {
|
||||||
|
_handleEmptyTrashFolderFailure(failure);
|
||||||
|
} else if (failure is MoveMultipleEmailToMailboxFailure) {
|
||||||
toastManager.showMessageFailure(failure);
|
toastManager.showMessageFailure(failure);
|
||||||
} else if (failure is GetComposerCacheFailure) {
|
} else if (failure is GetComposerCacheFailure) {
|
||||||
_handleIdentityCache();
|
_handleIdentityCache();
|
||||||
@@ -1385,12 +1388,22 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void emptyTrashFolderAction({Function? onCancelSelectionEmail, MailboxId? trashFolderId}) {
|
void emptyTrashFolderAction({
|
||||||
|
Function? onCancelSelectionEmail,
|
||||||
|
MailboxId? trashFolderId,
|
||||||
|
int totalEmails = 0,
|
||||||
|
}) {
|
||||||
onCancelSelectionEmail?.call();
|
onCancelSelectionEmail?.call();
|
||||||
|
|
||||||
final trashMailboxId = trashFolderId ?? mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash];
|
final trashMailboxId = trashFolderId ?? mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash];
|
||||||
if (sessionCurrent != null && accountId.value != null && trashMailboxId != null) {
|
if (sessionCurrent != null && accountId.value != null && trashMailboxId != null) {
|
||||||
consumeState(_emptyTrashFolderInteractor.execute(sessionCurrent!, accountId.value!, trashMailboxId));
|
consumeState(_emptyTrashFolderInteractor.execute(
|
||||||
|
sessionCurrent!,
|
||||||
|
accountId.value!,
|
||||||
|
trashMailboxId,
|
||||||
|
totalEmails,
|
||||||
|
_progressStateController
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2371,7 +2384,11 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
consumeState(_storeSessionInteractor.execute(session));
|
consumeState(_storeSessionInteractor.execute(session));
|
||||||
}
|
}
|
||||||
|
|
||||||
void emptySpamFolderAction({Function? onCancelSelectionEmail, MailboxId? spamFolderId}) {
|
void emptySpamFolderAction({
|
||||||
|
Function? onCancelSelectionEmail,
|
||||||
|
MailboxId? spamFolderId,
|
||||||
|
int totalEmails = 0
|
||||||
|
}) {
|
||||||
onCancelSelectionEmail?.call();
|
onCancelSelectionEmail?.call();
|
||||||
|
|
||||||
spamFolderId ??= spamMailboxId;
|
spamFolderId ??= spamMailboxId;
|
||||||
@@ -2389,7 +2406,9 @@ class MailboxDashBoardController extends ReloadableController
|
|||||||
consumeState(_emptySpamFolderInteractor.execute(
|
consumeState(_emptySpamFolderInteractor.execute(
|
||||||
sessionCurrent!,
|
sessionCurrent!,
|
||||||
accountId.value!,
|
accountId.value!,
|
||||||
spamFolderId
|
spamFolderId,
|
||||||
|
totalEmails,
|
||||||
|
_progressStateController
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-3
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
|
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/mark_mailbox_as_read_loading_banner_style.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/mark_mailbox_as_read_loading_banner_style.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/domain/state/empty_spam_folder_state.dart';
|
||||||
|
|
||||||
class MarkMailboxAsReadLoadingBanner extends StatelessWidget with AppLoaderMixin {
|
class MarkMailboxAsReadLoadingBanner extends StatelessWidget with AppLoaderMixin {
|
||||||
final Either<Failure, Success> viewState;
|
final Either<Failure, Success> viewState;
|
||||||
@@ -25,13 +26,21 @@ class MarkMailboxAsReadLoadingBanner extends StatelessWidget with AppLoaderMixin
|
|||||||
child: horizontalLoadingWidget);
|
child: horizontalLoadingWidget);
|
||||||
} else if (success is UpdatingMarkAsMailboxReadState) {
|
} else if (success is UpdatingMarkAsMailboxReadState) {
|
||||||
final percent = success.countRead / success.totalUnread;
|
final percent = success.countRead / success.totalUnread;
|
||||||
return Padding(
|
return _buildProgressBanner(percent);
|
||||||
padding: MarkMailboxAsReadLoadingBannerStyle.bannerMargin,
|
} else if (success is EmptyingFolderState) {
|
||||||
child: horizontalPercentLoadingWidget(percent));
|
final percent = success.countEmailsDeleted / success.totalEmails;
|
||||||
|
return _buildProgressBanner(percent);
|
||||||
} else {
|
} else {
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Padding _buildProgressBanner(double percent) {
|
||||||
|
return Padding(
|
||||||
|
padding: MarkMailboxAsReadLoadingBannerStyle.bannerMargin,
|
||||||
|
child: horizontalPercentLoadingWidget(percent)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -18,6 +18,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widg
|
|||||||
import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_banner_widget.dart';
|
import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_banner_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_banner_widget.dart';
|
import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_banner_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.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_all_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
|
||||||
@@ -868,7 +870,10 @@ class ThreadView extends GetWidget<ThreadController>
|
|||||||
return viewState.fold(
|
return viewState.fold(
|
||||||
(failure) => const SizedBox.shrink(),
|
(failure) => const SizedBox.shrink(),
|
||||||
(success) {
|
(success) {
|
||||||
if (success is MarkAsMailboxReadLoading) {
|
if (success is MarkAsMailboxReadLoading
|
||||||
|
|| success is EmptySpamFolderLoading
|
||||||
|
|| success is EmptyTrashFolderLoading
|
||||||
|
) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
|
top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
|
||||||
@@ -878,16 +883,23 @@ class ThreadView extends GetWidget<ThreadController>
|
|||||||
child: horizontalLoadingWidget);
|
child: horizontalLoadingWidget);
|
||||||
} else if (success is UpdatingMarkAsMailboxReadState) {
|
} else if (success is UpdatingMarkAsMailboxReadState) {
|
||||||
final percent = success.countRead / success.totalUnread;
|
final percent = success.countRead / success.totalUnread;
|
||||||
return Padding(
|
return _buildProgressBanner(context, percent);
|
||||||
padding: EdgeInsets.only(
|
} else if (success is EmptyingFolderState) {
|
||||||
top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
|
final percent = success.countEmailsDeleted / success.totalEmails;
|
||||||
left: 16,
|
return _buildProgressBanner(context, percent);
|
||||||
right: 16,
|
|
||||||
bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
|
|
||||||
child: horizontalPercentLoadingWidget(percent));
|
|
||||||
}
|
}
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Padding _buildProgressBanner(BuildContext context, double percent) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: controller.responsiveUtils.isDesktop(context) ? 16 : 0,
|
||||||
|
left: 16,
|
||||||
|
right: 16,
|
||||||
|
bottom: controller.responsiveUtils.isDesktop(context) ? 0 : 16),
|
||||||
|
child: horizontalPercentLoadingWidget(percent));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user