/* App shell: login gate + tabbed dashboard */ (() => { const { useEffect, useState } = React; function App() { const [authChecked, setAuthChecked] = useState(false); const [authed, setAuthed] = useState(false); const [user, setUser] = useState(null); // App state const [tab, setTab] = useState('new'); // new | results | history const [activeKey, setActiveKey] = useState(null); useEffect(() => { api.me().then(({ authenticated, user }) => { setAuthed(authenticated); setUser(user); }).catch(() => setAuthed(false)).finally(() => setAuthChecked(true)); }, []); async function logout() { await api.logout(); setAuthed(false); setUser(null); setTab('new'); setActiveKey(null); } if (!authChecked) return
Loading…
; if (!authed) return { setAuthed(true); api.me().then(d => setUser(d.user)); }} />; function onCreated(ev) { setActiveKey(ev.public_key); setTab('results'); } function openHistory(key) { setActiveKey(key); setTab('results'); } function reset() { setActiveKey(null); setTab('new'); } return (
{/* Header */}
Tov Law / TCPA IQ 2 BETA
{user || ''}
{/* Tabs */}
setTab('history')} label="History" /> {activeKey && setTab('results')} label={`Case ${activeKey}`} />}
{tab === 'new' && } {tab === 'history' && } {tab === 'results' && activeKey && }
© 2026 Tov Law
); } function Tab({ active, onClick, label }) { return ( ); } ReactDOM.createRoot(document.getElementById('root')).render(); })();