From e3317ad778969d14c1ad1e07378b3a9cc4092d21 Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Fri, 17 Mar 2023 10:05:12 +0700 Subject: [PATCH] TF-1573: Cursor auto move while typing (cherry picked from commit 64240b7fac51d66311ee308fe6287f3ddab40ac9) --- .../presentation/composer_controller.dart | 32 ++++++++++++- .../composer/presentation/composer_view.dart | 48 ++++++++++++------- 2 files changed, 61 insertions(+), 19 deletions(-) diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index c4a44251d..240f4c72b 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:io'; +import 'dart:math'; import 'package:collection/collection.dart'; import 'package:core/core.dart'; @@ -118,6 +119,10 @@ class ComposerController extends BaseController { final GlobalKey keyToEmailTagEditor = GlobalKey(); final GlobalKey keyCcEmailTagEditor = GlobalKey(); final GlobalKey keyBccEmailTagEditor = GlobalKey(); + final GlobalKey headerEditorMobileWidgetKey = GlobalKey(); + final double defaultPaddingCoordinateYCursorEditor = 8; + final double maxKeyBoardHeight = 500; + final double richTextBarHeight = 200; FocusNode? subjectEmailInputFocusNode; FocusNode? toAddressFocusNode; @@ -346,7 +351,8 @@ class ComposerController extends BaseController { editorApi, onEnterKeyDown: _onEnterKeyDown, context: context, - onFocus: _onEditorFocusOnMobile + onFocus: _onEditorFocusOnMobile, + onChangeCursor: _onChangeCursorOnMobile, ); } @@ -1505,6 +1511,30 @@ class ComposerController extends BaseController { } } + void _onChangeCursorOnMobile(List? coordinates) { + + final headerEditorMobileWidgetRenderObject = headerEditorMobileWidgetKey.currentContext?.findRenderObject(); + + if (headerEditorMobileWidgetRenderObject is RenderBox?) { + final headerEditorMobileSize = headerEditorMobileWidgetRenderObject?.size; + if (coordinates?[1] != null && coordinates?[1] != 0) { + final coordinateY = max((coordinates?[1] ?? 0) - defaultPaddingCoordinateYCursorEditor, 0); + final realCoordinateY = coordinateY + (headerEditorMobileSize?.height ?? 0); + if (scrollController.position.pixels >= realCoordinateY) { + scrollController.jumpTo( + realCoordinateY.toDouble() - (headerEditorMobileSize?.height ?? 0) / 2, + ); + } + + if ((realCoordinateY) >= max(Get.height - maxKeyBoardHeight - richTextBarHeight, 0) + scrollController.position.pixels) { + scrollController.jumpTo( + realCoordinateY.toDouble(), + ); + } + } + } + } + void _onEnterKeyDown() { if(scrollController.position.pixels < scrollController.position.maxScrollExtent) { scrollController.animateTo( diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index 97adea488..d9ff3d8f8 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -467,29 +467,41 @@ class ComposerView extends GetWidget ), richTextController: controller.keyboardRichTextController, child: SingleChildScrollView( - controller: controller.scrollController, - physics: const ClampingScrollPhysics(), - child: Column(children: [ - Obx(() => controller.identitySelected.value != null - ? _buildFromEmailAddress(context) - : const SizedBox.shrink()), - Obx(() => controller.identitySelected.value != null - ? const Divider(color: AppColor.colorDividerComposer, height: 1) - : const SizedBox.shrink()), - _buildEmailAddress(context), - const Divider(color: AppColor.colorDividerComposer, height: 1), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - child: _buildSubjectEmail(context)), - const Divider(color: AppColor.colorDividerComposer, height: 1), - _buildAttachmentsWidget(context), - buildInlineLoadingView(controller), + controller: controller.scrollController, + physics: const ClampingScrollPhysics(), + child: Column( + children: [ + _buildHeaderEditorMobile(context), _buildComposerEditor(context), - ]) + SizedBox(height: controller.maxKeyBoardHeight), + ], + ), ), ); } + Widget _buildHeaderEditorMobile(BuildContext context) { + return Column( + key: controller.headerEditorMobileWidgetKey, + children: [ + Obx(() => controller.identitySelected.value != null + ? _buildFromEmailAddress(context) + : const SizedBox.shrink()), + Obx(() => controller.identitySelected.value != null + ? const Divider(color: AppColor.colorDividerComposer, height: 1) + : const SizedBox.shrink()), + _buildEmailAddress(context), + const Divider(color: AppColor.colorDividerComposer, height: 1), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: _buildSubjectEmail(context)), + const Divider(color: AppColor.colorDividerComposer, height: 1), + _buildAttachmentsWidget(context), + buildInlineLoadingView(controller), + ], + ); + } + Widget _buildBodyTablet(BuildContext context) { return SingleChildScrollView( controller: controller.scrollController,