import ChevronRightIcon from '@heroicons/react/24/outline/ChevronRightIcon' import { useRef, useState, useEffect } from 'react' import { NavLink, useLocation } from 'react-router-dom' import { Sidenav, initTE } from 'tw-elements' import SidebarSubmenu from './SidebarSubmenu' export interface Route { path: string icon: JSX.Element name: string submenu?: Route[] blank?: boolean } interface SidenavType extends HTMLElement { toggleSlim(): void toggle(): void } /** * @category AppShell */ export function SideBar({ routes, bottomRoutes }: { routes: Route[]; bottomRoutes?: Route[] }) { // prevent react18 from calling useEffect twice const init = useRef(false) const location = useLocation() const [instance, setInstance] = useState() const [slim, setSlim] = useState(false) const toggleSlim = () => { setSlim(!slim) instance?.toggleSlim() } useEffect(() => { if (!init.current) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call initTE({ Sidenav }) // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call const instance = Sidenav.getInstance(document.getElementById('sidenav')) as SidenavType setInstance(instance) instance.toggleSlim() init.current = true } }, []) const [embedded, setEmbedded] = useState(true) useEffect(() => { const params = new URLSearchParams(location.search) const embedded = params.get('embedded') embedded !== 'true' && setEmbedded(false) }, [location]) const params = new URLSearchParams(window.location.search) return ( ) }