TF-1535 Fix cannot scroll to view email list on responsive version browser

This commit is contained in:
dab246
2023-03-07 11:24:04 +07:00
committed by Dat Vu
parent e29a878dba
commit b32c859a8f
3 changed files with 100 additions and 46 deletions
@@ -299,6 +299,7 @@ class MailboxView extends GetWidget<MailboxController>
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<MailboxController>
context,
_imagePaths,
mailboxNode,
responsiveUtils: _responsiveUtils,
lastNode: lastNode,
mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value)
..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item))
@@ -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<List<PresentationEmail>>(
builder: (context, _, __,) {
return _buildMailboxItem();
},
onAccept: (emails) {
_onDragItemAccepted?.call(emails, _mailboxNode.item);
},
builder: (_, __, ___) => _buildMailboxItem(),
onAccept: (emails) => _onDragItemAccepted?.call(emails, _mailboxNode.item),
);
} else {
return _buildMailboxItem();
@@ -341,49 +341,102 @@ class ThreadView extends GetWidget<ThreadController>
key: const PageStorageKey('list_presentation_email_in_threads'),
itemExtent: _getItemExtent(context),
itemCount: listPresentationEmail.length,
itemBuilder: (context, index) {
final currentPresentationEmail = listPresentationEmail[index];
return Obx(() => Draggable<List<PresentationEmail>>(
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<List<PresentationEmail>>(
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,