fix: restore image paste and image tool-result handling (#308)
This commit is contained in:
22
src/hooks/usePasteHandler.test.ts
Normal file
22
src/hooks/usePasteHandler.test.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { expect, test } from 'bun:test'
|
||||
import { supportsClipboardImageFallback } from './usePasteHandler.ts'
|
||||
|
||||
test('supports clipboard image fallback on Windows', () => {
|
||||
expect(supportsClipboardImageFallback('windows')).toBe(true)
|
||||
})
|
||||
|
||||
test('supports clipboard image fallback on macOS', () => {
|
||||
expect(supportsClipboardImageFallback('macos')).toBe(true)
|
||||
})
|
||||
|
||||
test('supports clipboard image fallback on Linux', () => {
|
||||
expect(supportsClipboardImageFallback('linux')).toBe(true)
|
||||
})
|
||||
|
||||
test('does not support clipboard image fallback on WSL', () => {
|
||||
expect(supportsClipboardImageFallback('wsl')).toBe(false)
|
||||
})
|
||||
|
||||
test('does not support clipboard image fallback on unknown platforms', () => {
|
||||
expect(supportsClipboardImageFallback('unknown')).toBe(false)
|
||||
})
|
||||
@@ -15,6 +15,14 @@ import { getPlatform } from '../utils/platform.js'
|
||||
const CLIPBOARD_CHECK_DEBOUNCE_MS = 50
|
||||
const PASTE_COMPLETION_TIMEOUT_MS = 100
|
||||
|
||||
export function supportsClipboardImageFallback(
|
||||
platform: ReturnType<typeof getPlatform>,
|
||||
): boolean {
|
||||
return (
|
||||
platform === 'macos' || platform === 'windows' || platform === 'linux'
|
||||
)
|
||||
}
|
||||
|
||||
type PasteHandlerProps = {
|
||||
onPaste?: (text: string) => void
|
||||
onInput: (input: string, key: Key) => void
|
||||
@@ -52,7 +60,9 @@ export function usePasteHandler({
|
||||
// that key is Enter, it submits the old input and the paste is lost.
|
||||
const pastePendingRef = React.useRef(false)
|
||||
|
||||
const isMacOS = React.useMemo(() => getPlatform() === 'macos', [])
|
||||
const platform = React.useMemo(() => getPlatform(), [])
|
||||
const isMacOS = platform === 'macos'
|
||||
const canFallbackToClipboardImage = supportsClipboardImageFallback(platform)
|
||||
|
||||
React.useEffect(() => {
|
||||
return () => {
|
||||
@@ -178,7 +188,11 @@ export function usePasteHandler({
|
||||
|
||||
// If paste is empty (common when trying to paste images with Cmd+V),
|
||||
// check if clipboard has an image (macOS only)
|
||||
if (isMacOS && onImagePaste && pastedText.length === 0) {
|
||||
if (
|
||||
canFallbackToClipboardImage &&
|
||||
onImagePaste &&
|
||||
pastedText.length === 0
|
||||
) {
|
||||
checkClipboardForImage()
|
||||
return { chunks: [], timeoutId: null }
|
||||
}
|
||||
@@ -202,7 +216,13 @@ export function usePasteHandler({
|
||||
pastePendingRef,
|
||||
)
|
||||
},
|
||||
[checkClipboardForImage, isMacOS, onImagePaste, onPaste],
|
||||
[
|
||||
checkClipboardForImage,
|
||||
canFallbackToClipboardImage,
|
||||
isMacOS,
|
||||
onImagePaste,
|
||||
onPaste,
|
||||
],
|
||||
)
|
||||
|
||||
// Paste detection is now done via the InputEvent's keypress.isPasted flag,
|
||||
@@ -242,7 +262,12 @@ export function usePasteHandler({
|
||||
// When the user pastes an image with Cmd+V, the terminal sends an empty
|
||||
// bracketed paste sequence. The keypress parser emits this as isPasted=true
|
||||
// with empty input.
|
||||
if (isFromPaste && input.length === 0 && isMacOS && onImagePaste) {
|
||||
if (
|
||||
isFromPaste &&
|
||||
input.length === 0 &&
|
||||
canFallbackToClipboardImage &&
|
||||
onImagePaste
|
||||
) {
|
||||
checkClipboardForImage()
|
||||
// Reset isPasting since there's no text content to process
|
||||
setIsPasting(false)
|
||||
|
||||
Reference in New Issue
Block a user