import { useState, useEffect, useCallback } from 'react' import useTheme from '../theme.jsx' import useAuth from '../auth.jsx' export default function StatusBar({ view, sources = [], sourceId, setSourceId, versions = [], versionId, setVersionId }) { const { dark, setDark } = useTheme() const { user, logout } = useAuth() const showVersion = view === 'baseline' || view === 'forecast' const selectedVersion = versions.find(v => String(v.id) === String(versionId)) const [info, setInfo] = useState(null) const [showInfo, setShow] = useState(false) const [copied, setCopied] = useState(false) const refreshInfo = useCallback(async () => { if (!versionId || !showVersion) { setInfo(null); return } try { const r = await fetch(`/api/versions/${versionId}/table-info`) setInfo(r.ok ? await r.json() : null) } catch { setInfo(null) } }, [versionId, showVersion]) useEffect(() => { refreshInfo() }, [refreshInfo]) // operations broadcast this after a write so the row count stays honest useEffect(() => { const onChange = () => refreshInfo() window.addEventListener('pf-data-changed', onChange) return () => window.removeEventListener('pf-data-changed', onChange) }, [refreshInfo]) async function copyTable() { if (!info?.fc_table) return try { await navigator.clipboard.writeText(info.fc_table) setCopied(true) setTimeout(() => setCopied(false), 1200) } catch {} } const fmt = (n) => n == null ? '—' : n.toLocaleString() return (
Source {showVersion && ( <> | Version {selectedVersion && ( {selectedVersion.status} )} {/* write target — the physical table every operation appends to */} {info && ( <> | writes to {info.exists ? `${fmt(info.rows)} rows` : 'not created'} {showInfo && (
Write target
table {info.fc_table} reads from {info.source} total rows {fmt(info.rows)}
{info.by_iter?.length > 0 && ( <>
Rows by iter
{info.by_iter.map(r => ( ))}
{r.pf_iter} {fmt(r.n)}
)}
)} )} )}
{user && ( <> {user.display_name || user.username} )}
) }