import React, { useEffect, useState } from 'react' import { RefreshCw, HardDrive, Wifi } from 'lucide-react' import { api } from '../api/client' interface Stats { diskUsedMb: number; diskLimitMb: number bandwidthUsedMb: number; bandwidthLimitMb: number counts: Record } function Bar({ label, used, limit, icon: Icon }: { label: string; used: number; limit: number; icon: React.ComponentType<{ size?: number; className?: string }> }) { const pct = limit === 0 ? 0 : Math.min(100, Math.round((used / limit) * 100)) const color = pct > 90 ? 'bg-red-500' : pct > 70 ? 'bg-amber-500' : 'bg-sky-500' return (
{label}
{used} MB used {limit === 0 ? 'Unlimited' : `${limit} MB total`} {limit > 0 && `(${pct}%)`}
) } export default function Stats() { const [stats, setStats] = useState(null) const [loading, setLoading] = useState(false) const fetch = async () => { setLoading(true) try { const r = await api.get('/nixclient/stats'); setStats(r.data.data) } finally { setLoading(false) } } useEffect(() => { fetch() }, []) const labels: Record = { emailAccounts: 'Email Accounts', databases: 'Databases', ftpAccounts: 'FTP Accounts', subdomains: 'Subdomains', addonDomains: 'Addon Domains', parkedDomains: 'Parked Domains', sslCertificates: 'SSL Certificates', cronJobs: 'Cron Jobs', } return (

Statistics

Account resource usage

{stats ? ( <>

Feature Usage

{Object.entries(stats.counts).map(([key, val]) => (

{val}

{labels[key] ?? key}

))}
) : (
{loading ? 'Loading...' : 'No data'}
)}
) }