TF-3939 Handle archive selection email on mobile view

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-08-05 16:25:02 +07:00
committed by Dat H. Pham
parent 2935b3217b
commit f44118af48
13 changed files with 240 additions and 178 deletions
@@ -44,6 +44,7 @@ extension EmailActionTypeExtension on EmailActionType {
String getToastMessageMoveToMailboxSuccess(BuildContext context, {String? destinationPath}) {
switch(this) {
case EmailActionType.archiveMessage:
case EmailActionType.moveToMailbox:
return AppLocalizations.of(context).movedToFolder(destinationPath ?? '');
case EmailActionType.moveToTrash:
@@ -3,4 +3,6 @@ class NotFoundSessionException implements Exception {}
class NotFoundAccountIdException implements Exception {}
class NotFoundContextException implements Exception {}
class NotFoundContextException implements Exception {}
class ParametersIsNullException implements Exception {}
@@ -113,6 +113,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/spam_report_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/cleanup_recent_search_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/delete_emails_in_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_clear_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_create_new_rule_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_preferences_setting_extension.dart';
@@ -1263,16 +1264,16 @@ class MailboxDashBoardController extends ReloadableController
}
}
void moveSelectedMultipleEmailToMailbox(
List<PresentationEmail> listEmails,
PresentationMailbox currentMailbox
) async {
Future<void> moveEmailsToMailbox(
List<PresentationEmail> listEmails, {
VoidCallback? onCallbackAction,
}) async {
if (accountId.value != null) {
final arguments = DestinationPickerArguments(
accountId.value!,
MailboxActions.moveEmail,
sessionCurrent,
mailboxIdSelected: currentMailbox.mailboxId);
);
final destinationMailbox = PlatformInfo.isWeb
? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
@@ -1283,61 +1284,44 @@ class MailboxDashBoardController extends ReloadableController
sessionCurrent != null &&
accountId.value != null
) {
_dispatchMoveToMultipleAction(
accountId.value!,
sessionCurrent!,
listEmails.listEmailIds,
currentMailbox,
destinationMailbox,
Map.fromEntries(
listEmails
.where((email) => email.id != null)
.map((email) => MapEntry(email.id!, email.hasRead)),
),
);
}
}
}
onCallbackAction?.call();
void _dispatchMoveToMultipleAction(
AccountId accountId,
Session session,
List<EmailId> listEmailIds,
PresentationMailbox currentMailbox,
PresentationMailbox destinationMailbox,
Map<EmailId, bool> emailIdsWithReadStatus,
) {
if (destinationMailbox.isTrash) {
_moveSelectedEmailMultipleToMailboxAction(
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: listEmailIds},
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToTrash),
emailIdsWithReadStatus);
} else if (destinationMailbox.isSpam) {
_moveSelectedEmailMultipleToMailboxAction(
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: listEmailIds},
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToSpam),
emailIdsWithReadStatus);
if (destinationMailbox.isTrash) {
moveEmailsToFolder(
listEmails,
EmailActionType.moveToTrash,
selectedMailboxId: destinationMailbox.id,
);
} else if (destinationMailbox.isSpam) {
moveEmailsToFolder(
listEmails,
EmailActionType.moveToSpam,
selectedMailboxId: destinationMailbox.id,
);
} else if (destinationMailbox.isArchive) {
moveEmailsToFolder(
listEmails,
EmailActionType.archiveMessage,
selectedMailboxId: destinationMailbox.id,
);
} else {
moveEmailsToFolder(
listEmails,
EmailActionType.moveToMailbox,
selectedMailboxId: destinationMailbox.id,
destinationFolderPath: destinationMailbox.mailboxPath,
);
}
}
} else {
_moveSelectedEmailMultipleToMailboxAction(
session,
accountId,
MoveToMailboxRequest(
{currentMailbox.id: listEmailIds},
destinationMailbox.id,
MoveAction.moving,
onCallbackAction?.call();
consumeState(
Stream.value(Left(MoveMultipleEmailToMailboxFailure(
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath),
emailIdsWithReadStatus);
MoveAction.moving,
ParametersIsNullException(),
))),
);
}
}
@@ -1424,7 +1408,7 @@ class MailboxDashBoardController extends ReloadableController
dispatchAction(CancelSelectionAllEmailAction());
}
void _moveSelectedEmailMultipleToMailboxAction(
void moveSelectedEmailMultipleToMailboxAction(
Session session,
AccountId accountId,
MoveToMailboxRequest moveRequest,
@@ -1446,34 +1430,52 @@ class MailboxDashBoardController extends ReloadableController
MoveAction? moveAction;
EmailActionType? emailActionType;
Map<EmailId, bool>? emailIdsWithReadStatus;
bool isUndoActionEnabled = false;
if (success is MoveMultipleEmailToMailboxAllSuccess) {
destinationPath = success.destinationPath;
movedEmailIds = success.movedListEmailId;
currentMailboxId = success.currentMailboxId;
currentMailboxId = success.originalMailboxIdsWithEmailIds.keys.firstOrNull;
destinationMailboxId = success.destinationMailboxId;
moveAction = success.moveAction;
emailActionType = success.emailActionType;
emailIdsWithReadStatus = success.emailIdsWithReadStatus;
isUndoActionEnabled = success.originalMailboxIdsWithEmailIds.length == 1;
} else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
destinationPath = success.destinationPath;
movedEmailIds = success.movedListEmailId;
currentMailboxId = success.currentMailboxId;
currentMailboxId = success.originalMailboxIdsWithMoveSucceededEmailIds.keys.firstOrNull;
destinationMailboxId = success.destinationMailboxId;
moveAction = success.moveAction;
emailActionType = success.emailActionType;
emailIdsWithReadStatus = success.moveSucceededEmailIdsWithReadStatus;
isUndoActionEnabled = success.originalMailboxIdsWithMoveSucceededEmailIds.length == 1;
}
if (currentContext != null &&
currentOverlayContext != null &&
emailActionType != null &&
moveAction == MoveAction.moving) {
if (currentMailboxId == null ||
currentOverlayContext == null ||
emailActionType == null ||
moveAction != MoveAction.moving) {
return;
}
if (!isUndoActionEnabled) {
appToast.showToastSuccessMessage(
currentOverlayContext!,
emailActionType.getToastMessageMoveToMailboxSuccess(
currentContext!,
destinationPath: destinationPath,
),
leadingSVGIconColor: Colors.white,
leadingSVGIcon: imagePaths.icFolderMailbox,
);
} else {
appToast.showToastMessage(
currentOverlayContext!,
emailActionType.getToastMessageMoveToMailboxSuccess(
currentContext!,
destinationPath: destinationPath),
destinationPath: destinationPath,
),
actionName: AppLocalizations.of(currentContext!).undo,
onActionClick: () {
final newCurrentMailboxId = destinationMailboxId;
@@ -1484,7 +1486,7 @@ class MailboxDashBoardController extends ReloadableController
newDestinationMailboxId,
MoveAction.undo,
emailActionType!,
destinationPath: destinationPath
destinationPath: destinationPath,
), emailIdsWithReadStatus ?? {});
}
},
@@ -1510,65 +1512,6 @@ class MailboxDashBoardController extends ReloadableController
}
}
void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) {
final trashMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash);
if (accountId.value != null && trashMailboxId != null && sessionCurrent != null) {
_moveSelectedEmailMultipleToMailboxAction(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest(
{mailboxCurrent.id: listEmails.listEmailIds},
trashMailboxId,
MoveAction.moving,
EmailActionType.moveToTrash),
Map.fromEntries(
listEmails
.where((email) => email.id != null)
.map((email) => MapEntry(email.id!, email.hasRead)),
),
);
}
}
void moveSelectedMultipleEmailToSpam(List<PresentationEmail> listEmail, PresentationMailbox mailboxCurrent) {
if (accountId.value == null || sessionCurrent == null) {
consumeState(Stream.value(
Left(MoveMultipleEmailToMailboxFailure(
EmailActionType.moveToSpam,
MoveAction.moving,
NotFoundSessionException()
))
));
return;
}
if (spamMailboxId == null) {
consumeState(Stream.value(
Left(MoveMultipleEmailToMailboxFailure(
EmailActionType.moveToSpam,
MoveAction.moving,
NotFoundSpamMailboxException()
))
));
return;
}
_moveSelectedEmailMultipleToMailboxAction(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest(
{mailboxCurrent.id: listEmail.listEmailIds},
spamMailboxId!,
MoveAction.moving,
EmailActionType.moveToSpam),
Map.fromEntries(
listEmail
.where((email) => email.id != null)
.map((email) => MapEntry(email.id!, email.hasRead)),
),
);
}
void unSpamSelectedMultipleEmail(List<PresentationEmail> listEmail) {
if (accountId.value == null || sessionCurrent == null) {
consumeState(Stream.value(
@@ -1604,7 +1547,7 @@ class MailboxDashBoardController extends ReloadableController
return;
}
_moveSelectedEmailMultipleToMailboxAction(
moveSelectedEmailMultipleToMailboxAction(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest(
@@ -0,0 +1,107 @@
import 'package:core/utils/app_logger.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/email/email_action_type.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/extensions/list_presentation_email_extension.dart';
import 'package:model/extensions/presentation_email_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
extension HandleActionTypeForEmailSelection on MailboxDashBoardController {
void moveEmailsToFolder(
List<PresentationEmail> emails,
EmailActionType actionType,
{MailboxId? selectedMailboxId, String? destinationFolderPath}
) {
MailboxId? destinationMailboxId;
if (actionType == EmailActionType.moveToMailbox) {
destinationMailboxId = selectedMailboxId;
} else if (actionType == EmailActionType.moveToSpam) {
destinationMailboxId = spamMailboxId;
} else if (actionType == EmailActionType.moveToTrash) {
destinationMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash);
} else if (actionType == EmailActionType.archiveMessage) {
destinationMailboxId = getMailboxIdByRole(PresentationMailbox.roleArchive);
}
if (accountId.value == null ||
destinationMailboxId == null ||
sessionCurrent == null) {
consumeState(
Stream.value(Left(MoveMultipleEmailToMailboxFailure(
actionType,
MoveAction.moving,
ParametersIsNullException(),
))),
);
return;
}
final mapEmailIdsByMailboxId = <MailboxId, List<EmailId>>{};
if (searchController.isSearchEmailRunning) {
for (final email in emails) {
final mailboxId = email.firstMailboxIdAvailable;
final emailId = email.id;
if (mailboxId == null ||
mailboxId == destinationMailboxId ||
emailId == null) {
continue;
}
mapEmailIdsByMailboxId.putIfAbsent(mailboxId, () => []).add(emailId);
}
} else {
final selectedId = selectedMailbox.value?.id;
if (selectedId != null) {
mapEmailIdsByMailboxId[selectedId] = emails.listEmailIds;
}
}
log('$runtimeType::moveEmailsToFolder: MapEmailIdsByMailboxId = $mapEmailIdsByMailboxId');
if (mapEmailIdsByMailboxId.isEmpty) {
consumeState(
Stream.value(Left(MoveMultipleEmailToMailboxFailure(
actionType,
MoveAction.moving,
ParametersIsNullException(),
))),
);
return;
}
final emailIdsWithReadStatus = Map.fromEntries(
emails
.where((email) => email.id != null)
.map((email) => MapEntry(email.id!, email.hasRead)),
);
final destinationPath = destinationFolderPath ??
(currentContext != null
? destinationFolderPath ?? mapMailboxById[destinationMailboxId]?.getDisplayName(currentContext!)
: null);
moveSelectedEmailMultipleToMailboxAction(
sessionCurrent!,
accountId.value!,
MoveToMailboxRequest(
mapEmailIdsByMailboxId,
destinationMailboxId,
MoveAction.moving,
actionType,
destinationPath: destinationPath,
),
emailIdsWithReadStatus,
);
}
}
@@ -954,22 +954,14 @@ class SearchEmailController extends BaseController
break;
case EmailActionType.unMarkAsStarred:
cancelSelectionMode();
markAsStarSelectedMultipleEmail(listEmails, MarkStarAction.unMarkStar);
break;
case EmailActionType.moveToMailbox:
cancelSelectionMode();
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById);
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(listEmails, mailboxContainCurrent);
}
moveEmailsToMailbox(listEmails, onCallbackAction: cancelSelectionMode);
break;
case EmailActionType.moveToTrash:
cancelSelectionMode();
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById);
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToTrash(listEmails, mailboxContainCurrent);
}
moveEmailsToTrash(listEmails);
break;
case EmailActionType.deletePermanently:
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById);
@@ -984,10 +976,7 @@ class SearchEmailController extends BaseController
break;
case EmailActionType.moveToSpam:
cancelSelectionMode();
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById);
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToSpam(listEmails, mailboxContainCurrent);
}
moveEmailsToSpam(listEmails);
break;
case EmailActionType.unSpam:
cancelSelectionMode();
@@ -9,7 +9,6 @@ class LoadingMoveMultipleEmailToMailboxAll extends UIState {}
class MoveMultipleEmailToMailboxAllSuccess extends UIState {
final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId;
final MailboxId destinationMailboxId;
final MoveAction moveAction;
final EmailActionType emailActionType;
@@ -19,7 +18,6 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
MoveMultipleEmailToMailboxAllSuccess(
this.movedListEmailId,
this.currentMailboxId,
this.destinationMailboxId,
this.moveAction,
this.emailActionType,
@@ -33,7 +31,6 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
@override
List<Object?> get props => [
movedListEmailId,
currentMailboxId,
destinationMailboxId,
moveAction,
emailActionType,
@@ -55,7 +52,6 @@ class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure {
class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId;
final MailboxId destinationMailboxId;
final MoveAction moveAction;
final EmailActionType emailActionType;
@@ -65,7 +61,6 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
MoveMultipleEmailToMailboxHasSomeEmailFailure(
this.movedListEmailId,
this.currentMailboxId,
this.destinationMailboxId,
this.moveAction,
this.emailActionType,
@@ -79,7 +74,6 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
@override
List<Object?> get props => [
movedListEmailId,
currentMailboxId,
destinationMailboxId,
moveAction,
emailActionType,
@@ -29,7 +29,6 @@ class MoveMultipleEmailToMailboxInteractor {
if (moveRequest.totalEmails == result.emailIdsSuccess.length) {
yield Right(MoveMultipleEmailToMailboxAllSuccess(
result.emailIdsSuccess,
moveRequest.currentMailboxes.keys.first,
moveRequest.destinationMailboxId,
moveRequest.moveAction,
moveRequest.emailActionType,
@@ -52,7 +51,6 @@ class MoveMultipleEmailToMailboxInteractor {
.where((emailId, _) => result.emailIdsSuccess.contains(emailId));
yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure(
result.emailIdsSuccess,
moveRequest.currentMailboxes.keys.first,
moveRequest.destinationMailboxId,
moveRequest.moveAction,
moveRequest.emailActionType,
@@ -25,6 +25,7 @@ import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_reques
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_action_type_for_email_selection.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/open_and_close_composer_extension.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -290,21 +291,35 @@ mixin EmailActionController {
mailboxDashBoardController.markAsStarSelectedMultipleEmail(listEmails, markStarAction);
}
void moveSelectedMultipleEmailToMailbox(
List<PresentationEmail> listEmails,
PresentationMailbox mailboxCurrent
) {
mailboxDashBoardController.moveSelectedMultipleEmailToMailbox(
void moveEmailsToMailbox(
List<PresentationEmail> listEmails, {
VoidCallback? onCallbackAction,
}) {
mailboxDashBoardController.moveEmailsToMailbox(
listEmails,
mailboxCurrent);
onCallbackAction: onCallbackAction,
);
}
void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) {
mailboxDashBoardController.moveSelectedMultipleEmailToTrash(listEmails, mailboxCurrent);
void moveEmailsToTrash(List<PresentationEmail> listEmails) {
mailboxDashBoardController.moveEmailsToFolder(
listEmails,
EmailActionType.moveToTrash,
);
}
void moveSelectedMultipleEmailToSpam(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) {
mailboxDashBoardController.moveSelectedMultipleEmailToSpam(listEmails, mailboxCurrent);
void moveEmailsToArchive(List<PresentationEmail> listEmails) {
mailboxDashBoardController.moveEmailsToFolder(
listEmails,
EmailActionType.archiveMessage,
);
}
void moveEmailsToSpam(List<PresentationEmail> listEmails) {
mailboxDashBoardController.moveEmailsToFolder(
listEmails,
EmailActionType.moveToSpam,
);
}
void unSpamSelectedMultipleEmail(List<PresentationEmail> listEmails) {
@@ -1109,22 +1109,11 @@ class ThreadController extends BaseController with EmailActionController {
markAsStarSelectedMultipleEmail(selectionEmail, MarkStarAction.unMarkStar);
break;
case EmailActionType.moveToMailbox:
cancelSelectEmail();
final mailboxContainCurrent = searchController.isSearchEmailRunning
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById)
: selectedMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(selectionEmail, mailboxContainCurrent);
}
moveEmailsToMailbox(selectionEmail, onCallbackAction: cancelSelectEmail);
break;
case EmailActionType.moveToTrash:
cancelSelectEmail();
final mailboxContainCurrent = searchController.isSearchEmailRunning
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById)
: selectedMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToTrash(selectionEmail, mailboxContainCurrent);
}
moveEmailsToTrash(selectionEmail);
break;
case EmailActionType.deletePermanently:
final mailboxContainCurrent = searchController.isSearchEmailRunning
@@ -1141,17 +1130,16 @@ class ThreadController extends BaseController with EmailActionController {
break;
case EmailActionType.moveToSpam:
cancelSelectEmail();
final mailboxContainCurrent = searchController.isSearchEmailRunning
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById)
: selectedMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToSpam(selectionEmail, mailboxContainCurrent);
}
moveEmailsToSpam(selectionEmail);
break;
case EmailActionType.unSpam:
cancelSelectEmail();
unSpamSelectedMultipleEmail(selectionEmail);
break;
case EmailActionType.archiveMessage:
cancelSelectEmail();
moveEmailsToArchive(selectionEmail);
break;
default:
break;
}
+6
View File
@@ -4677,5 +4677,11 @@
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"archiveMessagesFailed": "Archive messages failed",
"@archiveMessagesFailed": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
}
}
@@ -4934,4 +4934,11 @@ class AppLocalizations {
name: 'showSignature',
);
}
String get archiveMessagesFailed {
return Intl.message(
'Archive messages failed',
name: 'archiveMessagesFailed',
);
}
}
+8
View File
@@ -155,6 +155,8 @@ class ToastManager {
message = message ?? AppLocalizations.of(context).emptyTrashFolderFailed;
} else if (_isMarkAsSpamFailure(failure)) {
message = message ?? AppLocalizations.of(context).markAsSpamFailed;
} else if (_isArchiveMessagesFailure(failure)) {
message = message ?? AppLocalizations.of(context).archiveMessagesFailed;
} else if (failure is SignInTwakeWorkplaceFailure) {
message = message ?? AppLocalizations.of(context).sigInSaasFailed;
} else if (failure is SignUpTwakeWorkplaceFailure) {
@@ -204,6 +206,12 @@ class ToastManager {
failure.moveAction == MoveAction.moving;
}
bool _isArchiveMessagesFailure(FeatureFailure failure) {
return failure is MoveMultipleEmailToMailboxFailure &&
failure.emailActionType == EmailActionType.archiveMessage &&
failure.moveAction == MoveAction.moving;
}
void showMessageSuccess(Success success) {
final context = currentContext;
final overlayContext = currentOverlayContext;
@@ -1,5 +1,6 @@
import 'dart:ui';
import 'package:collection/collection.dart';
import 'package:core/data/constants/constant.dart';
import 'package:core/domain/extensions/datetime_extension.dart';
import 'package:core/presentation/extensions/color_extension.dart';
@@ -198,4 +199,7 @@ extension PresentationEmailExtension on PresentationEmail {
String? get sanitizedSearchSnippetSubject => _sanitizeSearchSnippet(searchSnippetSubject);
String? get sanitizedSearchSnippetPreview => _sanitizeSearchSnippet(searchSnippetPreview);
MailboxId? get firstMailboxIdAvailable =>
mailboxIds?.entries.firstWhereOrNull((element) => element.value)?.key;
}