Skip to content

Commit efb6cc2

Browse files
authored
fix(session-ui): preserve prompt editing behavior (#37483)
1 parent 4bffbb6 commit efb6cc2

2 files changed

Lines changed: 23 additions & 2 deletions

File tree

packages/session-ui/src/v2/components/prompt-input/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ export function PromptInputV2(props: PromptInputV2Props) {
4545
const view = props.controller.view
4646
let editor: HTMLDivElement | undefined
4747
let localInput = false
48+
const updateCursor = () => {
49+
if (!editor || !window.getSelection()?.isCollapsed) return
50+
props.controller.onCursor(promptInputV2Cursor(editor))
51+
}
4852
const mode = createMemo(() => state.mode)
4953
const buttons = createMemo(() => ({
5054
opacity: mode() === "normal" ? 1 : 0,
@@ -162,8 +166,8 @@ export function PromptInputV2(props: PromptInputV2Props) {
162166
props.controller.submit()
163167
}
164168
}}
165-
onKeyUp={(event) => props.controller.onCursor(promptInputV2Cursor(event.currentTarget))}
166-
onPointerUp={(event) => props.controller.onCursor(promptInputV2Cursor(event.currentTarget))}
169+
onKeyUp={updateCursor}
170+
onPointerUp={updateCursor}
167171
onPaste={props.controller.onPaste}
168172
onFocus={() => props.controller.dispatch({ type: "focus.editor" })}
169173
/>

packages/session-ui/src/v2/components/prompt-input/interaction.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,23 @@ export function createPromptInputV2Controller(input: {
379379
return
380380
}
381381
input.view.onPaste?.(event)
382+
if (event.defaultPrevented) return
383+
const text = clipboard?.getData("text/plain")
384+
if (!text) return
385+
event.preventDefault()
386+
if (typeof document.execCommand === "function" && document.execCommand("insertText", false, text)) return
387+
const target = event.currentTarget
388+
const selection = window.getSelection()
389+
if (!(target instanceof HTMLElement) || !selection?.rangeCount || !target.contains(selection.anchorNode)) return
390+
const range = selection.getRangeAt(0)
391+
range.deleteContents()
392+
const node = document.createTextNode(text)
393+
range.insertNode(node)
394+
range.setStartAfter(node)
395+
range.collapse(true)
396+
selection.removeAllRanges()
397+
selection.addRange(range)
398+
target.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertFromPaste", data: text }))
382399
},
383400
onDragEnter(event: DragEvent) {
384401
event.preventDefault()

0 commit comments

Comments
 (0)