diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 9c5029b3e..153bf33d9 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -1162,4 +1162,25 @@ class MailboxController extends BaseMailboxController { _cancelSelectMailbox(); mailboxDashBoardController.closeMailboxMenuDrawer(); } + + void autoScrollTop() { + mailboxListScrollController.animateTo( + mailboxListScrollController.position.minScrollExtent, + duration: const Duration(seconds: 1), + curve: Curves.easeInToLinear); + } + + void autoScrollBottom() { + mailboxListScrollController.animateTo( + mailboxListScrollController.position.maxScrollExtent, + duration: const Duration(seconds: 1), + curve: Curves.easeInToLinear); + } + + void stopAutoScroll() { + mailboxListScrollController.animateTo( + mailboxListScrollController.offset, + duration: const Duration(milliseconds: 300), + curve: Curves.fastOutSlowIn); + } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 498773ef8..7942573cd 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -150,50 +150,72 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu } Widget _buildListMailbox(BuildContext context) { - return SingleChildScrollView( - controller: controller.mailboxListScrollController, - key: const PageStorageKey('mailbox_list'), - physics: const ClampingScrollPhysics(), - padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 16 : 0), - child: Column(children: [ - Obx(() { - if (controller.isSelectionEnabled() || _responsiveUtils.isDesktop(context)) { - return const SizedBox.shrink(); - } - return _buildUserInformation(context); - }), - _buildLoadingView(), - AppConfig.appGridDashboardAvailable && _responsiveUtils.isWebNotDesktop(context) - ? Column(children: [ - _buildAppGridDashboard(context), - const SizedBox(height: 8), - const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2), - const SizedBox(height: 8), - ]) - : const SizedBox.shrink(), - Obx(() => controller.defaultMailboxHasChild - ? _buildMailboxCategory(context, MailboxCategories.exchange, controller.defaultRootNode) - : const SizedBox.shrink()), - const SizedBox(height: 8), - const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2), - const SizedBox(height: 8), - _buildHeaderMailboxCategory(context, MailboxCategories.folders), - Row(children: [ - Expanded(child: _buildSearchBarWidget(context)), - Padding( - padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 0 : 12), - child: buildIconWeb( - minSize: 40, - iconPadding: EdgeInsets.zero, - splashRadius: 15, - icon: SvgPicture.asset(_imagePaths.icAddNewFolder, color: AppColor.colorTextButton, fit: BoxFit.fill), - tooltip: AppLocalizations.of(context).new_mailbox, - onTap: () => controller.goToCreateNewMailboxView(context))), - ]), - Obx(() => controller.folderMailboxHasChild - ? _buildMailboxCategory(context, MailboxCategories.folders, controller.folderRootNode) - : const SizedBox.shrink()), - ]) + return Stack( + children: [ + SingleChildScrollView( + controller: controller.mailboxListScrollController, + key: const PageStorageKey('mailbox_list'), + physics: const ClampingScrollPhysics(), + padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 16 : 0), + child: Column(children: [ + Obx(() { + if (controller.isSelectionEnabled() || _responsiveUtils.isDesktop(context)) { + return const SizedBox.shrink(); + } + return _buildUserInformation(context); + }), + _buildLoadingView(), + AppConfig.appGridDashboardAvailable && _responsiveUtils.isWebNotDesktop(context) + ? Column(children: [ + _buildAppGridDashboard(context), + const SizedBox(height: 8), + const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2), + const SizedBox(height: 8), + ]) + : const SizedBox.shrink(), + Obx(() => controller.defaultMailboxHasChild + ? _buildMailboxCategory(context, MailboxCategories.exchange, controller.defaultRootNode) + : const SizedBox.shrink()), + const SizedBox(height: 8), + const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2), + const SizedBox(height: 8), + _buildHeaderMailboxCategory(context, MailboxCategories.folders), + Row(children: [ + Expanded(child: _buildSearchBarWidget(context)), + Padding( + padding: EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 0 : 12), + child: buildIconWeb( + minSize: 40, + iconPadding: EdgeInsets.zero, + splashRadius: 15, + icon: SvgPicture.asset(_imagePaths.icAddNewFolder, color: AppColor.colorTextButton, fit: BoxFit.fill), + tooltip: AppLocalizations.of(context).new_mailbox, + onTap: () => controller.goToCreateNewMailboxView(context))), + ]), + Obx(() => controller.folderMailboxHasChild + ? _buildMailboxCategory(context, MailboxCategories.folders, controller.folderRootNode) + : const SizedBox.shrink()), + ]) + ), + Obx(() => controller.mailboxDashBoardController.isDraggingMailbox + ? Align( + alignment: Alignment.topCenter, + child: InkWell( + onTap: () {}, + onHover: (value) => value ? controller.autoScrollTop() : controller.stopAutoScroll(), + child: Container( + height: 40))) + : const SizedBox.shrink()), + Obx(() => controller.mailboxDashBoardController.isDraggingMailbox + ? Align( + alignment: Alignment.bottomCenter, + child: InkWell( + onTap: () {}, + onHover: (value) => value ? controller.autoScrollBottom() : controller.stopAutoScroll(), + child: Container( + height: 40))) + : const SizedBox.shrink()), + ], ); } diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 7af54b6f8..0200b9604 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -155,6 +155,7 @@ class MailboxDashBoardController extends ReloadableController { final viewStateMarkAsReadMailbox = Rx>(Right(UIState.idle)); final vacationResponse = Rxn(); final routerParameters = Rxn>(); + final _isDraggingMailbox = RxBool(false); Session? sessionCurrent; Map mapDefaultMailboxIdByRole = {}; Map mapMailboxById = {}; @@ -1541,6 +1542,12 @@ class MailboxDashBoardController extends ReloadableController { spamReportController.storeSpamReportStateAction(_storeSpamReportState); } + void onDragMailbox(bool isDragging) { + _isDraggingMailbox.value = isDragging; + } + + bool get isDraggingMailbox => _isDraggingMailbox.value; + @override void onClose() { _emailReceiveManager.closeEmailReceiveManagerStream(); diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index f91b7a1ec..aad2da231 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -965,4 +965,8 @@ class ThreadController extends BaseController with EmailActionController { } _navigationRouter = null; } + + void onDragMailBox(bool isDrag) { + mailboxDashBoardController.onDragMailbox(isDrag); + } } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 8266ac524..596d7878e 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -373,7 +373,10 @@ class ThreadView extends GetWidget dragAnchorStrategy: pointerDragAnchorStrategy, onDragStarted: () { controller.calculateDragValue(currentPresentationEmail); + controller.onDragMailBox(true); }, + onDragEnd: (_) => controller.onDragMailBox(false), + onDraggableCanceled: (_,__) => controller.onDragMailBox(false), )); }), )