import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Badge } from '@/components/ui/badge'; import { getLogs, type LogEntry } from '@/services/api'; import { RefreshCw } from 'lucide-react'; import { Button } from '@/components/ui/button'; export function SystemLogs() { const [logs, setLogs] = useState([]); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const fetchLogs = async () => { setIsLoading(true); setError(null); try { const data = await getLogs(); // Sort logs newest first if backend returns oldest first setLogs(data.reverse()); } catch (err) { console.error('Failed to fetch logs:', err); setError('Failed to load logs.'); } finally { setIsLoading(false); } }; useEffect(() => { fetchLogs(); // Optional: Auto-refresh every 5 seconds? // const interval = setInterval(fetchLogs, 5000); // return () => clearInterval(interval); }, []); const getLevelVariant = (level: string) => { switch (level.toUpperCase()) { case 'ERROR': return 'destructive'; case 'WARNING': return 'secondary'; // yellow-ish usually case 'INFO': return 'default'; case 'DEBUG': return 'outline'; default: return 'secondary'; } }; return (
System Logs Backend operational logs (last 100 entries)
{error &&
{error}
} {logs.length === 0 && !isLoading && !error && (
No logs available.
)}
{logs.map((log, i) => (
{new Date(log.timestamp).toLocaleTimeString()} {log.level}
{log.message}
{log.extra && Object.keys(log.extra).length > 0 && (
                      {JSON.stringify(log.extra, null, 2)}
                    
)}
))}
); }