import { useCallback, useRef, useState } from "react"; import { Upload, ImageIcon, X } from "lucide-react"; import { resizeImage } from "../utils/image-utils"; interface ImageUploadProps { onImageSelect: (dataUrl: string) => void; currentImage: string | null; disabled?: boolean; } export function ImageUpload({ onImageSelect, currentImage, disabled }: ImageUploadProps) { const fileInputRef = useRef(null); const [isDragging, setIsDragging] = useState(false); const handleFile = useCallback( async (file: File) => { if (!file.type.startsWith("image/")) { console.warn("[Gemma4] Ignoring non-image file:", file.type); return; } try { const dataUrl = await resizeImage(file); onImageSelect(dataUrl); } catch (err) { console.error("[Gemma4] Failed to read image:", err); alert(`Failed to read image: ${err instanceof Error ? err.message : String(err)}`); } }, [onImageSelect], ); const handleDrop = useCallback( (e: React.DragEvent) => { e.preventDefault(); setIsDragging(false); const file = e.dataTransfer.files[0]; if (file) handleFile(file); }, [handleFile], ); const handlePaste = useCallback( (e: React.ClipboardEvent) => { const items = e.clipboardData.items; for (const item of items) { if (item.type.startsWith("image/")) { const file = item.getAsFile(); if (file) handleFile(file); break; } } }, [handleFile], ); if (currentImage) { return (
Selected {!disabled && ( )}
); } return (
{ e.preventDefault(); setIsDragging(true); }} onDragLeave={() => setIsDragging(false)} onDrop={handleDrop} onPaste={handlePaste} tabIndex={0} className={`flex flex-col items-center justify-center gap-4 rounded-2xl border-2 border-dashed p-10 transition-all cursor-pointer ${ isDragging ? "border-[#1a73e8] bg-[#1a73e8]/10" : "border-white/10 hover:border-white/30 bg-white/5" } ${disabled ? "opacity-50 pointer-events-none" : ""}`} onClick={() => fileInputRef.current?.click()} >
{isDragging ? ( ) : ( )}

{isDragging ? "Drop image here" : "Upload an image"}

Drag & drop, click to browse, or paste from clipboard

{ const file = e.target.files?.[0]; if (file) handleFile(file); e.target.value = ""; }} />
); }