'use client' import { useCallback, useEffect, useState } from 'react' import { OverlayReconstruction } from './OverlayReconstruction' const KLAUSUR_API = '/klausur-api' type Phase = 'idle' | 'running' | 'overlay' interface PaddleDirectStepProps { sessionId: string | null onNext: () => void } export function PaddleDirectStep({ sessionId, onNext }: PaddleDirectStepProps) { const [phase, setPhase] = useState('idle') const [error, setError] = useState(null) const [stats, setStats] = useState<{ cells: number; rows: number; duration: number } | null>(null) // Auto-detect: if session already has paddle_direct word_result → show overlay useEffect(() => { if (!sessionId) return let cancelled = false ;(async () => { try { const res = await fetch(`${KLAUSUR_API}/api/v1/ocr-pipeline/sessions/${sessionId}`) if (!res.ok || cancelled) return const data = await res.json() if (data.word_result?.ocr_engine === 'paddle_direct') { setPhase('overlay') } } catch { // ignore } })() return () => { cancelled = true } }, [sessionId]) const runPaddleDirect = useCallback(async () => { if (!sessionId) return setPhase('running') setError(null) try { const res = await fetch(`${KLAUSUR_API}/api/v1/ocr-pipeline/sessions/${sessionId}/paddle-direct`, { method: 'POST', }) if (!res.ok) { const data = await res.json().catch(() => ({})) throw new Error(data.detail || `HTTP ${res.status}`) } const data = await res.json() setStats({ cells: data.summary?.total_cells || 0, rows: data.grid_shape?.rows || 0, duration: data.duration_seconds || 0, }) setPhase('overlay') } catch (e: unknown) { setError(e instanceof Error ? e.message : 'Unbekannter Fehler') setPhase('idle') } }, [sessionId]) if (!sessionId) { return (
Bitte zuerst ein Bild hochladen.
) } if (phase === 'overlay') { return (
{stats && (
{stats.cells} Woerter erkannt {stats.rows} Zeilen {stats.duration.toFixed(1)}s
)}
) } return (
{phase === 'running' ? ( <>

PaddleOCR laeuft...

Bild wird analysiert (ca. 5-30s)

) : ( <>

Paddle Direct

PaddleOCR erkennt alle Woerter direkt auf dem Originalbild — ohne Begradigung, Entzerrung oder Zuschnitt.

{error && (
{error}
)} )}
) }