import { useEffect, useState } from 'react' import { Plus, Trash2, RefreshCw } from 'lucide-react' import { api } from '../api/client' interface EmailAccount { id: number; address: string; domain: string; quotaMb: number; usedMb: number; status: string } export default function Email() { const [accounts, setAccounts] = useState([]) const [loading, setLoading] = useState(false) const [showModal, setShowModal] = useState(false) const [saving, setSaving] = useState(false) const [error, setError] = useState('') const [hosting, setHosting] = useState<{ id: number; username: string; domain: string }[]>([]) const [form, setForm] = useState({ accountId: '', username: '', password: '', quotaMb: 500 }) const fetch = async () => { setLoading(true) try { const [em, acc] = await Promise.all([api.get('/nixserver/email'), api.get('/nixserver/accounts?limit=100')]) setAccounts(em.data.data) setHosting(acc.data.data.items) } finally { setLoading(false) } } useEffect(() => { fetch() }, []) const save = async (e: React.FormEvent) => { e.preventDefault(); setSaving(true); setError('') try { await api.post('/nixserver/email', { ...form, accountId: parseInt(form.accountId, 10), quotaMb: form.quotaMb }) setShowModal(false); fetch() } catch (err: unknown) { setError((err as { response?: { data?: { error?: string } } })?.response?.data?.error ?? 'Failed') } finally { setSaving(false) } } const del = async (id: number, address: string) => { if (!confirm(`Delete ${address}?`)) return try { await api.delete(`/nixserver/email/${id}`); fetch() } catch (err: unknown) { alert((err as { response?: { data?: { error?: string } } })?.response?.data?.error ?? 'Failed') } } return (

Email Accounts

{accounts.length} accounts

{['Address', 'Quota', 'Used', 'Status', ''].map(h => )} {accounts.map(a => ( ))} {!loading && accounts.length === 0 && }
{h}
{a.address} {a.quotaMb} MB {a.usedMb} MB {a.status}
No email accounts
{showModal && (

New Email Account

{error &&
{error}
}
setForm(f => ({ ...f, username: e.target.value }))} required placeholder="info" className="w-full bg-[#0f1117] border border-[#2a2d3e] text-white text-sm rounded px-3 py-2 focus:outline-none focus:border-indigo-500" />
setForm(f => ({ ...f, password: e.target.value }))} required className="w-full bg-[#0f1117] border border-[#2a2d3e] text-white text-sm rounded px-3 py-2 focus:outline-none focus:border-indigo-500" />
)}
) }