import { Link } from "react-router"; import Logo from "/MAV.svg"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faGear, faListCheck, faMaximize, faMinimize, faRotate, } from "@fortawesome/free-solid-svg-icons"; import type { VersionFieldType } from "../../types/types"; import { useEffect, useState } from "react"; import SoundBtn from "./SoundBtn"; async function fetchVersions( signal?: AbortSignal ): Promise { try { const res = await fetch("http://192.168.75.11/api/versions", { signal }); if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); } catch (error) { console.log(error); return undefined; } } const pad = (n: number) => String(n).padStart(2, "0"); const normalizeToMs = (ts: number) => (ts < 1e12 ? ts * 1000 : ts); // seconds → ms if needed function formatFromMs(ms: number, tz: "local" | "utc" = "local") { const d = new Date(ms); const h = tz === "utc" ? d.getUTCHours() : d.getHours(); const m = tz === "utc" ? d.getUTCMinutes() : d.getMinutes(); const s = tz === "utc" ? d.getUTCSeconds() : d.getSeconds(); const day = tz === "utc" ? d.getUTCDate() : d.getDate(); const month = (tz === "utc" ? d.getUTCMonth() : d.getMonth()) + 1; const year = tz === "utc" ? d.getUTCFullYear() : d.getFullYear(); return `${pad(h)}:${pad(m)}:${pad(s)} ${pad(day)}-${pad(month)}-${year}`; } export default function Header() { const [offsetMs, setOffsetMs] = useState(null); const [nowMs, setNowMs] = useState(Date.now()); const [isFullscreen, setIsFullscreen] = useState(false); const toggleFullscreen = () => { if (!document.fullscreenElement) { // Enter fullscreen on the entire app document.documentElement.requestFullscreen(); setIsFullscreen(true); } else { // Exit fullscreen document.exitFullscreen(); setIsFullscreen(false); } }; const refreshBrowser = () => { window.location.reload(); }; useEffect(() => { const ac = new AbortController(); fetchVersions(ac.signal) .then((data) => { if (!data) throw new Error("No data"); const serverMs = normalizeToMs(data?.timeStamp); setOffsetMs(serverMs - Date.now()); }) .catch((err) => { console.log(err); }); return () => ac.abort("failed"); }, []); useEffect(() => { let timer: number; const schedule = () => { const now = Date.now(); setNowMs(now); const delay = 1000 - (now % 1000); timer = window.setTimeout(schedule, delay); }; schedule(); return () => clearTimeout(timer); }, []); const serverNowMs = offsetMs == null ? nowMs : nowMs + offsetMs; const localStr = formatFromMs(serverNowMs, "local"); const utcStr = formatFromMs(serverNowMs, "utc"); return (
Logo

Local: {localStr}

UTC: {utcStr}

{isFullscreen ? ( ) : ( )}
); }