import { Terminal, Play, CheckCircle, AlertCircle } from 'lucide-react' import { Card, CardHeader, CardTitle } from './ui/Card' import { useStrom } from '../lib/useEventStream' interface LiveLogEntry { id: string timestamp: string level: 'info' | 'warning' | 'error' | 'success' message: string source: string } export default function LiveLogSection() { // Vorher: zwei eigene Taktgeber (alle 5 s /jobs und /logs) = 24 Anfragen pro // Minute allein aus diesem Kasten. Jetzt kommt beides aus der einen offenen // Verbindung, die der Provider haelt. const { jobs, logs } = useStrom() const currentJob = jobs.find((j: any) => j.status === 'processing' || j.status === 'transcoding') || jobs.find((j: any) => j.status === 'pending') || null const getStatusColor = (level: string) => { switch (level) { case 'error': return 'text-rose-500 dark:text-rose-400' case 'warning': return 'text-amber-500 dark:text-amber-400' case 'success': return 'text-emerald-500 dark:text-emerald-400' default: return 'text-sky-500 dark:text-sky-400' } } const getStatusIcon = (level: string) => { switch (level) { case 'error': return case 'warning': return case 'success': return default: return } } return (
Live-Log

{currentJob // `type?.` ist hier kein Beiwerk: Ein frisch angelegter Job kann // noch ohne Typ ankommen, und ohne das Fragezeichen riss diese // eine Zeile am 29.08.2026 die GANZE Oberflaeche mit. ? `Aktiver Job: ${currentJob.type?.toUpperCase() || 'Disc'} (${currentJob.progress ?? 0}%)` : 'Kein aktiver Job'}

{currentJob && (
{currentJob.progress === 100 ? : } {currentJob.progress}%
)}
{logs.length === 0 ? (

Warte auf Log-Einträge...

) : ( logs.map((log) => (
{new Date(log.timestamp).toLocaleTimeString('de-DE', { hour12: false })} [{log.source}] {log.message} {getStatusIcon(log.level)}
)) )}
{/* Quick Stats */} {currentJob && (

Fortschritt

{currentJob.progress}%

Gerät

{currentJob.device || 'Unbekannt'}

Typ

{currentJob.type?.toUpperCase() || 'Unbekannt'}

)}
) }