import { Fragment } from "react"; import { Link, NavLink, Outlet } from "react-router-dom"; import { Disclosure, Menu, Transition } from "@headlessui/react"; import { BookOpenIcon, UserIcon } from "@heroicons/react/24/solid"; import { Bars3Icon, XMarkIcon, MegaphoneIcon } from "@heroicons/react/24/outline"; import { AuthContext } from "../utils/Context"; import logo from "../logo.png"; import { useQuery } from "react-query"; import { APIClient } from "../api/APIClient"; interface NavItem { name: string; path: string; } function classNames(...classes: string[]) { return classes.filter(Boolean).join(" "); } export default function Base() { const authContext = AuthContext.useValue(); const nav: Array = [ { name: "Dashboard", path: "/" }, { name: "Filters", path: "/filters" }, { name: "Releases", path: "/releases" }, { name: "Settings", path: "/settings" }, { name: "Logs", path: "/logs" } ]; const { data } = useQuery( ["updates"], () => APIClient.updates.getLatestRelease(), { retry: false, refetchOnWindowFocus: false, onError: err => console.log(err) } ); return (
{({ open }) => ( <>
Logo Logo
{nav.map((item, itemIdx) => ( classNames( "hover:bg-gray-200 dark:hover:bg-gray-800 hover:text-gray-900 dark:hover:text-white px-3 py-2 rounded-2xl text-sm font-medium", "transition-colors duration-200", isActive ? "text-black dark:text-gray-50 font-bold" : "text-gray-600 dark:text-gray-500" ) } end={item.path === "/"} > {item.name} ))} Docs
{({ open }) => ( <> Open user menu for{" "} {authContext.username} {({ active }) => ( Settings )} {({ active }) => ( Logout )} )}
{/* Mobile menu button */} Open main menu {open ? (
{data && data.html_url && (
New update available! {data?.name}
)}
{nav.map((item) => ( classNames( "shadow-sm border bg-gray-100 border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-white block px-3 py-2 rounded-md text-base", isActive ? "underline underline-offset-2 decoration-2 decoration-sky-500 font-bold text-black" : "font-medium" ) } end={item.path === "/"} > {item.name} ))} Logout
)}
); }