import React, { useState, useEffect } from 'react' import { api } from '../api' import type { CausalTriple } from '../types' interface Props { documentId: string } export function TripleTable({ documentId }: Props) { const [triples, setTriples] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [minConf, setMinConf] = useState(0) const [themeFilter, setThemeFilter] = useState('') useEffect(() => { api.getTriples(documentId) .then(r => setTriples(r.triples)) .catch(e => setError(String(e.message))) .finally(() => setLoading(false)) }, [documentId]) const themes = [...new Set(triples.map(t => t.theme))].filter(Boolean) const filtered = triples .filter(t => t.confidence >= minConf) .filter(t => !themeFilter || t.theme === themeFilter) if (loading) return
if (error) return
{error}
return (
Min Confidence
setMinConf(Number(e.target.value))} style={{ width: 120 }} /> {minConf.toFixed(2)}
{themes.length > 0 && (
Theme
)}
{filtered.length} / {triples.length} triples
{['Cause', 'Relation', 'Effect', 'Theme', 'Conf', 'Evidence'].map(h => ( ))} {filtered.map(t => ( ))}
{h}
{t.cause} {t.relation} {t.effect} {t.theme} = 0.7 ? 'var(--success)' : t.confidence >= 0.5 ? 'var(--warning)' : 'var(--danger)', fontWeight: 600, }}>{t.confidence.toFixed(2)} {t.evidence}
{filtered.length === 0 && (

No triples match filters.

)}
) }