import { useMemo, useState } from 'react' import { useAppStore } from '@/store/appStore' import type { VerdictLabel } from '@/lib/types' import { confidencePercent, verdictColor } from '@/lib/utils' export function ClaimsTable() { const run = useAppStore((s) => s.runs.find((r) => r.id === s.currentRunId)) const filter = useAppStore((s) => s.ui.filter) const setFilter = useAppStore((s) => s.setFilter) const openEvidence = useAppStore((s) => s.openEvidence) const [sortAsc, setSortAsc] = useState(false) const rows = useMemo(() => { if (!run?.report) return [] const { claims, verdicts, evidence } = run.report const byClaim: Record = {} for (const c of claims) byClaim[c.id] = { claim: c } for (const v of verdicts) byClaim[v.claim_id] = { ...(byClaim[v.claim_id] || {}), verdict: v } let data = Object.values(byClaim) if (filter !== 'all') { data = data.filter((r: any) => r.verdict?.label === filter) } data.sort((a: any, b: any) => (sortAsc ? (a.verdict?.confidence ?? 0) - (b.verdict?.confidence ?? 0) : (b.verdict?.confidence ?? 0) - (a.verdict?.confidence ?? 0))) return data.map((r: any) => { const cited = r.verdict?.citation_ids as string[] | undefined const firstId = (cited && cited[0]) || r.verdict?.best_evidence_id const evid = firstId ? evidence.find((e) => e.doc_id === firstId) : undefined return { ...r, evidence: evid } }) }, [run, filter, sortAsc]) if (!run?.report) return null const filters: ('all' | VerdictLabel)[] = ['all', 'supported', 'refuted', 'insufficient'] return (

Claims

{filters.map((f) => ( ))}
{rows.map((r: any, idx: number) => ( ))}
Claim Verdict Confidence Evidence
{r.claim?.text}
{r.claim?.speaker && (
{r.claim.speaker}
)}
{r.verdict && ( {labelText(r.verdict.label)} )}
{confidencePercent(r.verdict?.confidence)}%
{r.evidence ? ( ) : ( )}
) } function labelText(v: VerdictLabel): string { switch (v) { case 'supported': return 'Supported' case 'refuted': return 'Refuted' default: return 'Insufficient' } }