/** * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ "use client"; import { faBars, faTimes, faSun, faMoon, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import Image from "next/image"; import React, { type JSX, useState, useEffect, useCallback } from "react"; import { NavItems } from "../config/NavItems"; import { Rule } from "./rule"; /** * Conditionally renders the navigation component when * not on the home page. * @returns A JSX element. */ export const Navigation = (): JSX.Element | null => { const [ isOpen, setIsOpen ] = useState(false); const [ isDarkMode, setIsDarkMode ] = useState(false); useEffect(() => { const storedTheme = localStorage.getItem("theme"); if (storedTheme === "dark") { document.documentElement.classList.add("dark"); setIsDarkMode(true); } else { document.documentElement.classList.remove("dark"); setIsDarkMode(false); } }, []); const toggleMenu = useCallback((): void => { setIsOpen(!isOpen); }, [ isOpen ]); const toggleDarkMode = useCallback((): void => { document.documentElement.classList.toggle("dark", !isDarkMode); localStorage.setItem("theme", isDarkMode ? "light" : "dark"); setIsDarkMode(!isDarkMode); }, [ isDarkMode ]); return ( <div className="fixed w-full top-0 z-50"> <nav className="w-full flex justify-between items-center h-14 px-4 bg-[--background] text-[--foreground]" > <a href="/"> <Image alt="nhcarrigan's logo" height={50} src="https://cdn.nhcarrigan.com/logo.png" width={50} /> </a> <div className="flex items-center"> <button className="mr-4" onClick={toggleDarkMode} type="button"> <FontAwesomeIcon icon={isDarkMode ? faSun : faMoon} size="lg" /> </button> <button onClick={toggleMenu} type="button"> <FontAwesomeIcon icon={isOpen ? faTimes : faBars} size="2x" /> </button> </div> </nav> {isOpen ? <div className="bg-[--background] text-[--foreground] h-[50vh] overflow-y-auto"> {NavItems.map((item, index) => { return ( <a className="block py-2 px-4 text-2xl hover:bg-[--foreground] hover:text-[--background]" href={item.href} key={item.href} onClick={toggleMenu} > {index % 2 === 1 ? "🩷" : "🩵"} {item.text} </a> ); })} </div> : null} <Rule /> </div> ); };