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()