'use client'; import { useState, useCallback, useRef } from 'react'; import { Button } from '@/components/ui/Button'; import { uploadOCRScan } from '@/lib/ocr'; interface OCRUploadProps { vehicleId?: string; onUploadComplete?: (resultId: string) => void; } export function OCRUpload({ vehicleId, onUploadComplete }: OCRUploadProps) { const [isDragging, setIsDragging] = useState(false); const [uploading, setUploading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); const fileInputRef = useRef(null); const handleFile = useCallback( async (file: File) => { setError(null); setSuccess(null); if (!file.type.startsWith('image/')) { setError('Only image files are allowed'); return; } setUploading(true); try { const result = await uploadOCRScan(file, vehicleId); setSuccess(`Upload queued. Result ID: ${result.ocr_result_id}`); if (onUploadComplete) { onUploadComplete(result.ocr_result_id); } } catch (err: unknown) { const apiErr = err as { error?: { message?: string } }; setError(apiErr?.error?.message || 'Upload failed'); } finally { setUploading(false); } }, [vehicleId, onUploadComplete] ); const handleDragEnter = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); }, []); const handleDragLeave = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); }, []); const handleDragOver = useCallback((e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); }, []); const handleDrop = useCallback( (e: React.DragEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); const files = e.dataTransfer.files; if (files && files.length > 0) { handleFile(files[0]); } }, [handleFile] ); const handleFileSelect = useCallback( (e: React.ChangeEvent) => { const files = e.target.files; if (files && files.length > 0) { handleFile(files[0]); } }, [handleFile] ); return (
fileInputRef.current?.click()} className={` border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors ${isDragging ? 'border-primary bg-primary/5' : 'border-border hover:border-primary/50'} `} >

{isDragging ? 'Drop image here' : 'Drag and drop scan image here'}

or click to browse

PNG, JPEG, WebP (max 50 MB)

{uploading && (
Uploading...
)} {error && (
{error}
)} {success && (
{success}
)}
); }