From 6e2f57f69be089afc8ee51e41359098fb23ce29a Mon Sep 17 00:00:00 2001 From: HuyNguyen Date: Mon, 27 Feb 2023 14:17:35 +0700 Subject: [PATCH] Add trigger scroll for destination picker and mailbox visibility screen --- .../base/base_mailbox_controller.dart | 36 +++++++++++++- .../destination_picker_controller.dart | 4 +- .../presentation/destination_picker_view.dart | 4 +- .../presentation/mailbox_controller.dart | 49 ------------------- .../mailbox/presentation/mailbox_view.dart | 3 +- .../presentation/mailbox_view_web.dart | 3 +- .../mailbox_visibility_view.dart | 8 ++- 7 files changed, 50 insertions(+), 57 deletions(-) diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index 9af1deffd..bfbead87a 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -99,7 +99,7 @@ abstract class BaseMailboxController extends BaseController { teamMailboxesTree.value = tupleTree.value3; } - void toggleMailboxFolder(MailboxNode selectedMailboxNode) { + void toggleMailboxFolder(MailboxNode selectedMailboxNode,ScrollController scrollController) { final newExpandMode = selectedMailboxNode.expandMode == ExpandMode.COLLAPSE ? ExpandMode.EXPAND : ExpandMode.COLLAPSE; @@ -112,11 +112,45 @@ abstract class BaseMailboxController extends BaseController { if (personalMailboxTree.value.updateExpandedNode(selectedMailboxNode, newExpandMode) != null) { log('toggleMailboxFolder() refresh folderMailboxTree'); personalMailboxTree.refresh(); + final _childrenItems = personalMailboxTree.value.root.childrenItems ?? []; + _triggerScrollWhenExpandMailboxFolder( + _childrenItems, + selectedMailboxNode, + scrollController); } if (teamMailboxesTree.value.updateExpandedNode(selectedMailboxNode, newExpandMode) != null) { log('toggleMailboxFolder() refresh teamMailboxesTree'); teamMailboxesTree.refresh(); + final _childrenItems = teamMailboxesTree.value.root.childrenItems ?? []; + _triggerScrollWhenExpandMailboxFolder( + _childrenItems, + selectedMailboxNode, + scrollController); + } + } + + void _triggerScrollWhenExpandMailboxFolder( + List childrenItems, + MailboxNode selectedMailboxNode, + ScrollController scrollController) async { + await Future.delayed(const Duration(milliseconds: 200)); + final _lastItem = childrenItems.last; + + if (selectedMailboxNode.expandMode == ExpandMode.COLLAPSE) { + return; + } + + if (_lastItem.mailboxNameAsString.contains(selectedMailboxNode.mailboxNameAsString)) { + scrollController.animateTo( + scrollController.position.maxScrollExtent, + duration: const Duration(milliseconds: 200), + curve: Curves.easeInToLinear); + } else { + scrollController.animateTo( + scrollController.offset + 100, + duration: const Duration(milliseconds: 200), + curve: Curves.easeInToLinear); } } diff --git a/lib/features/destination_picker/presentation/destination_picker_controller.dart b/lib/features/destination_picker/presentation/destination_picker_controller.dart index ca4e530d8..02cd5fe6a 100644 --- a/lib/features/destination_picker/presentation/destination_picker_controller.dart +++ b/lib/features/destination_picker/presentation/destination_picker_controller.dart @@ -16,8 +16,6 @@ import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; -import 'package:model/mailbox/expand_mode.dart'; -import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; @@ -80,6 +78,8 @@ class DestinationPickerController extends BaseMailboxController { List listMailboxNameAsStringExist = []; + final destinationListScrollController = ScrollController(); + DestinationPickerController( this._searchMailboxInteractor, this._createNewMailboxInteractor, diff --git a/lib/features/destination_picker/presentation/destination_picker_view.dart b/lib/features/destination_picker/presentation/destination_picker_view.dart index 987d113f0..bd507e4a0 100644 --- a/lib/features/destination_picker/presentation/destination_picker_view.dart +++ b/lib/features/destination_picker/presentation/destination_picker_view.dart @@ -207,6 +207,7 @@ class DestinationPickerView extends GetWidget ) { return SingleChildScrollView( physics: const ClampingScrollPhysics(), + controller: controller.destinationListScrollController, child: Column(children: [ if (actions?.canSearch() == true && controller.destinationScreenType.value == DestinationScreenType.destinationPicker) @@ -378,7 +379,8 @@ class DestinationPickerView extends GetWidget mailboxIdAlreadySelected: mailboxIdSelected, mailboxDisplayed: MailboxDisplayed.destinationPicker) ..addOnClickOpenMailboxNodeAction((node) => _pickMailboxNode(context, node)) - ..addOnClickExpandMailboxNodeAction((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) + ..addOnClickExpandMailboxNodeAction((mailboxNode) => + controller.toggleMailboxFolder(mailboxNode, controller.destinationListScrollController)) ).build(), children: _buildListChildTileWidget( context, diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 8ba09a82b..193b52080 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -190,55 +190,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM ); } - @override - Future toggleMailboxFolder(MailboxNode selectedMailboxNode) async { - final newExpandMode = selectedMailboxNode.expandMode == ExpandMode.COLLAPSE - ? ExpandMode.EXPAND - : ExpandMode.COLLAPSE; - - if (defaultMailboxTree.value.updateExpandedNode(selectedMailboxNode, newExpandMode) != null) { - log('toggleMailboxFolder() refresh defaultMailboxTree'); - defaultMailboxTree.refresh(); - final _childrenItems = defaultMailboxTree.value.root.childrenItems ?? []; - _triggerScrollWhenExpandMailboxFolder(_childrenItems, selectedMailboxNode); - } - - if (personalMailboxTree.value.updateExpandedNode(selectedMailboxNode, newExpandMode) != null) { - log('toggleMailboxFolder() refresh folderMailboxTree'); - personalMailboxTree.refresh(); - final _childrenItems = personalMailboxTree.value.root.childrenItems ?? []; - _triggerScrollWhenExpandMailboxFolder(_childrenItems, selectedMailboxNode); - } - - if (teamMailboxesTree.value.updateExpandedNode(selectedMailboxNode, newExpandMode) != null) { - log('toggleMailboxFolder() refresh teamMailboxesTree'); - teamMailboxesTree.refresh(); - final _childrenItems = teamMailboxesTree.value.root.childrenItems ?? []; - _triggerScrollWhenExpandMailboxFolder(_childrenItems, selectedMailboxNode); - } - } - - void _triggerScrollWhenExpandMailboxFolder(List childrenItems, MailboxNode selectedMailboxNode) async { - await Future.delayed(const Duration(milliseconds: 200)); - final _lastItem = childrenItems.last; - - if (selectedMailboxNode.expandMode == ExpandMode.COLLAPSE) { - return; - } - - if (_lastItem.mailboxNameAsString.contains(selectedMailboxNode.mailboxNameAsString)) { - mailboxListScrollController.animateTo( - mailboxListScrollController.position.maxScrollExtent, - duration: const Duration(milliseconds: 200), - curve: Curves.easeInToLinear); - } else { - mailboxListScrollController.animateTo( - mailboxListScrollController.offset + 100, - duration: const Duration(milliseconds: 200), - curve: Curves.easeInToLinear); - } - } - void handleScrollEnable() { isMailboxListScrollable.value = mailboxListScrollController.hasClients && mailboxListScrollController.position.maxScrollExtent > 0; } diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index 683b6ee65..53e157630 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -345,7 +345,8 @@ class MailboxView extends GetWidget ); }) ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) - ..addOnClickExpandMailboxNodeAction((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) + ..addOnClickExpandMailboxNodeAction((mailboxNode) => + controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController)) ..addOnSelectMailboxNodeAction((mailboxNode) => controller.selectMailboxNode(mailboxNode)) ).build()), children: _buildListChildTileWidget(context, mailboxNode) diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 31e3060da..2a4430532 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -299,7 +299,8 @@ class MailboxView extends GetWidget lastNode: lastNode, mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value) ..addOnClickOpenMailboxNodeAction((mailboxNode) => controller.openMailbox(context, mailboxNode.item)) - ..addOnClickExpandMailboxNodeAction((mailboxNode) => controller.toggleMailboxFolder(mailboxNode)) + ..addOnClickExpandMailboxNodeAction((mailboxNode) => + controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController)) ..addOnClickOpenMenuMailboxNodeAction((position, mailboxNode) { openMailboxMenuActionOnWeb( context, diff --git a/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart b/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart index e568ebfee..5e702b77f 100644 --- a/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart +++ b/lib/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart @@ -141,14 +141,18 @@ class MailboxVisibilityView extends GetWidget parent: MailBoxVisibilityFolderTileBuilder( _imagePaths, mailboxNode, - onClickExpandMailboxNodeAction: controller.toggleMailboxFolder, + onClickExpandMailboxNodeAction: (mailboxNode) { + controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController); + }, onClickSubscribeMailboxAction: controller.subscribeMailbox ), children: _buildListChildTileWidget(context, mailboxNode)).build() : MailBoxVisibilityFolderTileBuilder( _imagePaths, mailboxNode, - onClickExpandMailboxNodeAction: controller.toggleMailboxFolder, + onClickExpandMailboxNodeAction: (mailboxNode) { + controller.toggleMailboxFolder(mailboxNode, controller.mailboxListScrollController); + }, onClickSubscribeMailboxAction: controller.subscribeMailbox )) .toList() ?? [];