"use client"; import { useEffect, useState } from "react"; import type { VersionInfo } from "@/lib/versionInfo"; const EMPTY: VersionInfo = { version: null, tag: null, gitDescribe: null, commitHash: null, commitDate: null, commitSubject: null, buildTime: null, }; function resolveVersionLabel(info: VersionInfo): string { return info.gitDescribe ?? info.tag ?? info.version ?? "unknown version"; } function formatCommitDate(iso: string | null): string | null { if (!iso) return null; const date = new Date(iso); if (Number.isNaN(date.getTime())) return null; return date.toLocaleString("en-US", { year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", }); } const VersionOverlay = ({ canSeeCommit }: { canSeeCommit: boolean }) => { const [info, setInfo] = useState(null); useEffect(() => { let cancelled = false; void fetch("/api/version", { cache: "no-store" }) .then((res) => res.json() as Promise) .then((data) => { if (!cancelled) setInfo(data); }) .catch(() => { if (!cancelled) setInfo(EMPTY); }); return () => { cancelled = true; }; }, []); const resolved = info ?? EMPTY; const versionLabel = resolveVersionLabel(resolved); const lastUpdated = formatCommitDate(resolved.commitDate); const commitInfo = resolved.commitHash && resolved.commitSubject ? `${resolved.commitHash} ยท ${resolved.commitSubject}` : (resolved.commitHash ?? resolved.commitSubject ?? null); const showSecondary = lastUpdated !== null || commitInfo !== null; return (
version {versionLabel} {showSecondary && ( {lastUpdated && <>last updated {lastUpdated}} {lastUpdated && commitInfo &&
} {canSeeCommit && commitInfo && {commitInfo}}
)}
); }; export default VersionOverlay;