import { useState, useEffect, FormEvent } from 'react' import { fetchBlacklist, addBlacklist, type BlacklistEntry } from '../api' function Blacklist() { const [entries, setEntries] = useState([]) const [error, setError] = useState('') const [loading, setLoading] = useState(true) const [target, setTarget] = useState('') const [reason, setReason] = useState('') const [duration, setDuration] = useState('3600') const [adding, setAdding] = useState(false) const [addError, setAddError] = useState('') const [addSuccess, setAddSuccess] = useState('') useEffect(() => { let cancelled = false async function load() { try { const data = await fetchBlacklist() if (!cancelled) { setEntries(data) setError('') } } catch (err: unknown) { if (!cancelled) { setError(err instanceof Error ? err.message : 'Failed to load blacklist') } } finally { if (!cancelled) setLoading(false) } } load() const interval = setInterval(load, 30000) return () => { cancelled = true clearInterval(interval) } }, []) async function handleAdd(e: FormEvent) { e.preventDefault() setAddError('') setAddSuccess('') setAdding(true) try { await addBlacklist(target, 'ip', reason, parseInt(duration, 10)) setAddSuccess(`Added ${target} to blacklist`) setTarget('') setReason('') setDuration('3600') const data = await fetchBlacklist() setEntries(data) } catch (err: unknown) { setAddError(err instanceof Error ? err.message : 'Failed to add entry') } finally { setAdding(false) } } if (loading) return
return ( <>

Blacklist

setTarget(e.target.value)} required /> setReason(e.target.value)} required /> setDuration(e.target.value)} min={1} required />
{addError &&
{addError}
} {addSuccess &&
{addSuccess}
} {error &&
{error}
}
{entries.length === 0 && ( )} {entries.map((e, i) => ( ))}
Target Type Reason Created Expires
No blacklist entries
{e.target} {e.type} {e.reason} {new Date(e.created).toLocaleString()} {new Date(e.expires).toLocaleString()}
) } export default Blacklist