import { useState } from 'react'; import { api } from '../lib/api'; import type { Report } from '../lib/types'; import { useApi } from '../lib/useApi'; import { PageHeader } from '../components/PageHeader'; import { Empty } from '../components/Empty'; import { Modal } from '../components/Modal'; import { useToast } from '../components/Toast'; import { absoluteTime, relativeTime } from '../lib/format'; import { RefreshCw } from '../components/Icons'; export function Reports() { const { data, loading, error, refresh } = useApi('/reports?take=100'); const [resolving, setResolving] = useState(null); return (
Refresh } /> {error &&
{error}
}
{data && data.length === 0 && } {data && data.length > 0 && (
{data.map(r => ( ))}
# Reporter Target Reason Filed
{r.id} #{r.reporterPlayerId} #{r.targetPlayerId}
{r.reason || '—'}
{r.context &&
{r.context}
}
{relativeTime(r.createdAt)}
)}
{resolving && setResolving(null)} onResolved={() => { setResolving(null); refresh(); }} />}
); } function ResolveModal({ report, onClose, onResolved }: { report: Report; onClose: () => void; onResolved: () => void }) { const [note, setNote] = useState(''); const [busy, setBusy] = useState(false); const toast = useToast(); const submit = async () => { setBusy(true); try { await api(`/reports/${report.id}/resolve`, { method: 'POST', body: { Note: note } }); toast.push('Report resolved', 'success'); onResolved(); } catch (e) { toast.push((e as Error).message, 'error'); } finally { setBusy(false); } }; return ( } >
Reporter
#{report.reporterPlayerId}
Target
#{report.targetPlayerId}
Reason
{report.reason || '—'}
{report.context && (
Context
{report.context}
)}