import { connectionMonitor } from '@/lib/gateways/api/base/ApiConnectionMonitor'; import { ApiError } from '@/lib/gateways/api/base/ApiError'; import { CircuitBreakerRegistry } from '@/lib/gateways/api/base/RetryHandler'; import { Badge } from '@/ui/Badge'; import { Box } from '@/ui/Box'; import { Button } from '@/ui/Button'; import { Card } from '@/ui/Card'; import { Heading } from '@/ui/Heading'; import { Icon } from '@/ui/Icon'; import { Text } from '@/ui/Text'; import { Copy, RefreshCw, Terminal, X } from 'lucide-react'; import { useEffect, useState } from 'react'; interface DevErrorPanelProps { error: ApiError; onReset: () => void; } export function DevErrorPanel({ error, onReset }: DevErrorPanelProps) { const [connectionStatus, setConnectionStatus] = useState(connectionMonitor.getHealth()); const [circuitBreakers, setCircuitBreakers] = useState(CircuitBreakerRegistry.getInstance().getStatus()); const [copied, setCopied] = useState(false); useEffect(() => { const handleStatusChange = () => { setConnectionStatus(connectionMonitor.getHealth()); setCircuitBreakers(CircuitBreakerRegistry.getInstance().getStatus()); }; connectionMonitor.on('success', handleStatusChange); connectionMonitor.on('failure', handleStatusChange); connectionMonitor.on('connected', handleStatusChange); connectionMonitor.on('disconnected', handleStatusChange); connectionMonitor.on('degraded', handleStatusChange); return () => { connectionMonitor.off('success', handleStatusChange); connectionMonitor.off('failure', handleStatusChange); connectionMonitor.off('connected', handleStatusChange); connectionMonitor.off('disconnected', handleStatusChange); connectionMonitor.off('degraded', handleStatusChange); }; }, []); const copyToClipboard = async () => { const debugInfo = { error: { type: error.type, message: error.message, context: error.context, stack: error.stack, }, connection: connectionStatus, circuitBreakers, timestamp: new Date().toISOString(), userAgent: navigator.userAgent, url: window.location.href, }; try { await navigator.clipboard.writeText(JSON.stringify(debugInfo, null, 2)); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (err) { // Silent failure } }; const getSeverityVariant = (): 'critical' | 'warning' | 'primary' | 'default' => { switch (error.getSeverity()) { case 'error': return 'critical'; case 'warn': return 'warning'; case 'info': return 'primary'; default: return 'default'; } }; return ( {/* Header */} API Error Debug Panel {error.type} {/* Details Grid */} {JSON.stringify(error.context, null, 2)} ); } const DetailRow = ({ label, value, intent = 'low' }: { label: string; value: any; intent?: any }) => ( {label}: {String(value)} );