feat: fetch version.json on mount, show short SHA + commit link in footer

This commit is contained in:
2026-03-08 00:55:44 -06:00
parent 51bf176f96
commit f4ed8c49ce

View File

@@ -42,8 +42,13 @@ function GiteaIcon() {
); );
} }
function AppFooter() { function AppFooter({ version }) {
const year = new Date().getFullYear(); const year = new Date().getFullYear();
const sha = version?.shortSha || null;
const built = version?.buildTime
? new Date(version.buildTime).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
: null;
return ( return (
<> <>
<style>{` <style>{`
@@ -53,13 +58,27 @@ function AppFooter() {
} }
`}</style> `}</style>
<footer style={sf.footer}> <footer style={sf.footer}>
<span style={sf.copy}>© {year} Jason Stedwell</span> <span style={sf.copy}>&copy; {year} Jason Stedwell</span>
<span style={sf.sep}>·</span> <span style={sf.sep}>&middot;</span>
<DevTicker /> <DevTicker />
<span style={sf.sep}>·</span> <span style={sf.sep}>&middot;</span>
<a href={REPO_URL} target="_blank" rel="noopener noreferrer" style={sf.link}> <a href={REPO_URL} target="_blank" rel="noopener noreferrer" style={sf.link}>
<GiteaIcon /> cpas <GiteaIcon /> cpas
</a> </a>
{sha && sha !== 'dev' && (
<>
<span style={sf.sep}>&middot;</span>
<a
href={`${REPO_URL}/commit/${version.sha}`}
target="_blank"
rel="noopener noreferrer"
style={sf.link}
title={built ? `Built ${built}` : 'View commit'}
>
{sha}
</a>
</>
)}
</footer> </footer>
</> </>
); );
@@ -129,6 +148,14 @@ const sf = {
export default function App() { export default function App() {
const [tab, setTab] = useState('dashboard'); const [tab, setTab] = useState('dashboard');
const [showReadme, setShowReadme] = useState(false); const [showReadme, setShowReadme] = useState(false);
const [version, setVersion] = useState(null);
useEffect(() => {
fetch('/version.json')
.then(r => r.ok ? r.json() : null)
.then(v => { if (v) setVersion(v); })
.catch(() => {});
}, []);
return ( return (
<ToastProvider> <ToastProvider>
@@ -156,7 +183,7 @@ export default function App() {
</div> </div>
</div> </div>
<AppFooter /> <AppFooter version={version} />
{showReadme && <ReadmeModal onClose={() => setShowReadme(false)} />} {showReadme && <ReadmeModal onClose={() => setShowReadme(false)} />}
</div> </div>