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}) { String getToastMessageMoveToMailboxSuccess(BuildContext context, {String? destinationPath}) {
switch(this) { switch(this) {
case EmailActionType.archiveMessage:
case EmailActionType.moveToMailbox: case EmailActionType.moveToMailbox:
return AppLocalizations.of(context).movedToFolder(destinationPath ?? ''); return AppLocalizations.of(context).movedToFolder(destinationPath ?? '');
case EmailActionType.moveToTrash: case EmailActionType.moveToTrash:
@@ -3,4 +3,6 @@ class NotFoundSessionException implements Exception {}
class NotFoundAccountIdException 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/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/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/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_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_create_new_rule_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_preferences_setting_extension.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( Future<void> moveEmailsToMailbox(
List<PresentationEmail> listEmails, List<PresentationEmail> listEmails, {
PresentationMailbox currentMailbox VoidCallback? onCallbackAction,
) async { }) async {
if (accountId.value != null) { if (accountId.value != null) {
final arguments = DestinationPickerArguments( final arguments = DestinationPickerArguments(
accountId.value!, accountId.value!,
MailboxActions.moveEmail, MailboxActions.moveEmail,
sessionCurrent, sessionCurrent,
mailboxIdSelected: currentMailbox.mailboxId); );
final destinationMailbox = PlatformInfo.isWeb final destinationMailbox = PlatformInfo.isWeb
? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments) ? await DialogRouter.pushGeneralDialog(routeName: AppRoutes.destinationPicker, arguments: arguments)
@@ -1283,61 +1284,44 @@ class MailboxDashBoardController extends ReloadableController
sessionCurrent != null && sessionCurrent != null &&
accountId.value != null accountId.value != null
) { ) {
_dispatchMoveToMultipleAction( onCallbackAction?.call();
accountId.value!,
sessionCurrent!,
listEmails.listEmailIds,
currentMailbox,
destinationMailbox,
Map.fromEntries(
listEmails
.where((email) => email.id != null)
.map((email) => MapEntry(email.id!, email.hasRead)),
),
);
}
}
}
void _dispatchMoveToMultipleAction( if (destinationMailbox.isTrash) {
AccountId accountId, moveEmailsToFolder(
Session session, listEmails,
List<EmailId> listEmailIds, EmailActionType.moveToTrash,
PresentationMailbox currentMailbox, selectedMailboxId: destinationMailbox.id,
PresentationMailbox destinationMailbox, );
Map<EmailId, bool> emailIdsWithReadStatus, } else if (destinationMailbox.isSpam) {
) { moveEmailsToFolder(
if (destinationMailbox.isTrash) { listEmails,
_moveSelectedEmailMultipleToMailboxAction( EmailActionType.moveToSpam,
session, selectedMailboxId: destinationMailbox.id,
accountId, );
MoveToMailboxRequest( } else if (destinationMailbox.isArchive) {
{currentMailbox.id: listEmailIds}, moveEmailsToFolder(
destinationMailbox.id, listEmails,
MoveAction.moving, EmailActionType.archiveMessage,
EmailActionType.moveToTrash), selectedMailboxId: destinationMailbox.id,
emailIdsWithReadStatus); );
} else if (destinationMailbox.isSpam) { } else {
_moveSelectedEmailMultipleToMailboxAction( moveEmailsToFolder(
session, listEmails,
accountId, EmailActionType.moveToMailbox,
MoveToMailboxRequest( selectedMailboxId: destinationMailbox.id,
{currentMailbox.id: listEmailIds}, destinationFolderPath: destinationMailbox.mailboxPath,
destinationMailbox.id, );
MoveAction.moving, }
EmailActionType.moveToSpam), }
emailIdsWithReadStatus);
} else { } else {
_moveSelectedEmailMultipleToMailboxAction( onCallbackAction?.call();
session, consumeState(
accountId, Stream.value(Left(MoveMultipleEmailToMailboxFailure(
MoveToMailboxRequest(
{currentMailbox.id: listEmailIds},
destinationMailbox.id,
MoveAction.moving,
EmailActionType.moveToMailbox, EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath), MoveAction.moving,
emailIdsWithReadStatus); ParametersIsNullException(),
))),
);
} }
} }
@@ -1424,7 +1408,7 @@ class MailboxDashBoardController extends ReloadableController
dispatchAction(CancelSelectionAllEmailAction()); dispatchAction(CancelSelectionAllEmailAction());
} }
void _moveSelectedEmailMultipleToMailboxAction( void moveSelectedEmailMultipleToMailboxAction(
Session session, Session session,
AccountId accountId, AccountId accountId,
MoveToMailboxRequest moveRequest, MoveToMailboxRequest moveRequest,
@@ -1446,34 +1430,52 @@ class MailboxDashBoardController extends ReloadableController
MoveAction? moveAction; MoveAction? moveAction;
EmailActionType? emailActionType; EmailActionType? emailActionType;
Map<EmailId, bool>? emailIdsWithReadStatus; Map<EmailId, bool>? emailIdsWithReadStatus;
bool isUndoActionEnabled = false;
if (success is MoveMultipleEmailToMailboxAllSuccess) { if (success is MoveMultipleEmailToMailboxAllSuccess) {
destinationPath = success.destinationPath; destinationPath = success.destinationPath;
movedEmailIds = success.movedListEmailId; movedEmailIds = success.movedListEmailId;
currentMailboxId = success.currentMailboxId; currentMailboxId = success.originalMailboxIdsWithEmailIds.keys.firstOrNull;
destinationMailboxId = success.destinationMailboxId; destinationMailboxId = success.destinationMailboxId;
moveAction = success.moveAction; moveAction = success.moveAction;
emailActionType = success.emailActionType; emailActionType = success.emailActionType;
emailIdsWithReadStatus = success.emailIdsWithReadStatus; emailIdsWithReadStatus = success.emailIdsWithReadStatus;
isUndoActionEnabled = success.originalMailboxIdsWithEmailIds.length == 1;
} else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) { } else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
destinationPath = success.destinationPath; destinationPath = success.destinationPath;
movedEmailIds = success.movedListEmailId; movedEmailIds = success.movedListEmailId;
currentMailboxId = success.currentMailboxId; currentMailboxId = success.originalMailboxIdsWithMoveSucceededEmailIds.keys.firstOrNull;
destinationMailboxId = success.destinationMailboxId; destinationMailboxId = success.destinationMailboxId;
moveAction = success.moveAction; moveAction = success.moveAction;
emailActionType = success.emailActionType; emailActionType = success.emailActionType;
emailIdsWithReadStatus = success.moveSucceededEmailIdsWithReadStatus; emailIdsWithReadStatus = success.moveSucceededEmailIdsWithReadStatus;
isUndoActionEnabled = success.originalMailboxIdsWithMoveSucceededEmailIds.length == 1;
} }
if (currentContext != null && if (currentMailboxId == null ||
currentOverlayContext != null && currentOverlayContext == null ||
emailActionType != null && emailActionType == null ||
moveAction == MoveAction.moving) { moveAction != MoveAction.moving) {
return;
}
if (!isUndoActionEnabled) {
appToast.showToastSuccessMessage(
currentOverlayContext!,
emailActionType.getToastMessageMoveToMailboxSuccess(
currentContext!,
destinationPath: destinationPath,
),
leadingSVGIconColor: Colors.white,
leadingSVGIcon: imagePaths.icFolderMailbox,
);
} else {
appToast.showToastMessage( appToast.showToastMessage(
currentOverlayContext!, currentOverlayContext!,
emailActionType.getToastMessageMoveToMailboxSuccess( emailActionType.getToastMessageMoveToMailboxSuccess(
currentContext!, currentContext!,
destinationPath: destinationPath), destinationPath: destinationPath,
),
actionName: AppLocalizations.of(currentContext!).undo, actionName: AppLocalizations.of(currentContext!).undo,
onActionClick: () { onActionClick: () {
final newCurrentMailboxId = destinationMailboxId; final newCurrentMailboxId = destinationMailboxId;
@@ -1484,7 +1486,7 @@ class MailboxDashBoardController extends ReloadableController
newDestinationMailboxId, newDestinationMailboxId,
MoveAction.undo, MoveAction.undo,
emailActionType!, emailActionType!,
destinationPath: destinationPath destinationPath: destinationPath,
), emailIdsWithReadStatus ?? {}); ), 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) { void unSpamSelectedMultipleEmail(List<PresentationEmail> listEmail) {
if (accountId.value == null || sessionCurrent == null) { if (accountId.value == null || sessionCurrent == null) {
consumeState(Stream.value( consumeState(Stream.value(
@@ -1604,7 +1547,7 @@ class MailboxDashBoardController extends ReloadableController
return; return;
} }
_moveSelectedEmailMultipleToMailboxAction( moveSelectedEmailMultipleToMailboxAction(
sessionCurrent!, sessionCurrent!,
accountId.value!, accountId.value!,
MoveToMailboxRequest( 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; break;
case EmailActionType.unMarkAsStarred: case EmailActionType.unMarkAsStarred:
cancelSelectionMode(); cancelSelectionMode();
markAsStarSelectedMultipleEmail(listEmails, MarkStarAction.unMarkStar); markAsStarSelectedMultipleEmail(listEmails, MarkStarAction.unMarkStar);
break; break;
case EmailActionType.moveToMailbox: case EmailActionType.moveToMailbox:
cancelSelectionMode(); moveEmailsToMailbox(listEmails, onCallbackAction: cancelSelectionMode);
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById);
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(listEmails, mailboxContainCurrent);
}
break; break;
case EmailActionType.moveToTrash: case EmailActionType.moveToTrash:
cancelSelectionMode(); cancelSelectionMode();
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); moveEmailsToTrash(listEmails);
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToTrash(listEmails, mailboxContainCurrent);
}
break; break;
case EmailActionType.deletePermanently: case EmailActionType.deletePermanently:
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById);
@@ -984,10 +976,7 @@ class SearchEmailController extends BaseController
break; break;
case EmailActionType.moveToSpam: case EmailActionType.moveToSpam:
cancelSelectionMode(); cancelSelectionMode();
final mailboxContainCurrent = listEmails.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById); moveEmailsToSpam(listEmails);
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToSpam(listEmails, mailboxContainCurrent);
}
break; break;
case EmailActionType.unSpam: case EmailActionType.unSpam:
cancelSelectionMode(); cancelSelectionMode();
@@ -9,7 +9,6 @@ class LoadingMoveMultipleEmailToMailboxAll extends UIState {}
class MoveMultipleEmailToMailboxAllSuccess extends UIState { class MoveMultipleEmailToMailboxAllSuccess extends UIState {
final List<EmailId> movedListEmailId; final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId;
final MailboxId destinationMailboxId; final MailboxId destinationMailboxId;
final MoveAction moveAction; final MoveAction moveAction;
final EmailActionType emailActionType; final EmailActionType emailActionType;
@@ -19,7 +18,6 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
MoveMultipleEmailToMailboxAllSuccess( MoveMultipleEmailToMailboxAllSuccess(
this.movedListEmailId, this.movedListEmailId,
this.currentMailboxId,
this.destinationMailboxId, this.destinationMailboxId,
this.moveAction, this.moveAction,
this.emailActionType, this.emailActionType,
@@ -33,7 +31,6 @@ class MoveMultipleEmailToMailboxAllSuccess extends UIState {
@override @override
List<Object?> get props => [ List<Object?> get props => [
movedListEmailId, movedListEmailId,
currentMailboxId,
destinationMailboxId, destinationMailboxId,
moveAction, moveAction,
emailActionType, emailActionType,
@@ -55,7 +52,6 @@ class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure {
class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState { class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
final List<EmailId> movedListEmailId; final List<EmailId> movedListEmailId;
final MailboxId currentMailboxId;
final MailboxId destinationMailboxId; final MailboxId destinationMailboxId;
final MoveAction moveAction; final MoveAction moveAction;
final EmailActionType emailActionType; final EmailActionType emailActionType;
@@ -65,7 +61,6 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
MoveMultipleEmailToMailboxHasSomeEmailFailure( MoveMultipleEmailToMailboxHasSomeEmailFailure(
this.movedListEmailId, this.movedListEmailId,
this.currentMailboxId,
this.destinationMailboxId, this.destinationMailboxId,
this.moveAction, this.moveAction,
this.emailActionType, this.emailActionType,
@@ -79,7 +74,6 @@ class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
@override @override
List<Object?> get props => [ List<Object?> get props => [
movedListEmailId, movedListEmailId,
currentMailboxId,
destinationMailboxId, destinationMailboxId,
moveAction, moveAction,
emailActionType, emailActionType,
@@ -29,7 +29,6 @@ class MoveMultipleEmailToMailboxInteractor {
if (moveRequest.totalEmails == result.emailIdsSuccess.length) { if (moveRequest.totalEmails == result.emailIdsSuccess.length) {
yield Right(MoveMultipleEmailToMailboxAllSuccess( yield Right(MoveMultipleEmailToMailboxAllSuccess(
result.emailIdsSuccess, result.emailIdsSuccess,
moveRequest.currentMailboxes.keys.first,
moveRequest.destinationMailboxId, moveRequest.destinationMailboxId,
moveRequest.moveAction, moveRequest.moveAction,
moveRequest.emailActionType, moveRequest.emailActionType,
@@ -52,7 +51,6 @@ class MoveMultipleEmailToMailboxInteractor {
.where((emailId, _) => result.emailIdsSuccess.contains(emailId)); .where((emailId, _) => result.emailIdsSuccess.contains(emailId));
yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure( yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure(
result.emailIdsSuccess, result.emailIdsSuccess,
moveRequest.currentMailboxes.keys.first,
moveRequest.destinationMailboxId, moveRequest.destinationMailboxId,
moveRequest.moveAction, moveRequest.moveAction,
moveRequest.emailActionType, 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/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/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/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/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/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -290,21 +291,35 @@ mixin EmailActionController {
mailboxDashBoardController.markAsStarSelectedMultipleEmail(listEmails, markStarAction); mailboxDashBoardController.markAsStarSelectedMultipleEmail(listEmails, markStarAction);
} }
void moveSelectedMultipleEmailToMailbox( void moveEmailsToMailbox(
List<PresentationEmail> listEmails, List<PresentationEmail> listEmails, {
PresentationMailbox mailboxCurrent VoidCallback? onCallbackAction,
) { }) {
mailboxDashBoardController.moveSelectedMultipleEmailToMailbox( mailboxDashBoardController.moveEmailsToMailbox(
listEmails, listEmails,
mailboxCurrent); onCallbackAction: onCallbackAction,
);
} }
void moveSelectedMultipleEmailToTrash(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) { void moveEmailsToTrash(List<PresentationEmail> listEmails) {
mailboxDashBoardController.moveSelectedMultipleEmailToTrash(listEmails, mailboxCurrent); mailboxDashBoardController.moveEmailsToFolder(
listEmails,
EmailActionType.moveToTrash,
);
} }
void moveSelectedMultipleEmailToSpam(List<PresentationEmail> listEmails, PresentationMailbox mailboxCurrent) { void moveEmailsToArchive(List<PresentationEmail> listEmails) {
mailboxDashBoardController.moveSelectedMultipleEmailToSpam(listEmails, mailboxCurrent); mailboxDashBoardController.moveEmailsToFolder(
listEmails,
EmailActionType.archiveMessage,
);
}
void moveEmailsToSpam(List<PresentationEmail> listEmails) {
mailboxDashBoardController.moveEmailsToFolder(
listEmails,
EmailActionType.moveToSpam,
);
} }
void unSpamSelectedMultipleEmail(List<PresentationEmail> listEmails) { void unSpamSelectedMultipleEmail(List<PresentationEmail> listEmails) {
@@ -1109,22 +1109,11 @@ class ThreadController extends BaseController with EmailActionController {
markAsStarSelectedMultipleEmail(selectionEmail, MarkStarAction.unMarkStar); markAsStarSelectedMultipleEmail(selectionEmail, MarkStarAction.unMarkStar);
break; break;
case EmailActionType.moveToMailbox: case EmailActionType.moveToMailbox:
cancelSelectEmail(); moveEmailsToMailbox(selectionEmail, onCallbackAction: cancelSelectEmail);
final mailboxContainCurrent = searchController.isSearchEmailRunning
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById)
: selectedMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToMailbox(selectionEmail, mailboxContainCurrent);
}
break; break;
case EmailActionType.moveToTrash: case EmailActionType.moveToTrash:
cancelSelectEmail(); cancelSelectEmail();
final mailboxContainCurrent = searchController.isSearchEmailRunning moveEmailsToTrash(selectionEmail);
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById)
: selectedMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToTrash(selectionEmail, mailboxContainCurrent);
}
break; break;
case EmailActionType.deletePermanently: case EmailActionType.deletePermanently:
final mailboxContainCurrent = searchController.isSearchEmailRunning final mailboxContainCurrent = searchController.isSearchEmailRunning
@@ -1141,17 +1130,16 @@ class ThreadController extends BaseController with EmailActionController {
break; break;
case EmailActionType.moveToSpam: case EmailActionType.moveToSpam:
cancelSelectEmail(); cancelSelectEmail();
final mailboxContainCurrent = searchController.isSearchEmailRunning moveEmailsToSpam(selectionEmail);
? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById)
: selectedMailbox;
if (mailboxContainCurrent != null) {
moveSelectedMultipleEmailToSpam(selectionEmail, mailboxContainCurrent);
}
break; break;
case EmailActionType.unSpam: case EmailActionType.unSpam:
cancelSelectEmail(); cancelSelectEmail();
unSpamSelectedMultipleEmail(selectionEmail); unSpamSelectedMultipleEmail(selectionEmail);
break; break;
case EmailActionType.archiveMessage:
cancelSelectEmail();
moveEmailsToArchive(selectionEmail);
break;
default: default:
break; break;
} }
+6
View File
@@ -4677,5 +4677,11 @@
"type": "text", "type": "text",
"placeholders_order": [], "placeholders_order": [],
"placeholders": {} "placeholders": {}
},
"archiveMessagesFailed": "Archive messages failed",
"@archiveMessagesFailed": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
} }
} }
@@ -4934,4 +4934,11 @@ class AppLocalizations {
name: 'showSignature', 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; message = message ?? AppLocalizations.of(context).emptyTrashFolderFailed;
} else if (_isMarkAsSpamFailure(failure)) { } else if (_isMarkAsSpamFailure(failure)) {
message = message ?? AppLocalizations.of(context).markAsSpamFailed; message = message ?? AppLocalizations.of(context).markAsSpamFailed;
} else if (_isArchiveMessagesFailure(failure)) {
message = message ?? AppLocalizations.of(context).archiveMessagesFailed;
} else if (failure is SignInTwakeWorkplaceFailure) { } else if (failure is SignInTwakeWorkplaceFailure) {
message = message ?? AppLocalizations.of(context).sigInSaasFailed; message = message ?? AppLocalizations.of(context).sigInSaasFailed;
} else if (failure is SignUpTwakeWorkplaceFailure) { } else if (failure is SignUpTwakeWorkplaceFailure) {
@@ -204,6 +206,12 @@ class ToastManager {
failure.moveAction == MoveAction.moving; failure.moveAction == MoveAction.moving;
} }
bool _isArchiveMessagesFailure(FeatureFailure failure) {
return failure is MoveMultipleEmailToMailboxFailure &&
failure.emailActionType == EmailActionType.archiveMessage &&
failure.moveAction == MoveAction.moving;
}
void showMessageSuccess(Success success) { void showMessageSuccess(Success success) {
final context = currentContext; final context = currentContext;
final overlayContext = currentOverlayContext; final overlayContext = currentOverlayContext;
@@ -1,5 +1,6 @@
import 'dart:ui'; import 'dart:ui';
import 'package:collection/collection.dart';
import 'package:core/data/constants/constant.dart'; import 'package:core/data/constants/constant.dart';
import 'package:core/domain/extensions/datetime_extension.dart'; import 'package:core/domain/extensions/datetime_extension.dart';
import 'package:core/presentation/extensions/color_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 sanitizedSearchSnippetSubject => _sanitizeSearchSnippet(searchSnippetSubject);
String? get sanitizedSearchSnippetPreview => _sanitizeSearchSnippet(searchSnippetPreview); String? get sanitizedSearchSnippetPreview => _sanitizeSearchSnippet(searchSnippetPreview);
MailboxId? get firstMailboxIdAvailable =>
mailboxIds?.entries.firstWhereOrNull((element) => element.value)?.key;
} }