'use client' /** * StepAnsicht — Excel-like Spreadsheet View. * * Left: Original scan with OCR word overlay * Right: Fortune Sheet spreadsheet with multi-sheet tabs per zone */ import { useEffect, useRef, useState } from 'react' import dynamic from 'next/dynamic' const SpreadsheetView = dynamic( () => import('./SpreadsheetView').then((m) => m.SpreadsheetView), { ssr: false, loading: () =>
Spreadsheet wird geladen...
}, ) const KLAUSUR_API = '/klausur-api' interface StepAnsichtProps { sessionId: string | null onNext: () => void } export function StepAnsicht({ sessionId, onNext }: StepAnsichtProps) { const [gridData, setGridData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const leftRef = useRef(null) const [leftHeight, setLeftHeight] = useState(600) // Load grid data on mount useEffect(() => { if (!sessionId) return ;(async () => { try { const res = await fetch(`${KLAUSUR_API}/api/v1/ocr-pipeline/sessions/${sessionId}/grid-editor`) if (!res.ok) throw new Error(`HTTP ${res.status}`) setGridData(await res.json()) } catch (e) { setError(e instanceof Error ? e.message : 'Fehler beim Laden') } finally { setLoading(false) } })() }, [sessionId]) // Track left panel height useEffect(() => { if (!leftRef.current) return const ro = new ResizeObserver(([e]) => setLeftHeight(e.contentRect.height)) ro.observe(leftRef.current) return () => ro.disconnect() }, []) if (loading) { return (
Lade Spreadsheet...
) } if (error || !gridData) { return (

{error || 'Keine Grid-Daten.'}

) } return (
{/* Header */}

Ansicht — Spreadsheet

Jede Zone als eigenes Sheet-Tab. Spaltenbreiten pro Sheet optimiert.

{/* Split view */}
{/* LEFT: Original + OCR overlay */}
Original + OCR
{sessionId && ( Original + OCR )}
{/* RIGHT: Fortune Sheet */}
) }