import { useState, useEffect, useRef } from "react"; import { Bug, Trash2, X, Copy, Check } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { logger, type LogEntry } from "@/lib/logger"; const levelColors: Record = { info: "text-blue-500", success: "text-green-500", warning: "text-yellow-500", error: "text-red-500", debug: "text-gray-500", }; function formatTime(date: Date): string { return date.toLocaleTimeString("en-US", { hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit", }); } export function DebugLogger() { const [open, setOpen] = useState(false); const [logs, setLogs] = useState([]); const [copied, setCopied] = useState(false); const scrollRef = useRef(null); useEffect(() => { const unsubscribe = logger.subscribe(() => { setLogs(logger.getLogs()); }); setLogs(logger.getLogs()); return () => { unsubscribe(); }; }, []); useEffect(() => { if (scrollRef.current) { scrollRef.current.scrollTop = scrollRef.current.scrollHeight; } }, [logs]); const handleClear = () => { logger.clear(); }; const handleCopy = async () => { const logText = logs .map((log) => `[${formatTime(log.timestamp)}] [${log.level}] ${log.message}`) .join("\n"); try { await navigator.clipboard.writeText(logText); setCopied(true); setTimeout(() => setCopied(false), 500); } catch (err) { console.error("Failed to copy logs:", err); } }; return ( Debug Logs
{logs.length === 0 ? (

no logs yet...

) : ( logs.map((log, i) => (
[{formatTime(log.timestamp)}] [{log.level}] {log.message}
)) )}
); }