From 41e8ed6d67f558a854de5e48cec05286bab962b1 Mon Sep 17 00:00:00 2001 From: Wayne Tee Date: Mon, 24 Feb 2025 15:54:15 +0800 Subject: [PATCH] Fix selection shifting when deleting paragraphs on android --- packages/lexical/src/LexicalEvents.ts | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/packages/lexical/src/LexicalEvents.ts b/packages/lexical/src/LexicalEvents.ts index b373f905a95..49ab106c912 100644 --- a/packages/lexical/src/LexicalEvents.ts +++ b/packages/lexical/src/LexicalEvents.ts @@ -622,6 +622,41 @@ function onBeforeInput(event: InputEvent, editor: LexicalEditor): void { } if (!shouldLetBrowserHandleDelete) { dispatchCommand(editor, DELETE_CHARACTER_COMMAND, true); + + // When deleting across paragraphs, Chrome on Android incorrectly shifts the selection rightwards + // We detect this and restore the selection accordingly + const selectionAfterDelete = $getSelection(); + if ( + IS_ANDROID_CHROME && + $isRangeSelection(selectionAfterDelete) && + selectionAfterDelete.isCollapsed() + ) { + setTimeout(() => + editor.update(() => { + // Verify that selection has shifted rightwards + const newSelection = $getSelection(); + if ( + !$isRangeSelection(newSelection) || + !newSelection.isCollapsed() + ) { + return; + } + const newAnchor = newSelection.anchor; + const newAnchorSibling = newAnchor + .getNode() + .getPreviousSibling(); + const prevAnchor = selectionAfterDelete.anchor; + if ( + (newAnchor.key === prevAnchor.key && + newAnchor.offset === prevAnchor.offset + 1) || // Rightward shift in same node + (newAnchor.offset === 1 && + prevAnchor.getNode().is(newAnchorSibling)) // Rightward shift into sibling node + ) { + $setSelection(selectionAfterDelete.clone()); // Restore selection if shifted + } + }), + ); + } } } return;