import { APP_CONFIGS } from '@/frontend/config/appMenus' import { ActionIcon, AppShell, Avatar, Box, Burger, Button, Group, Menu, NavLink, Select, Stack, Text, ThemeIcon } from '@mantine/core' import { useDisclosure } from '@mantine/hooks' import { useMantineColorScheme, useComputedColorScheme } from '@mantine/core' import { Link, useLocation, useMatches, useNavigate, useParams } from '@tanstack/react-router' import { TbApps, TbArrowLeft, TbChevronRight, TbDashboard, TbDeviceMobile, TbLogout, TbSettings, TbUserCircle, TbSun, TbMoon, TbUser, TbHistory } from 'react-icons/tb' interface DashboardLayoutProps { children: React.ReactNode } export function DashboardLayout({ children }: DashboardLayoutProps) { const [mobileOpened, { toggle: toggleMobile }] = useDisclosure() const [desktopOpened, { toggle: toggleDesktop }] = useDisclosure(true) const { toggleColorScheme } = useMantineColorScheme() const computedColorScheme = useComputedColorScheme('light', { getInitialValueInEffect: true }) const location = useLocation() const navigate = useNavigate() const { appId } = useParams({ strict: false }) as { appId?: string } const matches = useMatches() const currentPath = matches[matches.length - 1]?.pathname const globalNav = [ { label: 'Dashboard', icon: TbDashboard, to: '/dashboard' }, { label: 'Applications', icon: TbApps, to: '/apps' }, { label: 'Log Activity', icon: TbHistory, to: '/logs' }, { label: 'Users', icon: TbUser, to: '/users' }, ] const activeApp = appId ? APP_CONFIGS[appId] : null const navLinks = activeApp ? activeApp.menus : globalNav return ( ({ main: { backgroundColor: computedColorScheme === 'dark' ? theme.colors.dark[9] : theme.colors.gray[0], transition: 'background-color 0.2s ease', }, })} > Monitoring System toggleColorScheme()} variant="default" size="lg" aria-label="Toggle color scheme" > {computedColorScheme === 'dark' ? : } Application }>Profile }>Settings Danger Zone }> Logout {activeApp && ( } component={Link} to="/dashboard" styles={(theme) => ({ root: { borderRadius: theme.radius.md, opacity: 0.7, '&:hover': { opacity: 1 }, }, })} /> )} { activeApp &&