From efb6cc2d4bf6332eb156709795d2b3a649198b65 Mon Sep 17 00:00:00 2001 From: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Date: Fri, 17 Jul 2026 19:56:07 +0800 Subject: [PATCH] fix(session-ui): preserve prompt editing behavior (#37483) --- .../src/v2/components/prompt-input/index.tsx | 8 ++++++-- .../v2/components/prompt-input/interaction.ts | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/session-ui/src/v2/components/prompt-input/index.tsx b/packages/session-ui/src/v2/components/prompt-input/index.tsx index fb0e803744..ff33de56a8 100644 --- a/packages/session-ui/src/v2/components/prompt-input/index.tsx +++ b/packages/session-ui/src/v2/components/prompt-input/index.tsx @@ -45,6 +45,10 @@ export function PromptInputV2(props: PromptInputV2Props) { const view = props.controller.view let editor: HTMLDivElement | undefined let localInput = false + const updateCursor = () => { + if (!editor || !window.getSelection()?.isCollapsed) return + props.controller.onCursor(promptInputV2Cursor(editor)) + } const mode = createMemo(() => state.mode) const buttons = createMemo(() => ({ opacity: mode() === "normal" ? 1 : 0, @@ -162,8 +166,8 @@ export function PromptInputV2(props: PromptInputV2Props) { props.controller.submit() } }} - onKeyUp={(event) => props.controller.onCursor(promptInputV2Cursor(event.currentTarget))} - onPointerUp={(event) => props.controller.onCursor(promptInputV2Cursor(event.currentTarget))} + onKeyUp={updateCursor} + onPointerUp={updateCursor} onPaste={props.controller.onPaste} onFocus={() => props.controller.dispatch({ type: "focus.editor" })} /> diff --git a/packages/session-ui/src/v2/components/prompt-input/interaction.ts b/packages/session-ui/src/v2/components/prompt-input/interaction.ts index 6fc54f6468..a003c081be 100644 --- a/packages/session-ui/src/v2/components/prompt-input/interaction.ts +++ b/packages/session-ui/src/v2/components/prompt-input/interaction.ts @@ -379,6 +379,23 @@ export function createPromptInputV2Controller(input: { return } input.view.onPaste?.(event) + if (event.defaultPrevented) return + const text = clipboard?.getData("text/plain") + if (!text) return + event.preventDefault() + if (typeof document.execCommand === "function" && document.execCommand("insertText", false, text)) return + const target = event.currentTarget + const selection = window.getSelection() + if (!(target instanceof HTMLElement) || !selection?.rangeCount || !target.contains(selection.anchorNode)) return + const range = selection.getRangeAt(0) + range.deleteContents() + const node = document.createTextNode(text) + range.insertNode(node) + range.setStartAfter(node) + range.collapse(true) + selection.removeAllRanges() + selection.addRange(range) + target.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertFromPaste", data: text })) }, onDragEnter(event: DragEvent) { event.preventDefault()