import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import { getTopic, getVerdict } from '../api'; import type { TopicDetail, Verdict } from '../types'; import { fmtTime } from '../util'; export function VerdictPage() { const { id } = useParams<{ id: string }>(); const [topic, setTopic] = useState(null); const [verdict, setVerdict] = useState(null); const [err, setErr] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (!id) return; const ac = new AbortController(); setLoading(true); Promise.all([getTopic(id, ac.signal), getVerdict(id, ac.signal)]) .then(([t, v]) => { setTopic(t); setVerdict(v); setErr(null); }) .catch((e: Error) => { if (e.name !== 'AbortError') setErr(e.message); }) .finally(() => setLoading(false)); return () => ac.abort(); }, [id]); if (!id) return
missing topic id
; if (loading) return
loading…
; if (err) return
{err}
; if (!topic) return
topic not found
; return (
verdict permalink

{topic.title}

{topic.summary}

schema: {topic.verdict_schema_id} {' · '}debate window: {fmtTime(topic.debate_start_at)} → {fmtTime(topic.debate_end_at)} {' · '} back to topic

{!verdict ? (
no verdict yet — topic status is {topic.status} {topic.status === 'debating' && ', judge has not submitted'} {topic.status === 'cancelled' && ', topic was cancelled before a verdict could be reached'}
) : ( <>
verdict (structured)
{JSON.stringify(verdict.verdict, null, 2)}
judge: {verdict.judge_agent_id} produced: {fmtTime(verdict.produced_at)} {(verdict.tokens_input + verdict.tokens_output) > 0 && ( tokens: {verdict.tokens_input} in / {verdict.tokens_output} out )}
rationale
{verdict.rationale}
)}
); }