From 26b9d2f05205d9424eed2f5c159867e757d570bc Mon Sep 17 00:00:00 2001 From: dbpolito Date: Tue, 6 Jan 2026 18:22:32 -0300 Subject: [PATCH 1/4] Desktop: Fix Paste image on empty input --- packages/app/src/components/prompt-input.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index fc4a3d1e648..0c03214d5cf 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -288,16 +288,17 @@ export const PromptInput: Component = (props) => { } const handlePaste = async (event: ClipboardEvent) => { - if (!isFocused()) return const clipboardData = event.clipboardData if (!clipboardData) return + // Always prevent default first to avoid browser inserting raw data + event.preventDefault() + event.stopPropagation() + const items = Array.from(clipboardData.items) const imageItems = items.filter((item) => ACCEPTED_FILE_TYPES.includes(item.type)) if (imageItems.length > 0) { - event.preventDefault() - event.stopPropagation() for (const item of imageItems) { const file = item.getAsFile() if (file) await addImageAttachment(file) @@ -305,8 +306,6 @@ export const PromptInput: Component = (props) => { return } - event.preventDefault() - event.stopPropagation() const plainText = clipboardData.getData("text/plain") ?? "" addPart({ type: "text", content: plainText, start: 0, end: 0 }) } @@ -347,13 +346,11 @@ export const PromptInput: Component = (props) => { } onMount(() => { - editorRef.addEventListener("paste", handlePaste) document.addEventListener("dragover", handleGlobalDragOver) document.addEventListener("dragleave", handleGlobalDragLeave) document.addEventListener("drop", handleGlobalDrop) }) onCleanup(() => { - editorRef.removeEventListener("paste", handlePaste) document.removeEventListener("dragover", handleGlobalDragOver) document.removeEventListener("dragleave", handleGlobalDragLeave) document.removeEventListener("drop", handleGlobalDrop) @@ -1508,6 +1505,7 @@ export const PromptInput: Component = (props) => { }} contenteditable="true" onInput={handleInput} + onPaste={handlePaste} onCompositionStart={() => setComposing(true)} onCompositionEnd={() => setComposing(false)} onKeyDown={handleKeyDown} From 193df0c369f1d0162318f4fb3cfc90d528ad0f53 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Tue, 6 Jan 2026 18:24:47 -0300 Subject: [PATCH 2/4] Tweak --- packages/app/src/components/prompt-input.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 0c03214d5cf..6bc8eff1496 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -291,7 +291,6 @@ export const PromptInput: Component = (props) => { const clipboardData = event.clipboardData if (!clipboardData) return - // Always prevent default first to avoid browser inserting raw data event.preventDefault() event.stopPropagation() From 025b5dc81666e6e1500ca1e9a1f1f2206fd23087 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Wed, 7 Jan 2026 11:10:39 -0300 Subject: [PATCH 3/4] Fix isFocused --- packages/app/src/components/prompt-input.tsx | 25 ++++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 6bc8eff1496..0584c592624 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -248,17 +248,21 @@ export const PromptInput: Component = (props) => { } } - createEffect(() => { - params.id - editorRef.focus() - if (params.id) return - const interval = setInterval(() => { - setStore("placeholder", (prev) => (prev + 1) % PLACEHOLDERS.length) - }, 6500) - onCleanup(() => clearInterval(interval)) - }) - const isFocused = createFocusSignal(() => editorRef) + + createEffect( + on( + () => params.id, + () => { + queueMicrotask(() => editorRef.focus()) + if (params.id) return + const interval = setInterval(() => { + setStore("placeholder", (prev) => (prev + 1) % PLACEHOLDERS.length) + }, 6500) + onCleanup(() => clearInterval(interval)) + }, + ), + ) const [composing, setComposing] = createSignal(false) const isImeComposing = (event: KeyboardEvent) => event.isComposing || composing() || event.keyCode === 229 @@ -288,6 +292,7 @@ export const PromptInput: Component = (props) => { } const handlePaste = async (event: ClipboardEvent) => { + if (!isFocused()) return const clipboardData = event.clipboardData if (!clipboardData) return From 64b334fc1c729707d0822f43a73673ab1ef0c00e Mon Sep 17 00:00:00 2001 From: dbpolito Date: Wed, 7 Jan 2026 11:12:20 -0300 Subject: [PATCH 4/4] Fix --- packages/app/src/components/prompt-input.tsx | 23 +++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 0584c592624..e639e17d8b6 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -250,19 +250,16 @@ export const PromptInput: Component = (props) => { const isFocused = createFocusSignal(() => editorRef) - createEffect( - on( - () => params.id, - () => { - queueMicrotask(() => editorRef.focus()) - if (params.id) return - const interval = setInterval(() => { - setStore("placeholder", (prev) => (prev + 1) % PLACEHOLDERS.length) - }, 6500) - onCleanup(() => clearInterval(interval)) - }, - ), - ) + createEffect(() => { + params.id + editorRef.focus() + if (params.id) return + const interval = setInterval(() => { + setStore("placeholder", (prev) => (prev + 1) % PLACEHOLDERS.length) + }, 6500) + onCleanup(() => clearInterval(interval)) + }) + const [composing, setComposing] = createSignal(false) const isImeComposing = (event: KeyboardEvent) => event.isComposing || composing() || event.keyCode === 229