feat: Apply EmailMoreActionContextMenu mixin for ThreadView and SearchEmailView
This commit is contained in:
+19
-96
@@ -1,108 +1,31 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:model/email/email_action_type.dart';
|
import 'package:labels/model/label.dart';
|
||||||
import 'package:model/email/presentation_email.dart';
|
import 'package:model/email/presentation_email.dart';
|
||||||
import 'package:model/extensions/presentation_mailbox_extension.dart';
|
|
||||||
import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_menu_action_group_widget.dart';
|
|
||||||
import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_submenu_controller.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_dashboard/presentation/extensions/labels/handle_logic_label_extension.dart';
|
|
||||||
import 'package:tmail_ui_user/features/search/email/presentation/search_email_controller.dart';
|
import 'package:tmail_ui_user/features/search/email/presentation/search_email_controller.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_more_action_context_menu_mixin.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
|
||||||
|
|
||||||
extension HandleEmailMoreActionExtension on SearchEmailController {
|
extension HandleEmailMoreActionExtension on SearchEmailController {
|
||||||
Future<void> handleEmailMoreAction(
|
Future<void> handleEmailMoreAction(
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
PresentationEmail presentationEmail,
|
PresentationEmail presentationEmail,
|
||||||
RelativeRect? position,
|
RelativeRect? position,
|
||||||
) {
|
bool isLabelAvailable,
|
||||||
final mailboxContain = presentationEmail.mailboxContain;
|
List<Label>? listLabels,
|
||||||
final isDrafts = mailboxContain?.isDrafts ?? false;
|
) async {
|
||||||
final isSpam = mailboxContain?.isSpam ?? false;
|
await openMoreActionContextMenu(
|
||||||
final isRead = presentationEmail.hasRead;
|
EmailContextMenuParams(
|
||||||
final isTrash = mailboxContain?.isTrash ?? false;
|
|
||||||
final canPermanentlyDelete = isDrafts || isSpam || isTrash;
|
|
||||||
final isLabelAvailable = mailboxDashBoardController.isLabelAvailable;
|
|
||||||
final listLabels = mailboxDashBoardController.labelController.labels;
|
|
||||||
final shouldShowLabelAs = isLabelAvailable && listLabels.isNotEmpty;
|
|
||||||
|
|
||||||
final listEmailActions = [
|
|
||||||
isRead ? EmailActionType.markAsUnread : EmailActionType.markAsRead,
|
|
||||||
EmailActionType.moveToMailbox,
|
|
||||||
if (shouldShowLabelAs) EmailActionType.labelAs,
|
|
||||||
canPermanentlyDelete ? EmailActionType.deletePermanently : EmailActionType.moveToTrash,
|
|
||||||
isSpam ? EmailActionType.unSpam : EmailActionType.moveToSpam,
|
|
||||||
if (!isDrafts) EmailActionType.editAsNewEmail,
|
|
||||||
];
|
|
||||||
|
|
||||||
if (listEmailActions.isEmpty) return Future.value();
|
|
||||||
|
|
||||||
if (position == null) {
|
|
||||||
final contextMenuActions = listEmailActions
|
|
||||||
.map((action) => ContextItemEmailAction(
|
|
||||||
action,
|
|
||||||
AppLocalizations.of(context),
|
|
||||||
imagePaths,
|
|
||||||
category: action.category,
|
|
||||||
))
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
return openBottomSheetContextMenuAction(
|
|
||||||
context: context,
|
context: context,
|
||||||
itemActions: contextMenuActions,
|
email: presentationEmail,
|
||||||
onContextMenuActionClick: (menuAction) {
|
imagePaths: imagePaths,
|
||||||
popBack();
|
isLabelAvailable: isLabelAvailable,
|
||||||
pressEmailAction(
|
labels: listLabels,
|
||||||
context,
|
position: position,
|
||||||
menuAction.action,
|
openBottomSheetContextMenu: openBottomSheetContextMenuAction,
|
||||||
presentationEmail,
|
openPopupMenu: (context, position, popupMenuWidget) =>
|
||||||
mailboxContain: mailboxContain,
|
popupMenuWidget.show(context, position),
|
||||||
);
|
onHandleEmailByActionType: pressEmailAction,
|
||||||
},
|
onSelectLabelAction: (label, isSelected) {},
|
||||||
useGroupedActions: true,
|
),
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
final submenuController = PopupSubmenuController();
|
|
||||||
|
|
||||||
final popupMenuItemEmailActions = listEmailActions.map((actionType) {
|
|
||||||
return PopupMenuItemEmailAction(
|
|
||||||
actionType,
|
|
||||||
AppLocalizations.of(context),
|
|
||||||
imagePaths,
|
|
||||||
category: actionType.category,
|
|
||||||
submenu: buildLabelSubmenuForEmail(
|
|
||||||
actionType: actionType,
|
|
||||||
imagePaths: imagePaths,
|
|
||||||
presentationEmail: presentationEmail,
|
|
||||||
labels: listLabels,
|
|
||||||
onSelectLabelAction: (label, isSelected) {
|
|
||||||
submenuController.hide();
|
|
||||||
popBack();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}).toList();
|
|
||||||
|
|
||||||
final popupMenuWidget = PopupMenuActionGroupWidget(
|
|
||||||
actions: popupMenuItemEmailActions,
|
|
||||||
submenuController: submenuController,
|
|
||||||
onActionSelected: (action) {
|
|
||||||
if (shouldHandleAction(action.action)) {
|
|
||||||
pressEmailAction(
|
|
||||||
context,
|
|
||||||
action.action,
|
|
||||||
presentationEmail,
|
|
||||||
mailboxContain: mailboxContain,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
return popupMenuWidget.show(
|
|
||||||
context,
|
|
||||||
position,
|
|
||||||
).whenComplete(submenuController.hide);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_inter
|
|||||||
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
|
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/extensions/list_presentation_email_extensions.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/extensions/list_presentation_email_extensions.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_more_action_context_menu_mixin.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/features/thread/presentation/model/mail_list_shortcut_action_view_event.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/model/mail_list_shortcut_action_view_event.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
@@ -90,7 +91,8 @@ class SearchEmailController extends BaseController
|
|||||||
with EmailActionController,
|
with EmailActionController,
|
||||||
DateRangePickerMixin,
|
DateRangePickerMixin,
|
||||||
SearchLabelFilterModalMixin,
|
SearchLabelFilterModalMixin,
|
||||||
LabelSubMenuMixin {
|
LabelSubMenuMixin,
|
||||||
|
EmailMoreActionContextMenu {
|
||||||
|
|
||||||
final networkConnectionController = Get.find<NetworkConnectionController>();
|
final networkConnectionController = Get.find<NetworkConnectionController>();
|
||||||
|
|
||||||
@@ -915,10 +917,9 @@ class SearchEmailController extends BaseController
|
|||||||
}
|
}
|
||||||
|
|
||||||
void pressEmailAction(
|
void pressEmailAction(
|
||||||
BuildContext context,
|
|
||||||
EmailActionType actionType,
|
EmailActionType actionType,
|
||||||
PresentationEmail selectedEmail,
|
PresentationEmail selectedEmail,
|
||||||
{required PresentationMailbox? mailboxContain}
|
PresentationMailbox? mailboxContain,
|
||||||
) {
|
) {
|
||||||
switch(actionType) {
|
switch(actionType) {
|
||||||
case EmailActionType.preview:
|
case EmailActionType.preview:
|
||||||
@@ -929,7 +930,7 @@ class SearchEmailController extends BaseController
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EmailActionType.selection:
|
case EmailActionType.selection:
|
||||||
selectEmail(context, selectedEmail);
|
selectEmail(selectedEmail);
|
||||||
break;
|
break;
|
||||||
case EmailActionType.markAsRead:
|
case EmailActionType.markAsRead:
|
||||||
markAsEmailRead(selectedEmail, ReadActions.markAsRead, MarkReadAction.tap);
|
markAsEmailRead(selectedEmail, ReadActions.markAsRead, MarkReadAction.tap);
|
||||||
@@ -950,7 +951,11 @@ class SearchEmailController extends BaseController
|
|||||||
moveToTrash(selectedEmail, mailboxContain: mailboxContain);
|
moveToTrash(selectedEmail, mailboxContain: mailboxContain);
|
||||||
break;
|
break;
|
||||||
case EmailActionType.deletePermanently:
|
case EmailActionType.deletePermanently:
|
||||||
deleteEmailPermanently(context, selectedEmail);
|
if (currentContext != null) {
|
||||||
|
deleteEmailPermanently(currentContext!, selectedEmail);
|
||||||
|
} else {
|
||||||
|
logWarning('SearchEmailController.pressEmailAction: currentContext is null');
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EmailActionType.moveToSpam:
|
case EmailActionType.moveToSpam:
|
||||||
moveToSpam(selectedEmail, mailboxContain: mailboxContain);
|
moveToSpam(selectedEmail, mailboxContain: mailboxContain);
|
||||||
@@ -966,7 +971,7 @@ class SearchEmailController extends BaseController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void selectEmail(BuildContext context, PresentationEmail presentationEmailSelected) {
|
void selectEmail(PresentationEmail presentationEmailSelected) {
|
||||||
listResultSearch.value = listResultSearch
|
listResultSearch.value = listResultSearch
|
||||||
.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email)
|
.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email)
|
||||||
.toList();
|
.toList();
|
||||||
|
|||||||
@@ -643,10 +643,10 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
final mailboxContain = emailPreview
|
final mailboxContain = emailPreview
|
||||||
.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById);
|
.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById);
|
||||||
controller.pressEmailAction(
|
controller.pressEmailAction(
|
||||||
context,
|
|
||||||
EmailActionType.preview,
|
EmailActionType.preview,
|
||||||
emailPreview,
|
emailPreview,
|
||||||
mailboxContain: mailboxContain);
|
mailboxContain,
|
||||||
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -779,10 +779,9 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
mailboxContain: presentationEmail.mailboxContain,
|
mailboxContain: presentationEmail.mailboxContain,
|
||||||
emailActionClick: (action, email) {
|
emailActionClick: (action, email) {
|
||||||
controller.pressEmailAction(
|
controller.pressEmailAction(
|
||||||
context,
|
|
||||||
action,
|
action,
|
||||||
email,
|
email,
|
||||||
mailboxContain: presentationEmail.mailboxContain,
|
presentationEmail.mailboxContain,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onMoreActionClick: (email, position) =>
|
onMoreActionClick: (email, position) =>
|
||||||
@@ -790,6 +789,8 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
|||||||
context,
|
context,
|
||||||
email,
|
email,
|
||||||
position,
|
position,
|
||||||
|
isLabelAvailable,
|
||||||
|
listLabels,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
handleEmailActionType(
|
handleEmailActionType(
|
||||||
EmailActionType.preview,
|
EmailActionType.preview,
|
||||||
newEmail,
|
newEmail,
|
||||||
mailboxContain: mailboxContain,
|
mailboxContain,
|
||||||
);
|
);
|
||||||
mailboxDashBoardController.clearDashBoardAction();
|
mailboxDashBoardController.clearDashBoardAction();
|
||||||
} else if (action is StartSearchEmailAction
|
} else if (action is StartSearchEmailAction
|
||||||
@@ -1332,9 +1332,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
void handleEmailActionType(
|
void handleEmailActionType(
|
||||||
EmailActionType actionType,
|
EmailActionType actionType,
|
||||||
PresentationEmail selectedEmail,
|
PresentationEmail selectedEmail,
|
||||||
{
|
PresentationMailbox? mailboxContain,
|
||||||
required PresentationMailbox? mailboxContain,
|
|
||||||
}
|
|
||||||
) {
|
) {
|
||||||
switch(actionType) {
|
switch(actionType) {
|
||||||
case EmailActionType.preview:
|
case EmailActionType.preview:
|
||||||
@@ -1477,7 +1475,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
handleEmailActionType(
|
handleEmailActionType(
|
||||||
EmailActionType.preview,
|
EmailActionType.preview,
|
||||||
presentationEmailWithRouter,
|
presentationEmailWithRouter,
|
||||||
mailboxContain: mailboxContain
|
mailboxContain,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1496,7 +1494,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
handleEmailActionType(
|
handleEmailActionType(
|
||||||
EmailActionType.preview,
|
EmailActionType.preview,
|
||||||
presentationEmailWithRouter,
|
presentationEmailWithRouter,
|
||||||
mailboxContain: mailboxContain
|
mailboxContain,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
searchController.enableSearch();
|
searchController.enableSearch();
|
||||||
@@ -1512,7 +1510,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
handleEmailActionType(
|
handleEmailActionType(
|
||||||
EmailActionType.preview,
|
EmailActionType.preview,
|
||||||
presentationEmailWithRouter,
|
presentationEmailWithRouter,
|
||||||
mailboxContain: mailboxContain
|
mailboxContain,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1532,7 +1530,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
handleEmailActionType(
|
handleEmailActionType(
|
||||||
EmailActionType.preview,
|
EmailActionType.preview,
|
||||||
presentationEmailWithRouter,
|
presentationEmailWithRouter,
|
||||||
mailboxContain: email.findMailboxContain(mailboxDashBoardController.mapMailboxById)
|
email.findMailboxContain(mailboxDashBoardController.mapMailboxById),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,13 +12,9 @@ import 'package:tmail_ui_user/features/base/mixin/popup_menu_widget_mixin.dart';
|
|||||||
import 'package:tmail_ui_user/features/base/widget/clean_messages_banner.dart';
|
import 'package:tmail_ui_user/features/base/widget/clean_messages_banner.dart';
|
||||||
import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart';
|
import 'package:tmail_ui_user/features/base/widget/compose_floating_button.dart';
|
||||||
import 'package:tmail_ui_user/features/base/widget/keyboard/keyboard_handler_wrapper.dart';
|
import 'package:tmail_ui_user/features/base/widget/keyboard/keyboard_handler_wrapper.dart';
|
||||||
import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_menu_action_group_widget.dart';
|
|
||||||
import 'package:tmail_ui_user/features/base/widget/popup_menu/popup_submenu_controller.dart';
|
|
||||||
import 'package:tmail_ui_user/features/base/widget/report_message_banner.dart';
|
import 'package:tmail_ui_user/features/base/widget/report_message_banner.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/extensions/presentation_email_extension.dart';
|
import 'package:tmail_ui_user/features/email/presentation/extensions/presentation_email_extension.dart';
|
||||||
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/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/labels/presentation/mixin/label_sub_menu_mixin.dart';
|
import 'package:tmail_ui_user/features/labels/presentation/mixin/label_sub_menu_mixin.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/clear_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/clear_mailbox_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
|
||||||
@@ -46,6 +42,7 @@ import 'package:tmail_ui_user/features/thread/presentation/extensions/handle_pre
|
|||||||
import 'package:tmail_ui_user/features/thread/presentation/extensions/handle_pull_to_refresh_list_email_extension.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/extensions/handle_pull_to_refresh_list_email_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/extensions/handle_select_message_filter_extension.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/extensions/handle_select_message_filter_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/extensions/handle_shift_selection_email_extension.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/extensions/handle_shift_selection_email_extension.dart';
|
||||||
|
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_more_action_context_menu_mixin.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/features/thread/presentation/model/loading_more_status.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/model/loading_more_status.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/styles/item_email_tile_styles.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/styles/item_email_tile_styles.dart';
|
||||||
@@ -59,12 +56,12 @@ import 'package:tmail_ui_user/features/thread/presentation/widgets/empty_emails_
|
|||||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/scroll_to_top_button_widget.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/widgets/scroll_to_top_button_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/widgets/thread_view_loading_bar_widget.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/widgets/thread_view_loading_bar_widget.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
|
||||||
|
|
||||||
class ThreadView extends GetWidget<ThreadController>
|
class ThreadView extends GetWidget<ThreadController>
|
||||||
with AppLoaderMixin,
|
with AppLoaderMixin,
|
||||||
PopupMenuWidgetMixin,
|
PopupMenuWidgetMixin,
|
||||||
LabelSubMenuMixin {
|
LabelSubMenuMixin,
|
||||||
|
EmailMoreActionContextMenu {
|
||||||
|
|
||||||
ThreadView({Key? key}) : super(key: key);
|
ThreadView({Key? key}) : super(key: key);
|
||||||
|
|
||||||
@@ -660,8 +657,22 @@ class ThreadView extends GetWidget<ThreadController>
|
|||||||
isAINeedsActionEnabled: isAINeedsActionEnabled,
|
isAINeedsActionEnabled: isAINeedsActionEnabled,
|
||||||
labels: emailLabels,
|
labels: emailLabels,
|
||||||
emailActionClick: _handleEmailActionClicked,
|
emailActionClick: _handleEmailActionClicked,
|
||||||
onMoreActionClick: (email, position) =>
|
onMoreActionClick: (email, position) async {
|
||||||
_handleEmailContextMenuAction(context, email, position),
|
await openMoreActionContextMenu(
|
||||||
|
EmailContextMenuParams(
|
||||||
|
context: context,
|
||||||
|
email: email,
|
||||||
|
imagePaths: controller.imagePaths,
|
||||||
|
isLabelAvailable: isLabelAvailable,
|
||||||
|
labels: listLabels,
|
||||||
|
position: position,
|
||||||
|
openBottomSheetContextMenu: dashboardController.openBottomSheetContextMenu,
|
||||||
|
openPopupMenu: dashboardController.openPopupMenuActionGroup,
|
||||||
|
onHandleEmailByActionType: controller.handleEmailActionType,
|
||||||
|
onSelectLabelAction: (label, isSelected) {},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -674,110 +685,10 @@ class ThreadView extends GetWidget<ThreadController>
|
|||||||
controller.handleEmailActionType(
|
controller.handleEmailActionType(
|
||||||
actionType,
|
actionType,
|
||||||
presentationEmail,
|
presentationEmail,
|
||||||
mailboxContain: presentationEmail.mailboxContain,
|
presentationEmail.mailboxContain,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _handleEmailContextMenuAction(
|
|
||||||
BuildContext context,
|
|
||||||
PresentationEmail presentationEmail,
|
|
||||||
RelativeRect? position
|
|
||||||
) {
|
|
||||||
final mailboxContain = presentationEmail.mailboxContain;
|
|
||||||
final isDrafts = mailboxContain?.isDrafts ?? false;
|
|
||||||
final isChildOfTeamMailboxes =
|
|
||||||
mailboxContain?.isChildOfTeamMailboxes ?? false;
|
|
||||||
final isSpam = mailboxContain?.isSpam ?? false;
|
|
||||||
final isArchive = mailboxContain?.isArchive ?? false;
|
|
||||||
final isTemplates = mailboxContain?.isTemplates ?? false;
|
|
||||||
final isRead = presentationEmail.hasRead;
|
|
||||||
final isTrash = mailboxContain?.isTrash ?? false;
|
|
||||||
final canPermanentlyDelete = isDrafts || isSpam || isTrash;
|
|
||||||
final isLabelAvailable =
|
|
||||||
controller.mailboxDashBoardController.isLabelAvailable;
|
|
||||||
final listLabels =
|
|
||||||
controller.mailboxDashBoardController.labelController.labels;
|
|
||||||
final shouldShowLabelAs = isLabelAvailable && listLabels.isNotEmpty;
|
|
||||||
|
|
||||||
final listEmailActions = [
|
|
||||||
isRead ? EmailActionType.markAsUnread : EmailActionType.markAsRead,
|
|
||||||
EmailActionType.moveToMailbox,
|
|
||||||
if (shouldShowLabelAs) EmailActionType.labelAs,
|
|
||||||
canPermanentlyDelete ? EmailActionType.deletePermanently : EmailActionType.moveToTrash,
|
|
||||||
EmailActionType.openInNewTab,
|
|
||||||
if (!isDrafts && !isChildOfTeamMailboxes)
|
|
||||||
isSpam ? EmailActionType.unSpam : EmailActionType.moveToSpam,
|
|
||||||
if (!isArchive) EmailActionType.archiveMessage,
|
|
||||||
if (!isDrafts && !isTemplates) EmailActionType.editAsNewEmail,
|
|
||||||
];
|
|
||||||
|
|
||||||
if (position == null) {
|
|
||||||
final contextMenuActions = listEmailActions
|
|
||||||
.map((action) => ContextItemEmailAction(
|
|
||||||
action,
|
|
||||||
AppLocalizations.of(context),
|
|
||||||
controller.imagePaths,
|
|
||||||
category: action.category,
|
|
||||||
))
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
return controller.mailboxDashBoardController.openBottomSheetContextMenu(
|
|
||||||
context: context,
|
|
||||||
itemActions: contextMenuActions,
|
|
||||||
onContextMenuActionClick: (menuAction) {
|
|
||||||
popBack();
|
|
||||||
controller.handleEmailActionType(
|
|
||||||
menuAction.action,
|
|
||||||
presentationEmail,
|
|
||||||
mailboxContain: presentationEmail.mailboxContain,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
useGroupedActions: true,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
final submenuController = PopupSubmenuController();
|
|
||||||
|
|
||||||
final popupMenuItemEmailActions = listEmailActions.map((actionType) {
|
|
||||||
return PopupMenuItemEmailAction(
|
|
||||||
actionType,
|
|
||||||
AppLocalizations.of(context),
|
|
||||||
controller.imagePaths,
|
|
||||||
category: actionType.category,
|
|
||||||
submenu: buildLabelSubmenuForEmail(
|
|
||||||
actionType: actionType,
|
|
||||||
imagePaths: controller.imagePaths,
|
|
||||||
presentationEmail: presentationEmail,
|
|
||||||
labels: listLabels,
|
|
||||||
onSelectLabelAction: (label, isSelected) {
|
|
||||||
submenuController.hide();
|
|
||||||
popBack();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}).toList();
|
|
||||||
|
|
||||||
final popupMenuWidget = PopupMenuActionGroupWidget(
|
|
||||||
actions: popupMenuItemEmailActions,
|
|
||||||
submenuController: submenuController,
|
|
||||||
onActionSelected: (action) {
|
|
||||||
if (shouldHandleAction(action.action)) {
|
|
||||||
controller.handleEmailActionType(
|
|
||||||
action.action,
|
|
||||||
presentationEmail,
|
|
||||||
mailboxContain: mailboxContain,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
return controller.mailboxDashBoardController.openPopupMenuActionGroup(
|
|
||||||
context,
|
|
||||||
position,
|
|
||||||
popupMenuWidget,
|
|
||||||
).whenComplete(submenuController.hide);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildFeedBackWidget(BuildContext context) {
|
Widget _buildFeedBackWidget(BuildContext context) {
|
||||||
return SizedBox(
|
return SizedBox(
|
||||||
height: 60,
|
height: 60,
|
||||||
|
|||||||
Reference in New Issue
Block a user