'use client'; import { Activity, Cpu, Gauge, Server, Users } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { Card, CardContent, CardHeader } from '@/components/ui/card'; import { Progress } from '@/components/ui/progress'; import type { DashboardCapacity, DashboardSummary, DashboardTraffic, } from '@/lib/services/openflare'; import { formatCompactNumber, formatPercent } from './dashboard-utils'; export function DashboardStatCards({ summary, traffic, capacity, }: { summary: DashboardSummary; traffic: DashboardTraffic; capacity: DashboardCapacity; }) { const t = useTranslations('dashboard.stats'); const onlineRate = summary.total_nodes > 0 ? (summary.online_nodes / summary.total_nodes) * 100 : 0; return (
{t('requests24h')}
{formatCompactNumber(traffic.request_count)}

{t('requestsMeta', { visitors: formatCompactNumber(traffic.unique_visitors), errors: formatCompactNumber(traffic.error_count), qps: traffic.estimated_qps.toFixed(2), })}

{t('clusterCapacity')}
{formatPercent(capacity.average_cpu_usage_percent)} CPU

{t('avgMemoryHighLoad', { memory: formatPercent(capacity.average_memory_usage_percent), cpu: capacity.high_cpu_nodes, memoryNodes: capacity.high_memory_nodes, storage: capacity.high_storage_nodes, })}

{t('nodeOverview')}
{summary.online_nodes} {' '} {t('onlineOf', { total: summary.total_nodes })}

{t('pending', { count: summary.pending_nodes })} {t('unhealthyOffline', { unhealthy: summary.unhealthy_nodes, offline: summary.offline_nodes, })}

); }