From b32c859a8f45306ff84ea1383c6b8b79402cc168 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 7 Mar 2023 11:24:04 +0700 Subject: [PATCH] TF-1535 Fix cannot scroll to view email list on responsive version browser --- .../presentation/mailbox_view_web.dart | 2 + .../widgets/mailbox_folder_tile_builder.dart | 13 +- .../thread/presentation/thread_view.dart | 131 ++++++++++++------ 3 files changed, 100 insertions(+), 46 deletions(-) diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index da0cc45a3..37cc6604a 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -299,6 +299,7 @@ class MailboxView extends GetWidget context, _imagePaths, mailboxNode, + responsiveUtils: _responsiveUtils, lastNode: lastNode, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value) ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) @@ -324,6 +325,7 @@ class MailboxView extends GetWidget context, _imagePaths, mailboxNode, + responsiveUtils: _responsiveUtils, lastNode: lastNode, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value) ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) diff --git a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart index d212a8cbb..7c0923869 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -1,5 +1,6 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/utils/style_utils.dart'; import 'package:core/presentation/views/button/icon_button_web.dart'; import 'package:core/utils/build_utils.dart'; @@ -22,6 +23,7 @@ class MailBoxFolderTileBuilder { final MailboxNode _mailboxNode; final BuildContext _context; final ImagePaths _imagePaths; + final ResponsiveUtils? responsiveUtils; final SelectMode allSelectMode; final MailboxDisplayed mailboxDisplayed; final MailboxNode? lastNode; @@ -48,6 +50,7 @@ class MailBoxFolderTileBuilder { this.lastNode, this.mailboxNodeSelected, this.mailboxActions, + this.responsiveUtils, this.mailboxIdAlreadySelected } ); @@ -77,14 +80,10 @@ class MailBoxFolderTileBuilder { } Widget build() { - if (BuildUtils.isWeb) { + if (responsiveUtils?.isWebDesktop(_context) == true && mailboxDisplayed == MailboxDisplayed.mailbox) { return DragTarget>( - builder: (context, _, __,) { - return _buildMailboxItem(); - }, - onAccept: (emails) { - _onDragItemAccepted?.call(emails, _mailboxNode.item); - }, + builder: (_, __, ___) => _buildMailboxItem(), + onAccept: (emails) => _onDragItemAccepted?.call(emails, _mailboxNode.item), ); } else { return _buildMailboxItem(); diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 1ad7821b3..4b4c6a340 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -341,49 +341,102 @@ class ThreadView extends GetWidget key: const PageStorageKey('list_presentation_email_in_threads'), itemExtent: _getItemExtent(context), itemCount: listPresentationEmail.length, - itemBuilder: (context, index) { - final currentPresentationEmail = listPresentationEmail[index]; - return Obx(() => Draggable>( - maxSimultaneousDrags: kIsWeb ? null : 0, - data: controller.listEmailDrag, - feedback: _buildFeedBackWidget(context), - childWhenDragging: (EmailTileBuilder( - context, - currentPresentationEmail, - controller.mailboxDashBoardController.currentSelectMode.value, - controller.searchQuery, - controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id, - mailboxContain: currentPresentationEmail.mailboxContain, - isSearchEmailRunning: controller.searchController.isSearchEmailRunning, - isDrag: true) - ).build(), - dragAnchorStrategy: pointerDragAnchorStrategy, - onDragStarted: () { - controller.calculateDragValue(currentPresentationEmail); - controller.onDragMailBox(true); - }, - onDragEnd: (_) => controller.onDragMailBox(false), - onDraggableCanceled: (_,__) => controller.onDragMailBox(false), - child: (EmailTileBuilder( - context, - currentPresentationEmail, - controller.mailboxDashBoardController.currentSelectMode.value, - controller.searchQuery, - controller.mailboxDashBoardController.selectedEmail.value?.id == currentPresentationEmail.id, - mailboxContain: currentPresentationEmail.mailboxContain, - isSearchEmailRunning: controller.searchController.isSearchEmailRunning) - ..addOnPressEmailActionClick((action, email) => - controller.pressEmailAction(context, action, email, mailboxContain: currentPresentationEmail.mailboxContain)) - ..addOnMoreActionClick((email, position) => _responsiveUtils.isScreenWithShortestSide(context) - ? controller.openContextMenuAction(context, _contextMenuActionTile(context, email)) - : controller.openPopupMenuAction(context, position, _popupMenuActionTile(context, email))) - ).build(), - )); - }), + itemBuilder: (context, index) => Obx(() => _buildEmailItem(context, listPresentationEmail[index])) + ), ) ); } + Widget _buildEmailItem(BuildContext context, PresentationEmail presentationEmail) { + if (_responsiveUtils.isWebDesktop(context)) { + return _buildEmailItemDraggable(context, presentationEmail); + } else { + return _buildEmailItemNotDraggable(context, presentationEmail); + } + } + + Widget _buildEmailItemDraggable(BuildContext context, PresentationEmail presentationEmail) { + return Draggable>( + data: controller.listEmailDrag, + feedback: _buildFeedBackWidget(context), + childWhenDragging: _buildEmailItemWhenDragging(context, presentationEmail), + dragAnchorStrategy: pointerDragAnchorStrategy, + onDragStarted: () { + controller.calculateDragValue(presentationEmail); + controller.onDragMailBox(true); + }, + onDragEnd: (_) => controller.onDragMailBox(false), + onDraggableCanceled: (_,__) => controller.onDragMailBox(false), + child: _buildEmailItemNotDraggable(context, presentationEmail) + ); + } + + Widget _buildEmailItemWhenDragging(BuildContext context, PresentationEmail presentationEmail) { + final isShowingEmailContent = controller.mailboxDashBoardController.selectedEmail.value?.id == presentationEmail.id; + final selectModeAll = controller.mailboxDashBoardController.currentSelectMode.value; + + return (EmailTileBuilder( + context, + presentationEmail, + selectModeAll, + controller.searchQuery, + isShowingEmailContent, + mailboxContain: presentationEmail.mailboxContain, + isSearchEmailRunning: controller.searchController.isSearchEmailRunning, + isDrag: true + )).build(); + } + + Widget _buildEmailItemNotDraggable(BuildContext context, PresentationEmail presentationEmail) { + final isShowingEmailContent = controller.mailboxDashBoardController.selectedEmail.value?.id == presentationEmail.id; + final selectModeAll = controller.mailboxDashBoardController.currentSelectMode.value; + + return (EmailTileBuilder( + context, + presentationEmail, + selectModeAll, + controller.searchQuery, + isShowingEmailContent, + mailboxContain: presentationEmail.mailboxContain, + isSearchEmailRunning: controller.searchController.isSearchEmailRunning + ) + ..addOnPressEmailActionClick((action, email) => _handleEmailActionClicked(context, email, action)) + ..addOnMoreActionClick((email, position) => _handleEmailContextMenuAction(context, email, position)) + ).build(); + } + + void _handleEmailActionClicked( + BuildContext context, + PresentationEmail presentationEmail, + EmailActionType actionType + ) { + controller.pressEmailAction( + context, + actionType, + presentationEmail, + mailboxContain: presentationEmail.mailboxContain + ); + } + + void _handleEmailContextMenuAction( + BuildContext context, + PresentationEmail presentationEmail, + RelativeRect? position + ) { + if (_responsiveUtils.isScreenWithShortestSide(context)) { + controller.openContextMenuAction( + context, + _contextMenuActionTile(context, presentationEmail) + ); + } else { + controller.openPopupMenuAction( + context, + position, + _popupMenuActionTile(context, presentationEmail) + ); + } + } + Widget _buildFeedBackWidget(BuildContext context) { return SizedBox( height: 60,