import { useEffect, useState } from "react"; import { api } from "./api.js"; interface AuditEntry { at: string; operator: string; action: string; target?: string; } const INITIAL = 7; const STEP = 25; export function AuditPanel() { const [entries, setEntries] = useState([]); const [visible, setVisible] = useState(INITIAL); const [error, setError] = useState(null); useEffect(() => { api .audit() .then((r) => setEntries(r.entries)) .catch((e) => setError(e.message)); }, []); return (

Audit Log

{error &&
{error}
} {entries.length === 0 && !error && (

no actions recorded yet

)} {entries.length > 0 && ( {entries.slice(0, visible).map((e, i) => ( ))}
When Action Target Operator
{new Date(e.at).toLocaleString()} {e.action} {e.target ?? "—"} {e.operator}
)} {entries.length > visible && ( )}
); }