From 37dc409b609db876b1054e2d391612df1ea0837d Mon Sep 17 00:00:00 2001 From: Ammar Ahmed Date: Mon, 28 Apr 2025 11:22:21 +0500 Subject: [PATCH] mobile: fix cursor bug on ios --- .../editor/tiptap/use-editor-events.tsx | 2 +- .../editor-mobile/src/components/tiptap.tsx | 6 +++- .../src/hooks/useEditorController.ts | 35 +++---------------- .../extensions/keep-in-view/keep-in-view.ts | 2 +- 4 files changed, 12 insertions(+), 33 deletions(-) diff --git a/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx b/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx index 5ebc74a05..640270fea 100644 --- a/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx +++ b/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx @@ -177,7 +177,7 @@ export const useEditorEvents = ( useEffect(() => { const handleKeyboardDidShow: KeyboardEventListener = () => { editor.commands.keyboardShown(true); - //editor.postMessage(NativeEvents.keyboardShown, undefined); + editor.postMessage(NativeEvents.keyboardShown, undefined); }; const handleKeyboardDidHide: KeyboardEventListener = () => { editor.commands.keyboardShown(false); diff --git a/packages/editor-mobile/src/components/tiptap.tsx b/packages/editor-mobile/src/components/tiptap.tsx index b1f91f210..ed5b02bfa 100644 --- a/packages/editor-mobile/src/components/tiptap.tsx +++ b/packages/editor-mobile/src/components/tiptap.tsx @@ -43,7 +43,11 @@ export default function TiptapEditorWrapper(props: { sx={{ display: props.settings.noToolbar ? "none" : "flex", overflowY: "hidden", - minHeight: "50px" + minHeight: "50px", + position: "absolute", + bottom: 0, + left: 0, + right: 0 }} editor={editor} location="bottom" diff --git a/packages/editor-mobile/src/hooks/useEditorController.ts b/packages/editor-mobile/src/hooks/useEditorController.ts index edd32a564..aca0e3a44 100644 --- a/packages/editor-mobile/src/hooks/useEditorController.ts +++ b/packages/editor-mobile/src/hooks/useEditorController.ts @@ -18,6 +18,7 @@ along with this program. If not, see . */ import { Editor, scrollIntoViewById } from "@notesnook/editor"; +import { keepLastLineInView } from "@notesnook/editor/extensions/keep-in-view/keep-in-view.js"; import { strings } from "@notesnook/intl"; import { ThemeDefinition, @@ -66,38 +67,12 @@ type Timers = { scroll: NodeJS.Timeout | null; }; -function isInViewport(element: any) { - const rect = element.getBoundingClientRect(); - return ( - rect.top >= 0 && - rect.left >= 0 && - rect.bottom <= - (window.innerHeight || document.documentElement.clientHeight) && - rect.right <= (window.innerWidth || document.documentElement.clientWidth) - ); -} - function scrollIntoView(editor: Editor) { + if (__PLATFORM__ == "android") return; setTimeout(() => { - try { - const node = editor?.state.selection.$from; - const dom = node ? editor?.view?.domAtPos?.(node.pos) : null; - let domNode = dom?.node; - - if (domNode) { - if (domNode.nodeType === Node.TEXT_NODE && domNode.parentNode) { - domNode = domNode.parentNode; - } - if (isInViewport(domNode)) return; - (domNode as HTMLElement).scrollIntoView({ - behavior: "smooth", - block: "end" - }); - } - } catch (e) { - /* empty */ - } - }, 100); + if (!editor.isFocused) return; + keepLastLineInView(editor); + }, 1); } export type EditorController = { diff --git a/packages/editor/src/extensions/keep-in-view/keep-in-view.ts b/packages/editor/src/extensions/keep-in-view/keep-in-view.ts index 8d862ae8a..a2b6f5e16 100644 --- a/packages/editor/src/extensions/keep-in-view/keep-in-view.ts +++ b/packages/editor/src/extensions/keep-in-view/keep-in-view.ts @@ -71,7 +71,7 @@ export const KeepInView = Extension.create< export function keepLastLineInView( editor: Editor, - THRESHOLD = 80, + THRESHOLD = 90, SCROLL_THRESHOLD = 100 ) { if (