TF-3766 Change context menu style for other widgets on mobile

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-06-13 01:14:16 +07:00
committed by Dat H. Pham
parent 3dce663b98
commit 2d175633e7
36 changed files with 759 additions and 612 deletions
@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/context_item_filter_message_option_action.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
extension HandleSelectMessageFilterExtension on ThreadController {
void handleSelectMessageFilter(
BuildContext context,
FilterMessageOption selectedOption,
) {
final contextMenuActions = [
FilterMessageOption.attachments,
FilterMessageOption.unread,
FilterMessageOption.starred,
].map((filter) {
return ContextItemFilterMessageOptionAction(
filter,
selectedOption,
AppLocalizations.of(context),
imagePaths,
);
}).toList();
openBottomSheetContextMenuAction(
context: context,
itemActions: contextMenuActions,
onContextMenuActionClick: (action) => filterMessagesAction(action.action),
);
}
}
@@ -0,0 +1,26 @@
import 'package:core/presentation/resources/image_paths.dart';
import 'package:tmail_ui_user/features/base/widget/context_menu/context_menu_item_action.dart';
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class ContextItemFilterMessageOptionAction
extends ContextMenuItemActionRequiredFull<FilterMessageOption> {
final AppLocalizations appLocalizations;
final ImagePaths imagePaths;
ContextItemFilterMessageOptionAction(
super.action,
super.selectedAction,
this.appLocalizations,
this.imagePaths,
);
@override
String get actionIcon => action.getContextMenuIcon(imagePaths);
@override
String get actionName => action.getName(appLocalizations);
@override
String get selectedIcon => imagePaths.icFilterSelected;
}
@@ -28,6 +28,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_st
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.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/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';
@@ -39,7 +40,6 @@ import 'package:tmail_ui_user/features/thread/presentation/widgets/bottom_bar_th
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart'
if (dart.library.html) 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_web_builder.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/empty_emails_widget.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/filter_message_cupertino_action_sheet_action_builder.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/spam_banner/spam_report_banner_widget.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/thread_view_loading_bar_widget.dart';
@@ -84,10 +84,7 @@ class ThreadView extends GetWidget<ThreadController>
cancelEditThreadAction: controller.cancelSelectEmail,
emailSelectionAction: controller.pressEmailSelectionAction,
onContextMenuFilterEmailAction: controller.responsiveUtils.isScreenWithShortestSide(context)
? (filterOption) => controller.openContextMenuAction(
context,
_filterMessagesCupertinoActionTile(context, filterOption)
)
? (filterOption) => controller.handleSelectMessageFilter(context, filterOption)
: null,
onPopupMenuFilterEmailAction: !controller.responsiveUtils.isScreenWithShortestSide(context)
? (filterOption, position) => controller.openPopupMenuAction(
@@ -342,41 +339,6 @@ class ThreadView extends GetWidget<ThreadController>
});
}
List<Widget> _filterMessagesCupertinoActionTile(BuildContext context, FilterMessageOption optionCurrent) {
final listFilter = [
FilterMessageOption.attachments,
FilterMessageOption.unread,
FilterMessageOption.starred,
];
return listFilter.map((filter) => (FilterMessageCupertinoActionSheetActionBuilder(
Key('filter_email_${filter.name}'),
SvgPicture.asset(
filter.getContextMenuIcon(controller.imagePaths),
width: 20,
height: 20,
fit: BoxFit.fill,
colorFilter: filter == FilterMessageOption.attachments
? AppColor.colorTextButton.asFilter()
: null),
filter.getName(context),
filter,
optionCurrent: optionCurrent,
iconLeftPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(left: 12, right: 16)
: const EdgeInsets.only(right: 12),
iconRightPadding: controller.responsiveUtils.isMobile(context)
? const EdgeInsets.only(right: 12)
: EdgeInsets.zero,
actionSelected: SvgPicture.asset(
controller.imagePaths.icFilterSelected,
width: 20,
height: 20,
fit: BoxFit.fill))
..onActionClick(controller.filterMessagesAction))
.build()).toList();
}
Widget _buildResultListEmail(BuildContext context, List<PresentationEmail> listPresentationEmail) {
return listPresentationEmail.isNotEmpty
? _buildListEmailBody(context, listPresentationEmail)
@@ -685,9 +647,8 @@ class ThreadView extends GetWidget<ThreadController>
))
.toList();
controller.openContextMenuAction(
context,
[],
controller.openBottomSheetContextMenuAction(
context: context,
itemActions: contextMenuActions,
onContextMenuActionClick: (menuAction) {
controller.handleEmailActionType(
@@ -52,7 +52,7 @@ class EmptyEmailsWidget extends StatelessWidget {
Text(
key: const Key('empty_email_sub_message'),
AppLocalizations.of(context).startToComposeEmails,
style: ThemeUtils.textStyleInter400().copyWith(
style: ThemeUtils.textStyleInter400.copyWith(
letterSpacing: -0.15,
fontSize: 16,
height: 21.01 / 16,