import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import { ChevronLeft, RefreshCw } from 'lucide-react' import { api } from '../../api/client' interface OverQuotaAccount { id: number username: string domain: string status: string diskUsedMb: number package: { name: string; diskMb: number; bandwidthMb: number } } export default function OverQuota() { const [items, setItems] = useState([]) const [loading, setLoading] = useState(false) const fetchData = async () => { setLoading(true) try { const r = await api.get('/nixserver/accounts/over-quota') setItems(r.data.data) } finally { setLoading(false) } } useEffect(() => { fetchData() }, []) const statusColor: Record = { active: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20', suspended: 'bg-amber-500/10 text-amber-400 border-amber-500/20', terminated: 'bg-red-500/10 text-red-400 border-red-500/20', } return (
Accounts / Show Accounts Over Quota

Show Accounts Over Quota

{items.length} account{items.length !== 1 ? 's' : ''} over disk quota

{['Username', 'Domain', 'Package', 'Disk Used', 'Disk Limit', 'Over By', 'Usage', 'Status'].map(h => ( ))} {loading && ( )} {!loading && items.map(acc => { const pct = Math.min(100, Math.round((acc.diskUsedMb / acc.package.diskMb) * 100)) const overBy = acc.diskUsedMb - acc.package.diskMb return ( ) })} {!loading && items.length === 0 && ( )}
{h}
Loading...
{acc.username} {acc.domain} {acc.package.name} {acc.diskUsedMb.toLocaleString()} MB {acc.package.diskMb.toLocaleString()} MB +{overBy.toLocaleString()} MB
{pct}%
{acc.status}
No accounts are over quota
) }