'use client'
import { SkeletonOCRResult, SkeletonDots } from '@/components/common/SkeletonText'
import { ConfidenceHeatmap } from '@/components/ai/ConfidenceHeatmap'
import type { OCRResult, MagicSettings } from '../types'
interface TabTestProps {
ocrResult: OCRResult | null
ocrLoading: boolean
imagePreview: string | null
uploadedImage: File | null
settings: MagicSettings
showHeatmap: boolean
onToggleHeatmap: () => void
onFileUpload: (file: File) => void
onManualOCR: () => void
onClearImage: () => void
onSendToTraining: () => void
}
function getConfidenceColor(confidence: number) {
if (confidence >= 0.9) return 'bg-green-500'
if (confidence >= 0.7) return 'bg-yellow-500'
return 'bg-red-500'
}
export function TabTest({
ocrResult,
ocrLoading,
imagePreview,
uploadedImage,
settings,
showHeatmap,
onToggleHeatmap,
onFileUpload,
onManualOCR,
onClearImage,
onSendToTraining,
}: TabTestProps) {
return (
{/* OCR Test */}
OCR Test
Teste die Handschrifterkennung mit einem eigenen Bild. Das Ergebnis zeigt
den erkannten Text, Konfidenz und Verarbeitungszeit.
{settings.livePreview && (
(Live-Vorschau aktiv)
)}
{/* Upload Area */}
{/* Results Area */}
{/* Confidence Heatmap */}
{imagePreview && ocrResult && ocrResult.confidence > 0 && (
Konfidenz-Visualisierung
{showHeatmap ? 'Heatmap verbergen' : 'Heatmap anzeigen'}
{showHeatmap && (
({
text: w.text,
confidence: w.confidence,
bbox: w.bbox as [number, number, number, number]
})) || []}
charConfidences={ocrResult.char_confidences || []}
showLegend={true}
toggleable={true}
/>
)}
)}
{/* Confidence Interpretation */}
Konfidenz-Interpretation
90-100%
Sehr hohe Sicherheit - Text kann direkt uebernommen werden
70-90%
Gute Sicherheit - manuelle Ueberpruefung empfohlen
< 70%
Niedrige Sicherheit - manuelle Eingabe erforderlich
)
}
/* ------------------------------------------------------------------ */
/* Sub-components */
/* ------------------------------------------------------------------ */
interface UploadAreaProps {
imagePreview: string | null
uploadedImage: File | null
ocrLoading: boolean
livePreview: boolean
onFileUpload: (file: File) => void
onManualOCR: () => void
onClearImage: () => void
}
function UploadArea({ imagePreview, uploadedImage, ocrLoading, livePreview, onFileUpload, onManualOCR, onClearImage }: UploadAreaProps) {
return (
document.getElementById('ocr-file-input')?.click()}
onDragOver={(e) => { e.preventDefault(); e.currentTarget.classList.add('border-purple-500', 'bg-purple-50') }}
onDragLeave={(e) => { e.currentTarget.classList.remove('border-purple-500', 'bg-purple-50') }}
onDrop={(e) => {
e.preventDefault()
e.stopPropagation()
e.currentTarget.classList.remove('border-purple-500', 'bg-purple-50')
const file = e.dataTransfer.files[0]
if (file?.type.startsWith('image/')) onFileUpload(file)
}}
>
{imagePreview ? (
{
e.stopPropagation()
onClearImage()
}}
className="absolute top-2 right-2 p-1 bg-red-500 text-white rounded-full hover:bg-red-600 transition-colors"
title="Bild entfernen (Escape)"
>
) : (
<>
📄
Bild hierher ziehen oder klicken zum Hochladen
PNG, JPG - Handgeschriebener Text
oder Ctrl+V zum Einfuegen
>
)}
{
const file = e.target.files?.[0]
if (file) onFileUpload(file)
}}
/>
{uploadedImage && !livePreview && (
{ocrLoading ? (
Analysiere...
) : (
'OCR starten (Ctrl+Enter)'
)}
)}
)
}
interface ResultsAreaProps {
ocrResult: OCRResult | null
ocrLoading: boolean
onSendToTraining: () => void
}
function ResultsArea({ ocrResult, ocrLoading, onSendToTraining }: ResultsAreaProps) {
if (ocrLoading) return
if (!ocrResult) {
return (
🔍
Lade ein Bild hoch um die Erkennung zu testen
)
}
return (
Erkannter Text:
= 0.9 ? 'bg-green-100 text-green-700' :
ocrResult.confidence >= 0.7 ? 'bg-yellow-100 text-yellow-700' :
'bg-red-100 text-red-700'
}`}>
{(ocrResult.confidence * 100).toFixed(0)}% Konfidenz
{ocrResult.text || '(Kein Text erkannt)'}
{/* Confidence bar */}
Konfidenz
{(ocrResult.confidence * 100).toFixed(1)}%
Verarbeitungszeit
{ocrResult.processing_time_ms}ms
Modell
{ocrResult.model || 'TrOCR'}
LoRA Adapter
{ocrResult.has_lora_adapter ? 'Ja' : 'Nein'}
{ocrResult.confidence < 0.9 && (
Die Erkennung koennte verbessert werden! Moechtest du dieses Beispiel zum Training hinzufuegen?
Als Trainingsbeispiel hinzufuegen
)}
)
}