import { useEffect, useState } from 'react' import { RefreshCw, Globe, Plus, Trash2 } from 'lucide-react' import { api } from '../api/client' interface Zone { id: number; domain: string; status: string; account: { username: string }; _count: { records: number } } interface Record_ { id: number; type: string; name: string; value: string; ttl: number; priority: number | null } export default function DNS() { const [zones, setZones] = useState([]) const [selected, setSelected] = useState(null) const [records, setRecords] = useState([]) const [loading, setLoading] = useState(false) const [showForm, setShowForm] = useState(false) const [form, setForm] = useState({ type: 'A', name: '@', value: '', ttl: 3600, priority: '' }) const [saving, setSaving] = useState(false) const fetchZones = async () => { setLoading(true) try { const r = await api.get('/nixserver/dns'); setZones(r.data.data) } finally { setLoading(false) } } const loadZone = async (zone: Zone) => { setSelected(zone) const r = await api.get(`/nixserver/dns/${zone.id}`) setRecords(r.data.data.records ?? []) } useEffect(() => { fetchZones() }, []) const addRecord = async (e: React.FormEvent) => { e.preventDefault(); if (!selected) return setSaving(true) try { await api.post(`/nixserver/dns/${selected.id}/records`, { ...form, priority: form.priority ? parseInt(form.priority, 10) : undefined }) setShowForm(false) loadZone(selected) } catch (err: unknown) { alert((err as { response?: { data?: { error?: string } } })?.response?.data?.error ?? 'Failed') } finally { setSaving(false) } } const deleteRecord = async (recordId: number) => { if (!selected || !confirm('Delete this DNS record?')) return try { await api.delete(`/nixserver/dns/${selected.id}/records/${recordId}`); loadZone(selected) } catch {} } return (

DNS

{zones.length} zones

{/* Zone list */}

Zones

{zones.map(z => ( ))} {zones.length === 0 &&
No zones
}
{/* Records */}
{selected ? ( <>

{selected.domain}

{showForm && (
setForm(f => ({ ...f, name: e.target.value }))} placeholder="Name" required className="bg-[#0f1117] border border-[#2a2d3e] text-white text-xs rounded px-2 py-1.5 w-28 focus:outline-none focus:border-indigo-500" /> setForm(f => ({ ...f, value: e.target.value }))} placeholder="Value" required className="bg-[#0f1117] border border-[#2a2d3e] text-white text-xs rounded px-2 py-1.5 flex-1 min-w-32 focus:outline-none focus:border-indigo-500" /> {form.type === 'MX' && setForm(f => ({ ...f, priority: e.target.value }))} placeholder="Priority" type="number" className="bg-[#0f1117] border border-[#2a2d3e] text-white text-xs rounded px-2 py-1.5 w-20 focus:outline-none" />}
)} {['Type','Name','Value','TTL',''].map(h => )} {records.map(r => ( ))} {records.length === 0 && }
{h}
{r.type} {r.name} {r.value} {r.ttl}
No records
) : (
Select a zone to view records
)}
) }