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 (
| {r.pf_iter} | {fmt(r.n)} |