Spaces:
Runtime error
Runtime error
| import clsx from "clsx"; | |
| import type { ReactNode } from "react"; | |
| import { useState } from "react"; | |
| import AppHead from "../components/AppHead"; | |
| import LeftSidebar from "../components/drawer/LeftSidebar"; | |
| import { SidebarControlButton } from "../components/drawer/Sidebar"; | |
| import { useConfigStore } from "../stores/configStore"; | |
| type SidebarSettings = { | |
| mobile: boolean; | |
| desktop: boolean; | |
| }; | |
| type DashboardLayoutProps = { | |
| children: ReactNode; | |
| rightSidebar?: ReactNode; | |
| onReload?: () => void; | |
| }; | |
| const defaultState: SidebarSettings = { | |
| mobile: false, | |
| desktop: true, | |
| }; | |
| const setMobile = | |
| (settings: SidebarSettings, setSettings: (SidebarSettings) => void) => (open: boolean) => | |
| setSettings({ | |
| mobile: open, | |
| desktop: settings.desktop, | |
| }); | |
| const setDesktop = | |
| (settings: SidebarSettings, setSettings: (SidebarSettings) => void) => (open: boolean) => | |
| setSettings({ | |
| mobile: settings.mobile, | |
| desktop: open, | |
| }); | |
| const DashboardLayout = (props: DashboardLayoutProps) => { | |
| const [leftSettings, setLeftSettings] = useState(defaultState); | |
| const { layout, setLayout } = useConfigStore(); | |
| return ( | |
| <> | |
| <AppHead /> | |
| {/* Left sidebar */} | |
| {/* Mobile */} | |
| <LeftSidebar | |
| show={leftSettings.mobile} | |
| setShow={setMobile(leftSettings, setLeftSettings)} | |
| onReload={props.onReload} | |
| /> | |
| <div className={leftSettings.mobile ? "hidden" : "lg:hidden"}> | |
| <SidebarControlButton | |
| side="left" | |
| show={leftSettings.mobile} | |
| setShow={setMobile(leftSettings, setLeftSettings)} | |
| /> | |
| </div> | |
| {/* Desktop */} | |
| <div className="hidden lg:visible lg:inset-y-0 lg:flex lg:w-64 lg:flex-col"> | |
| <LeftSidebar | |
| show={leftSettings.desktop} | |
| setShow={setDesktop(leftSettings, setLeftSettings)} | |
| onReload={props.onReload} | |
| /> | |
| </div> | |
| <div className={leftSettings.desktop ? "hidden" : "hidden lg:block"}> | |
| <SidebarControlButton | |
| side="left" | |
| show={leftSettings.desktop} | |
| setShow={setDesktop(leftSettings, setLeftSettings)} | |
| /> | |
| </div> | |
| {/* Right sidebar */} | |
| {/* Mobile */} | |
| {props.rightSidebar && ( | |
| <> | |
| <div className="lg:inset-y-0 lg:flex lg:w-64 lg:flex-col">{props.rightSidebar}</div> | |
| <SidebarControlButton | |
| side="right" | |
| show={layout.showRightSidebar} | |
| setShow={(show) => setLayout({ showRightSidebar: show })} | |
| /> | |
| </> | |
| )} | |
| <main | |
| className={clsx( | |
| "bg-gradient-to-b from-slate-7 to-slate-3", | |
| leftSettings.desktop && "lg:pl-64", | |
| props.rightSidebar && layout.showRightSidebar && "lg:pr-64" | |
| )} | |
| > | |
| <div className="min-w-screen min-h-screen">{props.children}</div> | |
| </main> | |
| </> | |
| ); | |
| }; | |
| export default DashboardLayout; | |