import { useState, useEffect } from 'react' import { Terminal, AlertCircle, CheckCircle, RefreshCw } from 'lucide-react' import { api } from '../lib/api' import { useDarkMode } from '../context/ThemeContext' interface LogEntry { id: string timestamp: string level: 'info' | 'warning' | 'error' | 'success' message: string source: string details?: string } export default function LogsPage() { const [logs, setLogs] = useState([]) const [filter, setFilter] = useState('all') const [loading, setLoading] = useState(true) const { theme } = useDarkMode() const refreshLogs = async () => { // Echte Ereignisse aus der Datenbank — die Mock-Einträge („The Matrix // gerippt") sind raus. Was hier steht, ist passiert; sonst ist es leer. try { const response = await api.get('/logs', { params: { limit: 200 } }) setLogs(response.data) } catch (error) { console.error('Fehler beim Laden der Logs:', error) } finally { setLoading(false) } } useEffect(() => { refreshLogs() const interval = setInterval(refreshLogs, 10000) return () => clearInterval(interval) }, []) const getLevelColor = (level: string) => { switch (level) { case 'error': return theme === 'dark' ? 'bg-rose-900/30 text-rose-400 border-rose-700/20' : 'bg-rose-100 text-rose-700 border-rose-600/20' case 'warning': return theme === 'dark' ? 'bg-amber-900/30 text-amber-400 border-amber-700/20' : 'bg-amber-100 text-amber-700 border-amber-600/20' case 'success': return theme === 'dark' ? 'bg-emerald-900/30 text-emerald-400 border-emerald-700/20' : 'bg-emerald-100 text-emerald-700 border-emerald-600/20' default: return theme === 'dark' ? 'bg-blue-900/30 text-blue-400 border-blue-700/20' : 'bg-blue-100 text-blue-700 border-blue-600/20' } } const getLevelIcon = (level: string) => { switch (level) { case 'error': return case 'warning': return case 'success': return default: return } } const getLevelLabel = (level: string) => { switch (level) { case 'error': return 'Fehler' case 'warning': return 'Warnung' case 'success': return 'Erfolg' default: return 'Info' } } const filteredLogs = filter === 'all' ? logs : logs.filter(log => log.level === filter || log.source === filter) const stats = { info: logs.filter(l => l.level === 'info').length, warning: logs.filter(l => l.level === 'warning').length, error: logs.filter(l => l.level === 'error').length, success: logs.filter(l => l.level === 'success').length, } return (
{/* Header */}

Logs

Alle relevanten Log-Informationen des Ripping-Systems

{/* Stats */}
Info

{stats.info}

Warnung

{stats.warning}

Erfolg

{stats.success}

Fehler

{stats.error}

{/* Filters */}
Filter:
{/* Logs List */}
{filteredLogs.length === 0 ? (

Keine Logs gefunden

) : (
{filteredLogs.map(log => (
{getLevelIcon(log.level)}
{log.source} {log.timestamp} {getLevelLabel(log.level)}

{log.message}

{log.details && (

{log.details}

)}
))}
)}
) }