'use client' import { useEffect, useState } from 'react' interface VoiceIndicatorProps { isListening: boolean audioLevel?: number // 0-100 status?: string } /** * Visual indicator for voice activity * Shows audio level and status */ export function VoiceIndicator({ isListening, audioLevel = 0, status = 'idle', }: VoiceIndicatorProps) { const [bars, setBars] = useState([0, 0, 0, 0, 0]) // Animate bars based on audio level useEffect(() => { if (!isListening) { setBars([0, 0, 0, 0, 0]) return } const interval = setInterval(() => { setBars((prev) => prev.map(() => { const base = audioLevel / 100 const variance = Math.random() * 0.4 return Math.min(1, base + variance) }) ) }, 100) return () => clearInterval(interval) }, [isListening, audioLevel]) const statusColors: Record = { idle: 'bg-gray-400', connected: 'bg-blue-500', listening: 'bg-green-500', processing: 'bg-yellow-500', responding: 'bg-purple-500', error: 'bg-red-500', } const statusLabels: Record = { idle: 'Bereit', connected: 'Verbunden', listening: 'Hoert zu...', processing: 'Verarbeitet...', responding: 'Antwortet...', error: 'Fehler', } return (
{/* Status dot */}
{/* Audio level bars */}
{bars.map((level, i) => (
))}
{/* Status text */} {statusLabels[status] || status}
) }