import React, { useState } from "react"; import { useLocation, useNavigate } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; import { getRecoil } from "recoil-nexus"; import { sessionStore } from '../../stores' import About from '../icons/About' import BrandLogo from '../icons/BrandLogo' import Disconnect from '../icons/Disconnect' import Home from '../icons/Home' import NavItem from './NavItem' import PhotoGallery from '../icons/PhotoGallery' import Settings from '../icons/Settings' const navItemsUpper = [ { label: 'Home', href: '/', icon: Home }, { label: 'Collection', href: '/playlists/', icon: PhotoGallery }, { label: 'Account Settings', href: '/settings/', icon: Settings } ] const navItemsLower = [ { label: "About This Template", href: "/about/", icon: About, }, { label: "Disconnect", callback: async () => { const session = getRecoil(sessionStore) await session.session.destroy(); // Force a hard refresh to ensure everything is disconnected properly window.location.href = window.location.origin; }, icon: Disconnect, placement: "bottom", }, ]; const SidebarNav = ({ children }: any) => { const location = useLocation(); const navigate = useNavigate(); const session = useRecoilValue(sessionStore); const [checked, setChecked] = useState(false) const handleCloseDrawer = (): void => { setChecked(false) }; const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => { setChecked(event.target.checked); }; // Only render the nav if the user is authed and not in the connection flow if (session.session) { return ( <div className="h-screen drawer drawer-mobile"> <input id="sidebar-nav" className="drawer-toggle" type="checkbox" checked={checked} onChange={handleChange} /> <div className="flex flex-col drawer-content">{children}</div> <div className={`drawer-side ${ location.pathname.match(/register|backup|delegate|recover/) ? "!hidden" : "" }`} > <label htmlFor="sidebar-nav" className="drawer-overlay !bg-[#262626] !opacity-[.85]" /> <div className="p-4 overflow-y-auto menu w-80 bg-base-100 text-base-content"> {/* Brand */} <div className="flex items-center gap-3 mb-8 cursor-pointer" onClick={() => { handleCloseDrawer(); navigate("/"); }} > <BrandLogo /> </div> {/* Upper Menu */} <ul> {navItemsUpper.map((item, key) => ( <NavItem handleCloseDrawer={handleCloseDrawer} item={item} key={key} /> ))} </ul> {/* Lower Menu */} <ul className="pb-8 mt-auto"> {navItemsLower.map((item, key) => ( <NavItem handleCloseDrawer={handleCloseDrawer} item={item} key={key} /> ))} </ul> </div> </div> </div> ); } return children; } export default SidebarNav;