Add trigger scroll for destination picker and mailbox visibility screen

This commit is contained in:
HuyNguyen
2023-02-27 14:17:35 +07:00
committed by Dat Vu
parent 6a49b78e95
commit 6e2f57f69b
7 changed files with 50 additions and 57 deletions
+35 -1
View File
@@ -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<MailboxNode> 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);
}
}
@@ -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<String> listMailboxNameAsStringExist = <String>[];
final destinationListScrollController = ScrollController();
DestinationPickerController(
this._searchMailboxInteractor,
this._createNewMailboxInteractor,
@@ -207,6 +207,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
) {
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<DestinationPickerController>
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,
@@ -190,55 +190,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
);
}
@override
Future<void> 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<MailboxNode> 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;
}
@@ -345,7 +345,8 @@ class MailboxView extends GetWidget<MailboxController>
);
})
..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)
@@ -299,7 +299,8 @@ class MailboxView extends GetWidget<MailboxController>
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,
@@ -141,14 +141,18 @@ class MailboxVisibilityView extends GetWidget<MailboxVisibilityController>
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() ?? <Widget>[];