'use client' import React, { useState, useEffect, useCallback } from 'react' import { useParams, useRouter } from 'next/navigation' import { useTheme } from '@/lib/ThemeContext' import { AudioButton } from '@/components/learn/AudioButton' import { MicrophoneInput } from '@/components/learn/MicrophoneInput' import { SyllableBow, simpleSyllableSplit } from '@/components/learn/SyllableBow' import { StarRating, accuracyToStars } from '@/components/gamification/StarRating' interface QAItem { id: string; question: string; answer: string syllables_en?: string[]; syllables_de?: string[] ipa_en?: string; ipa_de?: string } function getApiBase() { return '' } export default function PronouncePage() { const { unitId } = useParams<{ unitId: string }>() const router = useRouter() const { isDark } = useTheme() const [items, setItems] = useState([]) const [currentIndex, setCurrentIndex] = useState(0) const [isLoading, setIsLoading] = useState(true) const [stats, setStats] = useState({ correct: 0, incorrect: 0 }) const [isComplete, setIsComplete] = useState(false) const [lang, setLang] = useState<'en' | 'de'>('en') const glassCard = isDark ? 'bg-white/10 backdrop-blur-xl border border-white/10' : 'bg-white/80 backdrop-blur-xl border border-black/5' useEffect(() => { (async () => { try { const resp = await fetch(`${getApiBase()}/api/learning-units/${unitId}/qa`) if (resp.ok) { const d = await resp.json(); setItems(d.qa_items || []) } } catch {} finally { setIsLoading(false) } })() }, [unitId]) const currentItem = items[currentIndex] const currentWord = currentItem ? (lang === 'en' ? currentItem.question : currentItem.answer) : '' const syllables = currentItem ? (lang === 'en' ? currentItem.syllables_en : currentItem.syllables_de) || simpleSyllableSplit(currentWord) : [] const ipa = currentItem ? (lang === 'en' ? currentItem.ipa_en : currentItem.ipa_de) : '' const handleResult = useCallback((transcript: string, correct: boolean) => { setStats(prev => ({ correct: prev.correct + (correct ? 1 : 0), incorrect: prev.incorrect + (correct ? 0 : 1), })) setTimeout(() => { if (currentIndex + 1 >= items.length) { setIsComplete(true) } else { setCurrentIndex(i => i + 1) } }, correct ? 1000 : 2500) }, [currentIndex, items.length]) if (isLoading) { return
} return (
{/* Header */}

Nachsprechen

{/* Progress */}
{isComplete ? (

Super gemacht!

{stats.correct}/{stats.correct + stats.incorrect} richtig ausgesprochen

) : currentItem ? (
{/* Word + Syllables */}
{ipa &&

{ipa}

}

Hoere zu, dann sprich nach

{/* Microphone */}

{currentIndex + 1} / {items.length}

) : null}
) }