import React, { useState, useEffect } from 'react'; import { Activity, Zap, Shield, Package, Clock, TrendingUp } from 'lucide-react'; import { usePerformanceAnalyzer } from '../utils/PerformanceAnalyzer'; import { bundleOptimizer } from '../utils/BundleOptimizerAdvanced'; import { securityEnhanced } from '../utils/SecurityEnhanced'; export const PerformanceMonitor: React.FC = () => { const { getReport } = usePerformanceAnalyzer(); const [performanceData, setPerformanceData] = useState(null); const [bundleData, setBundleData] = useState(null); const [securityData, setSecurityData] = useState(null); useEffect(() => { let mounted = true; // Flag para evitar vazamento de memória const updateData = () => { if (!mounted) return; // Não atualizar se componente foi desmontado try { setPerformanceData(getReport()); setBundleData(bundleOptimizer.getOptimizationReport()); setSecurityData(securityEnhanced.getSecurityReport()); } catch (error) { console.warn('Erro ao atualizar dados de performance:', error); } }; updateData(); const interval = setInterval(updateData, 5000); // Update every 5 seconds return () => { mounted = false; // Marcar como desmontado clearInterval(interval); }; }, [getReport]); if (!performanceData || !bundleData || !securityData) { return (
); } const formatBytes = (bytes: number) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }; const formatMs = (ms: number) => `${ms.toFixed(1)}ms`; return (
{/* Header */}

Monitor de Performance

Monitoramento em tempo real da performance, bundle e segurança

{/* Performance Metrics */}

Performance

Tempo de Carregamento: {formatMs(performanceData.metrics.loadTime)}
Tempo de Renderização: {formatMs(performanceData.metrics.renderTime)}
Uso de Memória: {formatBytes(performanceData.metrics.memoryUsage)}
Requisições de Rede: {performanceData.metrics.networkRequests}
Taxa de Cache: {performanceData.metrics.cacheHitRate.toFixed(1)}%
{/* Bundle Optimization */}

Bundle

Tamanho Original: {formatBytes(bundleData.originalSize)}
Tamanho Otimizado: {formatBytes(bundleData.optimizedSize)}
Economia: {formatBytes(bundleData.savings)}

{((bundleData.savings / bundleData.originalSize) * 100).toFixed(1)}% de redução

{/* Security Status */}

Segurança

Ameaças Detectadas: 0 ? 'text-red-600' : 'text-green-600'}`}> {securityData.threatsDetected}
Ameaças Mitigadas: {securityData.threatsMitigated}
Últimas 24h: {securityData.recentThreats.length}
{securityData.threatsDetected === 0 ? '✅ Sistema Seguro' : '⚠️ Monitorando'}
{/* Recommendations */}
{/* Performance Recommendations */}

Recomendações de Performance

{performanceData.recommendations.map((recommendation: string, index: number) => (
{recommendation}
))}
{/* Bundle Recommendations */}

Recomendações de Bundle

{bundleData.recommendations.map((recommendation: string, index: number) => (
{recommendation}
))}
{/* Component Performance */} {performanceData.components.length > 0 && (

Performance de Componentes

{performanceData.components.slice(0, 10).map((component: any, index: number) => { const avgTime = component.renderTime / component.renderCount; const status = avgTime > 16 ? 'slow' : avgTime > 8 ? 'medium' : 'fast'; return ( ); })}
Componente Renders Tempo Total Tempo Médio Status
{component.name} {component.renderCount} {formatMs(component.renderTime)} {formatMs(avgTime)} {status === 'fast' ? '🚀 Rápido' : status === 'medium' ? '⚡ Médio' : '🐌 Lento'}
)}
); }; export default PerformanceMonitor;