diff --git a/lib/features/composer/presentation/extensions/email_action_type_extension.dart b/lib/features/composer/presentation/extensions/email_action_type_extension.dart index 99758aefc..ceb948f84 100644 --- a/lib/features/composer/presentation/extensions/email_action_type_extension.dart +++ b/lib/features/composer/presentation/extensions/email_action_type_extension.dart @@ -210,7 +210,7 @@ extension EmailActionTypeExtension on EmailActionType { case EmailActionType.moveToMailbox: return appLocalizations.move_message; case EmailActionType.markAsStarred: - return appLocalizations.mark_as_starred; + return appLocalizations.starred; case EmailActionType.unMarkAsStarred: return appLocalizations.not_starred; case EmailActionType.moveToTrash: @@ -239,4 +239,22 @@ extension EmailActionTypeExtension on EmailActionType { return Colors.black; } } + + Color getContextMenuIconColor() { + switch(this) { + case EmailActionType.deletePermanently: + return AppColor.redFF3347; + default: + return AppColor.gray424244.withValues(alpha: 0.72); + } + } + + Color getContextMenuTitleColor() { + switch(this) { + case EmailActionType.deletePermanently: + return AppColor.redFF3347; + default: + return AppColor.gray424244.withValues(alpha: 0.9); + } + } } \ No newline at end of file diff --git a/lib/features/email/presentation/model/context_item_email_action.dart b/lib/features/email/presentation/model/context_item_email_action.dart index e6225ddf5..89c85e6ab 100644 --- a/lib/features/email/presentation/model/context_item_email_action.dart +++ b/lib/features/email/presentation/model/context_item_email_action.dart @@ -1,4 +1,5 @@ import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; import 'package:model/email/email_action_type.dart'; import 'package:tmail_ui_user/features/base/widget/context_menu/context_menu_item_action.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; @@ -20,4 +21,10 @@ class ContextItemEmailAction @override String get actionName => action.getTitle(appLocalizations); + + @override + Color get actionIconColor => action.getContextMenuIconColor(); + + @override + Color get actionNameColor => action.getContextMenuTitleColor(); } diff --git a/lib/features/thread/presentation/extensions/handle_press_email_selection_action.dart b/lib/features/thread/presentation/extensions/handle_press_email_selection_action.dart index 042dfed08..788e3e00a 100644 --- a/lib/features/thread/presentation/extensions/handle_press_email_selection_action.dart +++ b/lib/features/thread/presentation/extensions/handle_press_email_selection_action.dart @@ -1,16 +1,83 @@ +import 'package:flutter/material.dart'; import 'package:model/email/presentation_email.dart'; +import 'package:model/extensions/list_presentation_email_extension.dart'; +import 'package:model/extensions/presentation_mailbox_extension.dart'; +import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/email/presentation/model/context_item_email_action.dart'; import 'package:tmail_ui_user/features/thread/presentation/extensions/email_selection_action_type_extension.dart'; +import 'package:tmail_ui_user/features/thread/presentation/extensions/list_email_selection_action_type_extension.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/email_selection_action_type.dart'; import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; extension HandlePressEmailSelectionActionExtension on ThreadController { void handlePressEmailSelectionAction( + BuildContext context, EmailSelectionActionType type, List emails, + PresentationMailbox? selectedMailbox, ) { final emailActionType = type.toEmailActionType(); if (emailActionType != null) { pressEmailSelectionAction(emailActionType, emails); + } else if (type == EmailSelectionActionType.moreAction) { + _showMoreActionMenu(context, emails, selectedMailbox); } } + + List _createEmailSelectionActionTypes( + List emails, + PresentationMailbox? selectedMailbox, + ) { + return [ + if (emails.isAllEmailRead) + EmailSelectionActionType.markAsUnread + else + EmailSelectionActionType.markAsRead, + if (emails.isAllEmailStarred) + EmailSelectionActionType.unMarkAsStarred + else + EmailSelectionActionType.markAsStarred, + EmailSelectionActionType.moveToFolder, + if (selectedMailbox?.isDeletePermanentlyEnabled != true) + EmailSelectionActionType.moveToTrash, + if (selectedMailbox?.isSpam == true) + EmailSelectionActionType.markAsNotSpam + else + EmailSelectionActionType.markAsSpam, + if (selectedMailbox?.isArchive != true) + EmailSelectionActionType.archiveMessage, + if (selectedMailbox?.isDeletePermanentlyEnabled == true) + EmailSelectionActionType.deletePermanently, + ]; + } + + Future _showMoreActionMenu( + BuildContext context, + List emails, + PresentationMailbox? selectedMailbox, + ) async { + final emailActions = _createEmailSelectionActionTypes( + emails, + selectedMailbox, + ).emailActionTypes; + + final contextMenuActions = emailActions + .map((action) => ContextItemEmailAction( + action, + AppLocalizations.of(context), + imagePaths, + )) + .toList(); + + return openBottomSheetContextMenuAction( + context: context, + itemActions: contextMenuActions, + onContextMenuActionClick: (menuAction) { + popBack(); + pressEmailSelectionAction(menuAction.action, emails); + }, + ); + } } diff --git a/lib/features/thread/presentation/extensions/list_email_selection_action_type_extension.dart b/lib/features/thread/presentation/extensions/list_email_selection_action_type_extension.dart new file mode 100644 index 000000000..d84ba92f5 --- /dev/null +++ b/lib/features/thread/presentation/extensions/list_email_selection_action_type_extension.dart @@ -0,0 +1,9 @@ +import 'package:model/email/email_action_type.dart'; +import 'package:tmail_ui_user/features/thread/presentation/extensions/email_selection_action_type_extension.dart'; +import 'package:tmail_ui_user/features/thread/presentation/model/email_selection_action_type.dart'; + +extension ListEmailSelectionActionTypeExtension on List { + List get emailActionTypes { + return map((action) => action.toEmailActionType()).nonNulls.toList(); + } +} diff --git a/lib/features/thread/presentation/model/email_selection_action_type.dart b/lib/features/thread/presentation/model/email_selection_action_type.dart index 8b402a51b..3fe79014e 100644 --- a/lib/features/thread/presentation/model/email_selection_action_type.dart +++ b/lib/features/thread/presentation/model/email_selection_action_type.dart @@ -62,7 +62,7 @@ enum EmailSelectionActionType { return imagePaths.icMoveMailbox; case EmailSelectionActionType.moveToTrash: case EmailSelectionActionType.deletePermanently: - return imagePaths.icMailboxTrash; + return imagePaths.icDeleteComposer; case EmailSelectionActionType.markAsSpam: return imagePaths.icSpam; case EmailSelectionActionType.markAsNotSpam: diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 8d995df60..7424dd35f 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -91,7 +91,13 @@ class ThreadView extends GetWidget onPopupMenuFilterEmailAction: !controller.responsiveUtils.isScreenWithShortestSide(context) ? (filterOption, position) => controller.handleOpenContextMenuFilterEmailAction(context, position, filterOption) : null, - onPressEmailSelectionActionClick: controller.handlePressEmailSelectionAction, + onPressEmailSelectionActionClick: (type, emails) => + controller.handlePressEmailSelectionAction( + context, + type, + emails, + controller.selectedMailbox, + ), ); }), if (PlatformInfo.isMobile)