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:model/email/email_action_type.dart';
|
||||
import 'package:labels/model/label.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/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_more_action_context_menu_mixin.dart';
|
||||
|
||||
extension HandleEmailMoreActionExtension on SearchEmailController {
|
||||
Future<void> handleEmailMoreAction(
|
||||
BuildContext context,
|
||||
PresentationEmail presentationEmail,
|
||||
RelativeRect? position,
|
||||
) {
|
||||
final mailboxContain = presentationEmail.mailboxContain;
|
||||
final isDrafts = mailboxContain?.isDrafts ?? false;
|
||||
final isSpam = mailboxContain?.isSpam ?? false;
|
||||
final isRead = presentationEmail.hasRead;
|
||||
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(
|
||||
bool isLabelAvailable,
|
||||
List<Label>? listLabels,
|
||||
) async {
|
||||
await openMoreActionContextMenu(
|
||||
EmailContextMenuParams(
|
||||
context: context,
|
||||
itemActions: contextMenuActions,
|
||||
onContextMenuActionClick: (menuAction) {
|
||||
popBack();
|
||||
pressEmailAction(
|
||||
context,
|
||||
menuAction.action,
|
||||
presentationEmail,
|
||||
mailboxContain: mailboxContain,
|
||||
);
|
||||
},
|
||||
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);
|
||||
}
|
||||
email: presentationEmail,
|
||||
imagePaths: imagePaths,
|
||||
isLabelAvailable: isLabelAvailable,
|
||||
labels: listLabels,
|
||||
position: position,
|
||||
openBottomSheetContextMenu: openBottomSheetContextMenuAction,
|
||||
openPopupMenu: (context, position, popupMenuWidget) =>
|
||||
popupMenuWidget.show(context, position),
|
||||
onHandleEmailByActionType: pressEmailAction,
|
||||
onSelectLabelAction: (label, isSelected) {},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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/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_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/mail_list_shortcut_action_view_event.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
@@ -90,7 +91,8 @@ class SearchEmailController extends BaseController
|
||||
with EmailActionController,
|
||||
DateRangePickerMixin,
|
||||
SearchLabelFilterModalMixin,
|
||||
LabelSubMenuMixin {
|
||||
LabelSubMenuMixin,
|
||||
EmailMoreActionContextMenu {
|
||||
|
||||
final networkConnectionController = Get.find<NetworkConnectionController>();
|
||||
|
||||
@@ -915,10 +917,9 @@ class SearchEmailController extends BaseController
|
||||
}
|
||||
|
||||
void pressEmailAction(
|
||||
BuildContext context,
|
||||
EmailActionType actionType,
|
||||
PresentationEmail selectedEmail,
|
||||
{required PresentationMailbox? mailboxContain}
|
||||
PresentationMailbox? mailboxContain,
|
||||
) {
|
||||
switch(actionType) {
|
||||
case EmailActionType.preview:
|
||||
@@ -929,7 +930,7 @@ class SearchEmailController extends BaseController
|
||||
}
|
||||
break;
|
||||
case EmailActionType.selection:
|
||||
selectEmail(context, selectedEmail);
|
||||
selectEmail(selectedEmail);
|
||||
break;
|
||||
case EmailActionType.markAsRead:
|
||||
markAsEmailRead(selectedEmail, ReadActions.markAsRead, MarkReadAction.tap);
|
||||
@@ -950,7 +951,11 @@ class SearchEmailController extends BaseController
|
||||
moveToTrash(selectedEmail, mailboxContain: mailboxContain);
|
||||
break;
|
||||
case EmailActionType.deletePermanently:
|
||||
deleteEmailPermanently(context, selectedEmail);
|
||||
if (currentContext != null) {
|
||||
deleteEmailPermanently(currentContext!, selectedEmail);
|
||||
} else {
|
||||
logWarning('SearchEmailController.pressEmailAction: currentContext is null');
|
||||
}
|
||||
break;
|
||||
case EmailActionType.moveToSpam:
|
||||
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
|
||||
.map((email) => email.id == presentationEmailSelected.id ? email.toggleSelect() : email)
|
||||
.toList();
|
||||
|
||||
@@ -643,10 +643,10 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
final mailboxContain = emailPreview
|
||||
.findMailboxContain(controller.mailboxDashBoardController.mapMailboxById);
|
||||
controller.pressEmailAction(
|
||||
context,
|
||||
EmailActionType.preview,
|
||||
emailPreview,
|
||||
mailboxContain: mailboxContain);
|
||||
mailboxContain,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
@@ -779,10 +779,9 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
mailboxContain: presentationEmail.mailboxContain,
|
||||
emailActionClick: (action, email) {
|
||||
controller.pressEmailAction(
|
||||
context,
|
||||
action,
|
||||
email,
|
||||
mailboxContain: presentationEmail.mailboxContain,
|
||||
presentationEmail.mailboxContain,
|
||||
);
|
||||
},
|
||||
onMoreActionClick: (email, position) =>
|
||||
@@ -790,6 +789,8 @@ class SearchEmailView extends GetWidget<SearchEmailController>
|
||||
context,
|
||||
email,
|
||||
position,
|
||||
isLabelAvailable,
|
||||
listLabels,
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -309,7 +309,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
handleEmailActionType(
|
||||
EmailActionType.preview,
|
||||
newEmail,
|
||||
mailboxContain: mailboxContain,
|
||||
mailboxContain,
|
||||
);
|
||||
mailboxDashBoardController.clearDashBoardAction();
|
||||
} else if (action is StartSearchEmailAction
|
||||
@@ -1332,9 +1332,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
void handleEmailActionType(
|
||||
EmailActionType actionType,
|
||||
PresentationEmail selectedEmail,
|
||||
{
|
||||
required PresentationMailbox? mailboxContain,
|
||||
}
|
||||
PresentationMailbox? mailboxContain,
|
||||
) {
|
||||
switch(actionType) {
|
||||
case EmailActionType.preview:
|
||||
@@ -1477,7 +1475,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
handleEmailActionType(
|
||||
EmailActionType.preview,
|
||||
presentationEmailWithRouter,
|
||||
mailboxContain: mailboxContain
|
||||
mailboxContain,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1496,7 +1494,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
handleEmailActionType(
|
||||
EmailActionType.preview,
|
||||
presentationEmailWithRouter,
|
||||
mailboxContain: mailboxContain
|
||||
mailboxContain,
|
||||
);
|
||||
} else {
|
||||
searchController.enableSearch();
|
||||
@@ -1512,7 +1510,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
handleEmailActionType(
|
||||
EmailActionType.preview,
|
||||
presentationEmailWithRouter,
|
||||
mailboxContain: mailboxContain
|
||||
mailboxContain,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1532,7 +1530,7 @@ class ThreadController extends BaseController with EmailActionController {
|
||||
handleEmailActionType(
|
||||
EmailActionType.preview,
|
||||
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/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/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/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/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/mailbox/domain/state/clear_mailbox_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_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/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/loading_more_status.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/thread_view_loading_bar_widget.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>
|
||||
with AppLoaderMixin,
|
||||
PopupMenuWidgetMixin,
|
||||
LabelSubMenuMixin {
|
||||
LabelSubMenuMixin,
|
||||
EmailMoreActionContextMenu {
|
||||
|
||||
ThreadView({Key? key}) : super(key: key);
|
||||
|
||||
@@ -660,8 +657,22 @@ class ThreadView extends GetWidget<ThreadController>
|
||||
isAINeedsActionEnabled: isAINeedsActionEnabled,
|
||||
labels: emailLabels,
|
||||
emailActionClick: _handleEmailActionClicked,
|
||||
onMoreActionClick: (email, position) =>
|
||||
_handleEmailContextMenuAction(context, email, position),
|
||||
onMoreActionClick: (email, position) async {
|
||||
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(
|
||||
actionType,
|
||||
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) {
|
||||
return SizedBox(
|
||||
height: 60,
|
||||
|
||||
Reference in New Issue
Block a user