import { useState, useEffect, useCallback } from 'react'; import { getDiagLog, clearDiagLog } from '../api/dns'; import ConfirmDialog from './ConfirmDialog'; import { exportCsv } from '../utils/exportCsv'; const PAGE_SIZE = 50; function formatDate(iso) { if (!iso) return '—'; const d = new Date(iso); return `${d.toLocaleDateString('sv-SE')} ${d.toLocaleTimeString('sv-SE', { hour: '2-digit', minute: '2-digit', second: '2-digit' })}`; } export default function DiagnosticsPage() { const [entries, setEntries] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(0); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [filterProvider, setFilterProvider] = useState(''); const [filterOk, setFilterOk] = useState(''); const [confirmClear, setConfirmClear] = useState(false); const load = useCallback((pg = 0) => { setLoading(true); setError(''); getDiagLog({ provider: filterProvider || undefined, ok: filterOk !== '' ? filterOk : undefined, limit: PAGE_SIZE, offset: pg * PAGE_SIZE, }) .then(({ entries, total }) => { setEntries(entries); setTotal(total); }) .catch(e => setError(e.message)) .finally(() => setLoading(false)); }, [filterProvider, filterOk]); useEffect(() => { setPage(0); load(0); }, [load]); function goToPage(pg) { setPage(pg); load(pg); } async function handleClear() { await clearDiagLog(); setConfirmClear(false); setEntries([]); setTotal(0); } const totalPages = Math.ceil(total / PAGE_SIZE); const errorCount = entries.filter(e => !e.ok).length; return (

Provider Diagnostics

Every API call made to DNS providers — last 200 entries. Use this to troubleshoot connectivity issues.

{error &&
Error: {error}
}
{total} entries{errorCount > 0 && · {errorCount} errors on this page}
{loading ?

Loading…

: entries.length === 0 ? (

No diagnostic entries yet — make a DNS operation (sync, add, delete) to populate the log.

) : ( <>
{entries.map(e => ( ))}
Time Provider Operation Status Latency URL Error
{formatDate(e.timestamp)} {e.provider} {e.operation} {e.status ?? 'ERR'} 2000 ? '#f59e0b' : 'var(--text-muted)' }}> {e.latency}ms {e.url} {e.error ?? ''}
{totalPages > 1 && (
Page {page + 1} of {totalPages}
)} )} {confirmClear && ( setConfirmClear(false)} /> )}
); }