'use client' import { useState } from 'react' import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Loader2, Activity, Cpu, HardDrive, Network, Download, Upload, RefreshCw, ExternalLink, } from 'lucide-react' import Link from 'next/link' import { useServerMetrics } from '@/hooks/use-netcup' interface ServerMetricsPanelProps { netcupServerId: string serverName?: string } function formatBytes(bytes: number): string { if (bytes === 0) return '0 B' if (!Number.isFinite(bytes) || bytes < 0) return '0 B' const k = 1024 const sizes = ['B', 'KB', 'MB', 'GB', 'TB'] const i = Math.max(0, Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1)) return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] } function formatBytesPerSec(bps: number): string { return formatBytes(bps) + '/s' } function MetricsBar({ value, max = 100, gradient }: { value: number max?: number gradient?: string }) { const percentage = Math.min((value / max) * 100, 100) const getThresholdColor = () => { if (percentage > 90) return 'bg-gradient-to-r from-red-500 to-red-600' if (percentage > 75) return 'bg-gradient-to-r from-amber-500 to-orange-500' return gradient || 'bg-gradient-to-r from-blue-500 to-blue-600' } return (
Failed to load metrics
No metrics data available
Metrics will appear once the server is running
{metrics.disk.readBps.length > 0 ? formatBytesPerSec(metrics.disk.readBps[metrics.disk.readBps.length - 1]?.value || 0) : 'N/A'}
{metrics.disk.writeBps.length > 0 ? formatBytesPerSec(metrics.disk.writeBps[metrics.disk.writeBps.length - 1]?.value || 0) : 'N/A'}
No data
{metrics.network.rxBps.length > 0 ? formatBytesPerSec(metrics.network.rxBps[metrics.network.rxBps.length - 1]?.value || 0) : 'N/A'}
{metrics.network.txBps.length > 0 ? formatBytesPerSec(metrics.network.txBps[metrics.network.txBps.length - 1]?.value || 0) : 'N/A'}
No data