diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 310ae54ae..cf634576a 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -439,6 +439,16 @@ class ThreadController extends BaseController { .build(); } + void openFilterMessagesForTablet(BuildContext context, RelativeRect? position, List popupMenuItems) async { + await showMenu( + context: context, + position: position ?? RelativeRect.fromLTRB(16, 40, 16, 16), + color: Colors.white, + elevation: 5, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), + items: popupMenuItems); + } + void closeFilterMessageActionSheet() { popBack(); } @@ -461,12 +471,6 @@ class ThreadController extends BaseController { icon: newFilterOption.getIconToast(_imagePaths)); } - void openContextMenuSelectedEmail(BuildContext context, List actionTiles) { - (ContextMenuBuilder(context) - ..addTiles(actionTiles)) - .build(); - } - void moveSelectedMultipleEmailToMailboxAction(List listEmail) async { final currentMailbox = mailboxDashBoardController.selectedMailbox.value; if (currentMailbox != null && _accountId != null) { @@ -549,16 +553,6 @@ class ThreadController extends BaseController { } } - void openPopupMenuSelectedEmail(BuildContext context, RelativeRect position, List popupMenuItems) async { - await showMenu( - context: context, - position: position, - color: Colors.white, - elevation: 5, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - items: popupMenuItems); - } - void markAsStarEmail(PresentationEmail presentationEmail) { final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value; if (_accountId != null && mailboxCurrent != null) { diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 11c911f12..f5ca1066e 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -153,11 +153,16 @@ class ThreadView extends GetWidget { controller.filterMessageOption.value) ..addOpenListMailboxActionClick(() => controller.openMailboxLeftMenu()) ..addOnEditThreadAction(() => controller.enableSelectionEmail()) - ..addOnFilterEmailAction((filterMessageOption) => - controller.openFilterMessagesCupertinoActionSheet( - context, - _filterMessagesCupertinoActionTile(context, filterMessageOption), - cancelButton: _buildCupertinoActionCancelButton(context))) + ..addOnFilterEmailAction((filterMessageOption, position) => + responsiveUtils.isMobileDevice(context) + ? controller.openFilterMessagesCupertinoActionSheet( + context, + _filterMessagesCupertinoActionTile(context, filterMessageOption), + cancelButton: _buildCupertinoActionCancelButton(context)) + : controller.openFilterMessagesForTablet( + context, + position, + _popupMenuEmailActionTile(context, filterMessageOption))) ..addOnCancelEditThread(() => controller.cancelSelectEmail())) .build(); } @@ -186,6 +191,12 @@ class ThreadView extends GetWidget { AppLocalizations.of(context).with_attachments, FilterMessageOption.attachments, optionCurrent: optionCurrent, + iconLeftPadding: responsiveUtils.isMobile(context) + ? EdgeInsets.only(left: 12, right: 16) + : EdgeInsets.only(right: 12), + iconRightPadding: responsiveUtils.isMobile(context) + ? EdgeInsets.only(right: 12) + : EdgeInsets.zero, actionSelected: SvgPicture.asset(imagePaths.icFilterSelected, fit: BoxFit.fill)) ..onActionClick((option) => controller.filterMessagesAction(context, option))) .build(); @@ -198,6 +209,12 @@ class ThreadView extends GetWidget { AppLocalizations.of(context).unread, FilterMessageOption.unread, optionCurrent: optionCurrent, + iconLeftPadding: responsiveUtils.isMobile(context) + ? EdgeInsets.only(left: 12, right: 16) + : EdgeInsets.only(right: 12), + iconRightPadding: responsiveUtils.isMobile(context) + ? EdgeInsets.only(right: 12) + : EdgeInsets.zero, actionSelected: SvgPicture.asset(imagePaths.icFilterSelected, fit: BoxFit.fill)) ..onActionClick((option) => controller.filterMessagesAction(context, option))) .build(); @@ -210,107 +227,26 @@ class ThreadView extends GetWidget { AppLocalizations.of(context).starred, FilterMessageOption.starred, optionCurrent: optionCurrent, + iconLeftPadding: responsiveUtils.isMobile(context) + ? EdgeInsets.only(left: 12, right: 16) + : EdgeInsets.only(right: 12), + iconRightPadding: responsiveUtils.isMobile(context) + ? EdgeInsets.only(right: 12) + : EdgeInsets.zero, actionSelected: SvgPicture.asset(imagePaths.icFilterSelected, fit: BoxFit.fill)) ..onActionClick((option) => controller.filterMessagesAction(context, option))) .build(); } - // Widget _buildAppBarSelectModeActive(BuildContext context) { - // return (AppBarThreadSelectModeActiveBuilder( - // context, - // imagePaths, - // controller.getListEmailSelected(), - // responsiveUtils) - // ..addCloseActionClick(() => controller.cancelSelectEmail()) - // // ..addRemoveEmailActionClick((listEmail) => {}) - // ..addOnMarkAsEmailReadActionClick((listEmail) => controller.markAsSelectedEmailRead(listEmail)) - // ..addOpenContextMenuActionClick((listEmail) => - // controller.openContextMenuSelectedEmail(context, _contextMenuEmailActionTile(context, listEmail))) - // ..addOnOpenPopupMenuActionClick((listEmail, position) => - // controller.openPopupMenuSelectedEmail(context, position, _popupMenuEmailActionTile(context, listEmail)))) - // .build(); - // } - - // List _contextMenuEmailActionTile(BuildContext context, List listEmail) { - // return [ - // // _moveToTrashAction(context, listEmail), - // _moveToMailboxAction(context, listEmail), - // _markAsReadAction(context, listEmail), - // _markAsStarAction(context, listEmail), - // // _moveToSpamAction(context, listEmail), - // SizedBox(height: 20), - // ]; - // } - - // Widget _markAsReadAction(BuildContext context, List listEmail) { - // return (EmailContextMenuActionBuilder( - // Key('mark_as_read_context_menu_action'), - // SvgPicture.asset(imagePaths.icEyeDisable, width: 24, height: 24, fit: BoxFit.fill), - // controller.isAllEmailRead(listEmail) - // ? AppLocalizations.of(context).mark_as_unread - // : AppLocalizations.of(context).mark_as_read, - // listEmail) - // ..onActionClick((data) => controller.markAsSelectedEmailRead(data, fromContextMenuAction: true))) - // .build(); - // } - - // Widget _moveToTrashAction(BuildContext context, List listEmail) { - // return (EmailContextMenuActionBuilder( - // Key('move_to_trash_context_menu_action'), - // SvgPicture.asset(imagePaths.icTrash, width: 24, height: 24, fit: BoxFit.fill), - // AppLocalizations.of(context).move_to_trash, - // listEmail) - // ..onActionClick((data) => {})) - // .build(); - // } - - // Widget _moveToMailboxAction(BuildContext context, List listEmail) { - // return (EmailContextMenuActionBuilder( - // Key('move_to_mailbox_context_menu_action'), - // SvgPicture.asset(imagePaths.icFolder, width: 24, height: 24, fit: BoxFit.fill), - // AppLocalizations.of(context).move_to_mailbox, - // listEmail) - // ..onActionClick((data) => controller.moveSelectedMultipleEmailToMailboxAction(data))) - // .build(); - // } - // - // Widget _markAsStarAction(BuildContext context, List listEmail) { - // final markStarAction = controller.isAllEmailMarkAsStar(listEmail) ? MarkStarAction.unMarkStar : MarkStarAction.markStar; - // - // return (EmailContextMenuActionBuilder( - // Key('mark_as_star_context_menu_action'), - // SvgPicture.asset( - // markStarAction == MarkStarAction.markStar ? imagePaths.icFlag : imagePaths.icFlagged, - // width: 24, - // height: 24, - // fit: BoxFit.fill), - // markStarAction == MarkStarAction.markStar - // ? AppLocalizations.of(context).mark_as_star - // : AppLocalizations.of(context).mark_as_unstar, - // listEmail) - // ..onActionClick((data) => controller.markAsStarSelectedMultipleEmail(data, markStarAction))) - // .build(); - // } - - // Widget _moveToSpamAction(BuildContext context, List listEmail) { - // return (EmailContextMenuActionBuilder( - // Key('move_to_spam_context_menu_action'), - // SvgPicture.asset(imagePaths.icMailboxSpam, width: 24, height: 24, fit: BoxFit.fill), - // AppLocalizations.of(context).move_to_spam, - // listEmail) - // ..onActionClick((data) => {})) - // .build(); - // } - - // List _popupMenuEmailActionTile(BuildContext context, List listEmail) { - // return [ - // // PopupMenuItem(child: _moveToTrashAction(context, listEmail)), - // PopupMenuItem(child: _moveToMailboxAction(context, listEmail)), - // PopupMenuItem(child: _markAsReadAction(context, listEmail)), - // PopupMenuItem(child: _markAsStarAction(context, listEmail)), - // // PopupMenuItem(child: _moveToSpamAction(context, listEmail)), - // ]; - // } + List _popupMenuEmailActionTile(BuildContext context, FilterMessageOption option) { + return [ + PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _filterMessageWithAttachmentsAction(context, option)), + PopupMenuDivider(height: 0.5), + PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _filterMessagesUnreadAction(context, option)), + PopupMenuDivider(height: 0.5), + PopupMenuItem(padding: EdgeInsets.symmetric(horizontal: 8), child: _filterMessageStarredAction(context, option)), + ]; + } Widget _buildLoadingView() { return Obx(() => controller.viewState.value.fold( diff --git a/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart b/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart index 52b6c280d..33bfb8a33 100644 --- a/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart +++ b/lib/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart @@ -7,7 +7,7 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/thread/presentation/model/filter_message_option.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; -typedef OnFilterEmailAction = void Function(FilterMessageOption); +typedef OnFilterEmailAction = void Function(FilterMessageOption, RelativeRect? position); typedef OnEditThreadAction = void Function(); typedef OnOpenListMailboxActionClick = void Function(); typedef OnCancelEditThread = void Function(); @@ -75,10 +75,10 @@ class AppBarThreadWidgetBuilder { _filterMessageOption.getTitle(_context).isNotEmpty ? Column(mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( - padding: EdgeInsets.only(left: 60, right: 40), + padding: EdgeInsets.only(left: 40, right: 40), child: _buildContentCenterAppBar()), Transform( - transform: Matrix4.translationValues(-2.0, -8.0, 0.0), + transform: Matrix4.translationValues(_responsiveUtils.isDesktop(_context) ? -2.0 : -16.0, -8.0, 0.0), child: Text( _filterMessageOption.getTitle(_context), style: TextStyle(fontSize: 11, color: AppColor.colorContentEmail))) @@ -115,16 +115,32 @@ class AppBarThreadWidgetBuilder { borderRadius: BorderRadius.circular(12), color: Colors.transparent, child: Padding( - padding: EdgeInsets.only(left: 16), - child: IconButton( - icon: SvgPicture.asset( + padding: EdgeInsets.only(left: 16, right: 16), + child: GestureDetector( + onTap: () { + if (_onFilterEmailAction != null && _responsiveUtils.isMobileDevice(_context)) { + _onFilterEmailAction!.call(_filterMessageOption, null); + } + }, + child: SvgPicture.asset( _imagePaths.icFilter, color: _filterMessageOption == FilterMessageOption.all - ? AppColor.colorFilterMessageDisabled - : AppColor.colorFilterMessageEnabled, + ? AppColor.colorFilterMessageDisabled + : AppColor.colorFilterMessageEnabled, fit: BoxFit.fill), - onPressed: () => _onFilterEmailAction?.call(_filterMessageOption) - ) + onTapDown: (detail) { + if (_onFilterEmailAction != null && !_responsiveUtils.isMobileDevice(_context)) { + final screenSize = MediaQuery.of(_context).size; + final offset = detail.globalPosition; + final position = RelativeRect.fromLTRB( + offset.dx, + offset.dy, + screenSize.width - offset.dx, + screenSize.height - offset.dy, + ); + _onFilterEmailAction!.call(_filterMessageOption, position); + } + }) ) ); } @@ -164,7 +180,7 @@ class AppBarThreadWidgetBuilder { GestureDetector( onTap: () => !_responsiveUtils.isDesktop(_context) ? _onOpenListMailboxActionClick?.call() : null, child: Padding( - padding: EdgeInsets.zero, + padding: !_responsiveUtils.isDesktop(_context) ? EdgeInsets.zero : EdgeInsets.only(bottom: 8, top: 8), child: Container( padding: EdgeInsets.zero, margin: EdgeInsets.zero, diff --git a/lib/features/thread/presentation/widgets/filter_message_cupertino_action_sheet_action_builder.dart b/lib/features/thread/presentation/widgets/filter_message_cupertino_action_sheet_action_builder.dart index ec6d5eba1..e296e36e8 100644 --- a/lib/features/thread/presentation/widgets/filter_message_cupertino_action_sheet_action_builder.dart +++ b/lib/features/thread/presentation/widgets/filter_message_cupertino_action_sheet_action_builder.dart @@ -11,6 +11,8 @@ class FilterMessageCupertinoActionSheetActionBuilder extends CupertinoActionShee final FilterMessageOption? optionCurrent; final SvgPicture? actionSelected; final Color? bgColor; + final EdgeInsets? iconLeftPadding; + final EdgeInsets? iconRightPadding; FilterMessageCupertinoActionSheetActionBuilder( Key key, @@ -21,6 +23,8 @@ class FilterMessageCupertinoActionSheetActionBuilder extends CupertinoActionShee this.optionCurrent, this.actionSelected, this.bgColor, + this.iconLeftPadding, + this.iconRightPadding, } ) : super(key, actionIcon, actionName); @@ -32,12 +36,12 @@ class FilterMessageCupertinoActionSheetActionBuilder extends CupertinoActionShee key: key, child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( - padding: EdgeInsets.only(left: 12, right: 16), + padding: iconLeftPadding ?? EdgeInsets.only(left: 12, right: 16), child: actionIcon), Expanded(child: Text(actionName, textAlign: TextAlign.left, style: actionTextStyle())), if (optionCurrent == option && actionSelected != null) Padding( - padding: EdgeInsets.only(right: 12), + padding: iconRightPadding ?? EdgeInsets.only(right: 12), child: actionSelected!), ]), onPressed: () {