'use client' /** * Upload tab: session selection, drag-and-drop upload, and upload results. */ import { useState, useRef } from 'react' import { API_BASE } from '../constants' import type { OCRSession, UploadResult } from '../types' interface UploadTabProps { sessions: OCRSession[] selectedSession: string | null setSelectedSession: (id: string | null) => void fetchQueue: () => Promise fetchStats: () => Promise setError: (error: string | null) => void } export function UploadTab({ sessions, selectedSession, setSelectedSession, fetchQueue, fetchStats, setError, }: UploadTabProps) { const [uploading, setUploading] = useState(false) const [uploadResults, setUploadResults] = useState([]) const fileInputRef = useRef(null) const handleUpload = async (files: FileList) => { if (!selectedSession) { setError('Bitte zuerst eine Session auswaehlen') return } setUploading(true) const formData = new FormData() Array.from(files).forEach(file => formData.append('files', file)) formData.append('run_ocr', 'true') try { const res = await fetch(`${API_BASE}/api/v1/ocr-label/sessions/${selectedSession}/upload`, { method: 'POST', body: formData, }) if (res.ok) { const data = await res.json() setUploadResults(data.items || []) fetchQueue() fetchStats() } else { setError('Upload fehlgeschlagen') } } catch { setError('Netzwerkfehler beim Upload') } finally { setUploading(false) } } return (
{/* Session Selection */}

Session auswaehlen

{/* Upload Area */}

Bilder hochladen

{ e.preventDefault() e.currentTarget.classList.add('border-primary-500', 'bg-primary-50') }} onDragLeave={(e) => { e.currentTarget.classList.remove('border-primary-500', 'bg-primary-50') }} onDrop={(e) => { e.preventDefault() e.currentTarget.classList.remove('border-primary-500', 'bg-primary-50') if (e.dataTransfer.files.length > 0) { handleUpload(e.dataTransfer.files) } }} > e.target.files && handleUpload(e.target.files)} className="hidden" disabled={!selectedSession} /> {uploading ? (

Hochladen & OCR ausfuehren...

) : ( <>

Bilder hierher ziehen oder{' '}

PNG, JPG (max. 10MB pro Bild)

)}
{/* Upload Results */} {uploadResults.length > 0 && (

Upload-Ergebnisse ({uploadResults.length})

{uploadResults.map((result) => (
{result.filename} {result.ocr_text ? `OCR OK (${Math.round((result.ocr_confidence || 0) * 100)}%)` : 'Kein OCR'}
))}
)}
) }