TF-1573: Cursor auto move while typing

(cherry picked from commit 64240b7fac51d66311ee308fe6287f3ddab40ac9)
This commit is contained in:
ManhNTX
2023-03-17 10:05:12 +07:00
committed by Dat Vu
parent 362c51edb2
commit e3317ad778
2 changed files with 61 additions and 19 deletions
@@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'dart:math';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:core/core.dart'; import 'package:core/core.dart';
@@ -118,6 +119,10 @@ class ComposerController extends BaseController {
final GlobalKey<TagsEditorState> keyToEmailTagEditor = GlobalKey<TagsEditorState>(); final GlobalKey<TagsEditorState> keyToEmailTagEditor = GlobalKey<TagsEditorState>();
final GlobalKey<TagsEditorState> keyCcEmailTagEditor = GlobalKey<TagsEditorState>(); final GlobalKey<TagsEditorState> keyCcEmailTagEditor = GlobalKey<TagsEditorState>();
final GlobalKey<TagsEditorState> keyBccEmailTagEditor = GlobalKey<TagsEditorState>(); final GlobalKey<TagsEditorState> keyBccEmailTagEditor = GlobalKey<TagsEditorState>();
final GlobalKey headerEditorMobileWidgetKey = GlobalKey();
final double defaultPaddingCoordinateYCursorEditor = 8;
final double maxKeyBoardHeight = 500;
final double richTextBarHeight = 200;
FocusNode? subjectEmailInputFocusNode; FocusNode? subjectEmailInputFocusNode;
FocusNode? toAddressFocusNode; FocusNode? toAddressFocusNode;
@@ -346,7 +351,8 @@ class ComposerController extends BaseController {
editorApi, editorApi,
onEnterKeyDown: _onEnterKeyDown, onEnterKeyDown: _onEnterKeyDown,
context: context, context: context,
onFocus: _onEditorFocusOnMobile onFocus: _onEditorFocusOnMobile,
onChangeCursor: _onChangeCursorOnMobile,
); );
} }
@@ -1505,6 +1511,30 @@ class ComposerController extends BaseController {
} }
} }
void _onChangeCursorOnMobile(List<int>? 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() { void _onEnterKeyDown() {
if(scrollController.position.pixels < scrollController.position.maxScrollExtent) { if(scrollController.position.pixels < scrollController.position.maxScrollExtent) {
scrollController.animateTo( scrollController.animateTo(
@@ -467,29 +467,41 @@ class ComposerView extends GetWidget<ComposerController>
), ),
richTextController: controller.keyboardRichTextController, richTextController: controller.keyboardRichTextController,
child: SingleChildScrollView( child: SingleChildScrollView(
controller: controller.scrollController, controller: controller.scrollController,
physics: const ClampingScrollPhysics(), physics: const ClampingScrollPhysics(),
child: Column(children: [ child: Column(
Obx(() => controller.identitySelected.value != null children: [
? _buildFromEmailAddress(context) _buildHeaderEditorMobile(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),
_buildComposerEditor(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) { Widget _buildBodyTablet(BuildContext context) {
return SingleChildScrollView( return SingleChildScrollView(
controller: controller.scrollController, controller: controller.scrollController,