import React, { useState, useEffect, useRef } from 'react'; import { Mic, MicOff, Loader2 } from 'lucide-react'; import { toast } from 'sonner'; interface VoiceInputProps { onTranscribed: (text: string) => void; className?: string; } export default function VoiceInput({ onTranscribed, className = "" }: VoiceInputProps) { const [isListening, setIsListening] = useState(false); const [isSupported, setIsSupported] = useState(true); const recognitionRef = useRef(null); useEffect(() => { const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition; if (!SpeechRecognition) { setIsSupported(false); return; } const recognition = new SpeechRecognition(); recognition.lang = 'de-DE'; recognition.interimResults = false; recognition.continuous = false; recognition.onresult = (event: any) => { const text = event.results[0][0].transcript; onTranscribed(text); setIsListening(false); }; recognition.onerror = (event: any) => { console.error('Speech recognition error:', event.error); toast.error(`Spracherkennung Fehler: ${event.error}`); setIsListening(false); }; recognition.onend = () => { setIsListening(false); }; recognitionRef.current = recognition; }, [onTranscribed]); const toggleListening = () => { if (!isSupported) { toast.error("Spracherkennung wird von diesem Browser nicht unterstützt."); return; } if (isListening) { recognitionRef.current?.stop(); setIsListening(false); } else { try { recognitionRef.current?.start(); setIsListening(true); } catch (e) { console.error(e); setIsListening(false); } } }; return ( ); }