import { useMemo, useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Cpu, MemoryStick, Zap, Users, Globe, Search, Bell, ChevronUp, Activity, Sliders, } from 'lucide-react'; import { LineChart, LineAreaChart, DonutChart, EnhancedMetricCard, CacheMetricCard, PerformanceMetricCard } from '@/shared/components'; // Generate seeded random data for demo function seededRandom(seed: string, min: number, max: number): number { let hash = 0; for (let i = 0; i < seed.length; i++) { hash = ((hash << 5) - hash) + seed.charCodeAt(i); hash = hash & hash; } const normalized = Math.abs(Math.sin(hash)); return Math.floor(normalized * (max - min + 1)) + min; } type TabKey = 'metrics' | 'requests' | 'apis' | 'config'; const tabs: Array<{ key: TabKey; label: string; icon: typeof Activity }> = [ { key: 'metrics', label: 'Metrics', icon: Activity }, { key: 'requests', label: 'Requests', icon: Zap }, { key: 'apis', label: 'APIs', icon: Globe }, { key: 'config', label: 'Config', icon: Sliders }, ]; const timePeriods = ['Day', 'Month', 'Year']; export function ServiceMetricsDashboard() { const { serviceId = 'demo-service' } = useParams(); const navigate = useNavigate(); const [activeTab, setActiveTab] = useState('metrics'); const [timePeriod, setTimePeriod] = useState('Day'); const [isSystemRunning, setIsSystemRunning] = useState(true); // Generate realistic metric data const metrics = useMemo(() => { const cpuData = Array.from({ length: 24 }, (_, i) => seededRandom(`${serviceId}:cpu:${i}`, 10, 45) ); const ramPercent = seededRandom(`${serviceId}:ram`, 50, 85); const userCount = seededRandom(`${serviceId}:users`, 400, 500); const userData = Array.from({ length: 15 }, (_, i) => seededRandom(`${serviceId}:users:${i}`, 40, 110) ); const perfPercent = seededRandom(`${serviceId}:perf`, 82, 99); const perfData1 = Array.from({ length: 12 }, (_, i) => seededRandom(`${serviceId}:perf1:${i}`, 70, 95) ); const perfData2 = Array.from({ length: 12 }, (_, i) => seededRandom(`${serviceId}:perf2:${i}`, 60, 90) ); return { cpu: cpuData[cpuData.length - 1], cpuData, ram: ramPercent, ramUsedGB: ((8 * ramPercent) / 100).toFixed(1), users: userCount, userData, perf: perfPercent, perfData: [ { data: perfData1, color: '#7ab8ff', fillOpacity: 0.15 }, { data: perfData2, color: '#f2c94c', fillOpacity: 0.15 } ], upSpeed: seededRandom(`${serviceId}:upspeed`, 8, 13).toFixed(1), downSpeed: seededRandom(`${serviceId}:downspeed`, 4, 7).toFixed(1), }; }, [serviceId]); // Auto-update metrics every 2 seconds useEffect(() => { if (!isSystemRunning) return; const interval = setInterval(() => { // Trigger re-render by updating time period setTimePeriod(prev => prev); }, 2000); return () => clearInterval(interval); }, [isSystemRunning]); const handleStop = () => { setIsSystemRunning(false); }; const handleRestart = () => { setIsSystemRunning(true); }; return (
{/* Ambient glow */}
{/* Sidebar - self.html exact match */} {/* Main Content */}
{/* Topbar - self.html exact match */}
{/* Scrollable Content */}
{/* Breadcrumb */}
/ [NuFest] - App Project
{/* Project Header */}
[NuFest] - App Project {isSystemRunning && } {isSystemRunning ? 'Active' : 'Stopped'}
https://nufest-dth.app
{/* Tabs */}
{tabs.map((tab) => { const Icon = tab.icon; return ( ); })}
{/* Metrics Header */}
Metrics
{timePeriods.map((period) => (
setTimePeriod(period)} className={`pill ${timePeriod === period ? 'active' : ''}`} > {period}
))}
{/* Row 1: CPU, RAM, Cache */}
{/* CPU Card */} } chart={} animationDelay={0.04} /> {/* RAM Card */}
RAM Usage
{metrics.ram}%
Average Daily usage
Used
{metrics.ramUsedGB} GB / 8GB
Details
{/* Cache Card */}
{/* Row 2: Active Users, Performance */}
{/* Active Users Card */} } chart={} details={
{['🇨🇳', '🇮🇩', '🇲🇲', '🇲🇾', '🇯🇵', '🇮🇳', '🇰🇷', '🇵🇭'].map((flag, i) => ( {flag} ))}
} horizontal animationDelay={0.19} /> {/* Performance Card */}
); }