fix(session-ui): preserve prompt editing behavior (#37483)
This commit is contained in:
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
|
const view = props.controller.view
|
||||||
let editor: HTMLDivElement | undefined
|
let editor: HTMLDivElement | undefined
|
||||||
let localInput = false
|
let localInput = false
|
||||||
|
const updateCursor = () => {
|
||||||
|
if (!editor || !window.getSelection()?.isCollapsed) return
|
||||||
|
props.controller.onCursor(promptInputV2Cursor(editor))
|
||||||
|
}
|
||||||
const mode = createMemo(() => state.mode)
|
const mode = createMemo(() => state.mode)
|
||||||
const buttons = createMemo(() => ({
|
const buttons = createMemo(() => ({
|
||||||
opacity: mode() === "normal" ? 1 : 0,
|
opacity: mode() === "normal" ? 1 : 0,
|
||||||
|
|
@ -162,8 +166,8 @@ export function PromptInputV2(props: PromptInputV2Props) {
|
||||||
props.controller.submit()
|
props.controller.submit()
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
onKeyUp={(event) => props.controller.onCursor(promptInputV2Cursor(event.currentTarget))}
|
onKeyUp={updateCursor}
|
||||||
onPointerUp={(event) => props.controller.onCursor(promptInputV2Cursor(event.currentTarget))}
|
onPointerUp={updateCursor}
|
||||||
onPaste={props.controller.onPaste}
|
onPaste={props.controller.onPaste}
|
||||||
onFocus={() => props.controller.dispatch({ type: "focus.editor" })}
|
onFocus={() => props.controller.dispatch({ type: "focus.editor" })}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -379,6 +379,23 @@ export function createPromptInputV2Controller(input: {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
input.view.onPaste?.(event)
|
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) {
|
onDragEnter(event: DragEvent) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue