TF-3947 Thread Detail Thread level move & delete
This commit is contained in:
+22
@@ -46,4 +46,26 @@ extension GetThreadDetailActionStatus on ThreadDetailController {
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
bool get threadDetailIsTrashed {
|
||||
final trashMailboxId = getMailboxIdByRole(PresentationMailbox.roleTrash);
|
||||
return emailsInThreadDetailInfo.every(
|
||||
(email) {
|
||||
return email.mailboxIds?[trashMailboxId] == true;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
bool get threadDetailIsDraft {
|
||||
final draftMailboxId = getMailboxIdByRole(PresentationMailbox.roleDrafts);
|
||||
return emailsInThreadDetailInfo.every(
|
||||
(email) {
|
||||
return email.mailboxIds?[draftMailboxId] == true;
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
bool get threadDetailCanPermanentlyDelete {
|
||||
return threadDetailIsTrashed || threadDetailIsSpam || threadDetailIsDraft;
|
||||
}
|
||||
}
|
||||
|
||||
+59
-1
@@ -1,3 +1,4 @@
|
||||
import 'package:core/utils/platform_info.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
@@ -6,8 +7,10 @@ import 'package:model/email/mark_star_action.dart';
|
||||
import 'package:model/email/read_actions.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_menu_item_action_widget.dart';
|
||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/context_item_email_action.dart';
|
||||
import 'package:tmail_ui_user/features/email/presentation/model/popup_menu_item_email_action.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||
import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/handle_open_context_menu_extension.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||
@@ -16,10 +19,12 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/extension/clos
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/extension/get_thread_detail_action_status.dart';
|
||||
import 'package:tmail_ui_user/features/thread_detail/presentation/thread_detail_controller.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||
import 'package:tmail_ui_user/main/routes/dialog_router.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
|
||||
extension OnThreadDetailActionClick on ThreadDetailController {
|
||||
void onThreadDetailActionClick(EmailActionType threadDetailActionType) {
|
||||
Future<void> onThreadDetailActionClick(EmailActionType threadDetailActionType) async {
|
||||
switch (threadDetailActionType) {
|
||||
case EmailActionType.markAsRead:
|
||||
case EmailActionType.markAsUnread:
|
||||
@@ -62,6 +67,26 @@ extension OnThreadDetailActionClick on ThreadDetailController {
|
||||
: MarkStarAction.unMarkStar,
|
||||
));
|
||||
break;
|
||||
case EmailActionType.deletePermanently:
|
||||
mailboxDashBoardController.permanentDeleteMultipleEmailInThreadDetail(
|
||||
emailsInThreadDetailInfo,
|
||||
onConfirm: () => closeThreadDetailAction(currentContext),
|
||||
);
|
||||
break;
|
||||
case EmailActionType.moveToMailbox:
|
||||
final mailboxId = await _pickDestinationMailboxId();
|
||||
if (mailboxId == null) return;
|
||||
|
||||
_moveToMailbox(mailboxId, threadDetailActionType);
|
||||
break;
|
||||
case EmailActionType.moveToTrash:
|
||||
final mailboxId = mailboxDashBoardController.getMailboxIdByRole(
|
||||
PresentationMailbox.roleTrash,
|
||||
);
|
||||
if (mailboxId == null) return;
|
||||
|
||||
_moveToMailbox(mailboxId, threadDetailActionType);
|
||||
break;
|
||||
case EmailActionType.archiveMessage:
|
||||
final mailboxId = mailboxDashBoardController.getMailboxIdByRole(
|
||||
PresentationMailbox.roleArchive,
|
||||
@@ -103,8 +128,12 @@ extension OnThreadDetailActionClick on ThreadDetailController {
|
||||
threadDetailIsStarred
|
||||
? EmailActionType.unMarkAsStarred
|
||||
: EmailActionType.markAsStarred,
|
||||
EmailActionType.moveToMailbox,
|
||||
if (!threadDetailIsArchived) EmailActionType.archiveMessage,
|
||||
threadDetailIsSpam ? EmailActionType.unSpam : EmailActionType.moveToSpam,
|
||||
threadDetailIsTrashed
|
||||
? EmailActionType.deletePermanently
|
||||
: EmailActionType.moveToTrash,
|
||||
];
|
||||
|
||||
if (position == null) {
|
||||
@@ -157,4 +186,33 @@ extension OnThreadDetailActionClick on ThreadDetailController {
|
||||
emailActionType: emailActionType,
|
||||
);
|
||||
}
|
||||
|
||||
Future<MailboxId?> _pickDestinationMailboxId() async {
|
||||
if (session == null || accountId == null) return null;
|
||||
|
||||
final threadMailboxIds = emailsInThreadDetailInfo
|
||||
.map((e) => e.mailboxIdContain)
|
||||
.nonNulls
|
||||
.toSet();
|
||||
MailboxId? mailboxIdSelected;
|
||||
if (threadMailboxIds.length == 1) { // All emails in the same mailbox
|
||||
mailboxIdSelected = threadMailboxIds.first;
|
||||
}
|
||||
|
||||
final arguments = DestinationPickerArguments(
|
||||
accountId!,
|
||||
MailboxActions.moveEmail,
|
||||
session,
|
||||
mailboxIdSelected: mailboxIdSelected,
|
||||
);
|
||||
final destinationMailbox = PlatformInfo.isWeb
|
||||
? await DialogRouter.pushGeneralDialog(
|
||||
routeName: AppRoutes.destinationPicker,
|
||||
arguments: arguments,
|
||||
)
|
||||
: await push(AppRoutes.destinationPicker, arguments: arguments);
|
||||
if (destinationMailbox is! PresentationMailbox) return null;
|
||||
|
||||
return destinationMailbox.id;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user