import { PluginLogEntry } from "@/lib/types/logs"; import { ChevronDown, ChevronRight } from "lucide-react"; import { format } from "date-fns"; import { useState } from "react"; const levelColors: Record = { debug: "bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300", info: "bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300", warn: "bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300", error: "bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-300", }; interface PluginLogsViewProps { pluginLogs: string; } export default function PluginLogsView({ pluginLogs }: PluginLogsViewProps) { let parsed: Record; try { const raw: unknown = JSON.parse(pluginLogs); if (!raw || typeof raw !== "object" || Array.isArray(raw)) return null; parsed = Object.fromEntries(Object.entries(raw as Record).filter(([, value]) => Array.isArray(value))) as Record< string, PluginLogEntry[] >; } catch { return null; } const pluginNames = Object.keys(parsed); if (pluginNames.length === 0) return null; return (
Plugin Logs
{pluginNames.map((name) => ( ))}
); } function PluginSection({ name, entries }: { name: string; entries: PluginLogEntry[] }) { const [isOpen, setIsOpen] = useState(false); const sorted = [...entries].sort((a, b) => a.timestamp - b.timestamp); return (
{isOpen && (
{sorted.map((entry, idx) => (
{format(new Date(entry.timestamp), "HH:mm:ss.SSS")} {entry.level} {entry.message}
))}
)}
); }