fix(session-ui): preserve prompt editing behavior (#37483)

This commit is contained in:
Brendan Allan
2026-07-17 19:56:07 +08:00
committed by GitHub
parent 4bffbb655f
commit efb6cc2d4b
2 changed files with 23 additions and 2 deletions
@@ -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" })}
/>
@@ -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()