import { useCallback, useEffect, useRef, useState } from "react"; import { NavLink, useLocation, useNavigate } from "react-router-dom"; import { useAppStore } from "../../stores/useAppStore"; import { clearStoredAuthToken, getStoredAuthToken } from "../../services/auth"; import "./NavBar.css"; interface Tab { id: string; path: string; label: string; } const tabs: Tab[] = [ { id: "monitoring", path: "/dashboard/monitoring", label: "Monitoring" }, { id: "profiles", path: "/dashboard/profiles", label: "Profiles" }, { id: "settings", path: "/dashboard/settings", label: "Settings" }, ]; interface NavBarProps { onRefresh?: () => void; } export default function NavBar({ onRefresh }: NavBarProps) { const { serverInfo } = useAppStore(); const [refreshing, setRefreshing] = useState(false); const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const tabsRef = useRef(null); const location = useLocation(); const navigate = useNavigate(); const hasStoredToken = getStoredAuthToken() !== ""; // Close mobile menu on route change useEffect(() => { setMobileMenuOpen(false); }, [location]); const handleRefresh = useCallback(() => { if (!onRefresh || refreshing) return; setRefreshing(true); onRefresh(); setTimeout(() => setRefreshing(false), 800); }, [onRefresh, refreshing]); const handleLogout = useCallback(() => { clearStoredAuthToken(); setMobileMenuOpen(false); navigate("/login", { replace: true }); }, [navigate]); useEffect(() => { const handler = (e: KeyboardEvent) => { if (!e.metaKey && !e.ctrlKey) return; const num = parseInt(e.key); if (num >= 1 && num <= tabs.length) { e.preventDefault(); navigate(tabs[num - 1].path); return; } if (e.key === "r" && onRefresh) { e.preventDefault(); handleRefresh(); } }; window.addEventListener("keydown", handler); return () => window.removeEventListener("keydown", handler); }, [navigate, onRefresh, handleRefresh]); return (
PinchTab {/* Desktop nav */}
{serverInfo && (
{serverInfo.restartRequired ? "Restart Required" : "Running"}
)} {hasStoredToken && ( )} {onRefresh && ( )} {/* Mobile menu button */}
{/* Mobile menu dropdown */} {mobileMenuOpen && ( )}
); }