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
@@ -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,
);
}
}