TF-3939 Handle archive selection email on mobile view
Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
@@ -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 {}
|
||||||
+69
-126
@@ -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(
|
||||||
|
|||||||
+107
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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',
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user