'use client'; import { useState, useEffect } from 'react'; import WaveformPlayer from '../WaveformPlayer'; import { type EntryViewProps } from './AnnotationPageView'; const AUTO_ADVANCE_DELAY_MS = 600; export default function SingleChoiceBinaryEntryView({ entry, index, onSave, isSaving, ratingOptions, question, }: EntryViewProps) { const [answer, setAnswer] = useState(null); const [fullyPlayed, setFullyPlayed] = useState(false); const fileExt = entry.fileName.substring(entry.fileName.lastIndexOf('.')); const audioSrc = `/public/datasets/${entry.datasetId}/${entry.externalId}${fileExt}`; // Auto-save when answer is selected useEffect(() => { if (answer === null || isSaving) return; if (answer === entry.annotation) return; // No change, don't save const timer = setTimeout(() => { onSave(answer); }, AUTO_ADVANCE_DELAY_MS); return () => clearTimeout(timer); }, [answer, onSave, entry.annotation, isSaving]); useEffect(() => { // Reset state when entry changes setAnswer(entry.annotation); setFullyPlayed(entry.annotation !== null); // If already annotated, mark as fully played to allow changing answer }, [entry]); return (
{/* Sample header */}
Aufnahme {index + 1} {fullyPlayed && ( ✓ Gehört )}
{/* Waveform player */} setFullyPlayed(true)} playMode='pause' /> {/* Must-listen hint */} {!fullyPlayed && (

Bitte die Aufnahme vollständig anhören, bevor du eine Bewertung abgibst.

)} {/* Utterance text */} {entry.utteranceText && (

Transkription

"{entry.utteranceText}"

)} {/* Dialect + question */}
{question}
{/* Radio Select */}
{ratingOptions?.map(({ value, label }) => { const selected = answer === value; const disabled = !fullyPlayed || isSaving; return ( ); })}
{/* Footnote */}

Vertrau deinem ersten Eindruck – klingt die Aufnahme authentisch nach diesem Dialekt? Es gibt keine richtige oder falsche Antwort.

); }