浏览代码

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

Brendan Allan 1 月之前
父节点
当前提交
efb6cc2d4b

+ 6 - 2
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" })}
           />

+ 17 - 0
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()