import { Link } from 'react-router-dom' import { motion } from 'framer-motion' import { LogOut, Menu, X } from 'lucide-react' import clsx from 'clsx' import { LAYOUT_NAV_GROUPS, NAV_GROUP_PATHS, type LayoutNavGroup, type LayoutNavItem } from './layoutNavigation' import { SidebarGroup, SidebarLink } from './LayoutSidebarNav' export type LayoutSidebarContentProps = { isSidebarOpen: boolean isMobileDrawerOpen: boolean openGroups: Record isAdmin: boolean username?: string can: (key: string) => boolean isRouteIn: (paths: string[]) => boolean onToggleGroup: (id: string) => void onToggleSidebar: () => void onCloseMobileDrawer: () => void onLogout: () => void } type VisibleLayoutNavGroup = { group: LayoutNavGroup items: LayoutNavItem[] } export function LayoutSidebarContent({ isSidebarOpen, isMobileDrawerOpen, openGroups, isAdmin, username, can, isRouteIn, onToggleGroup, onToggleSidebar, onCloseMobileDrawer, onLogout, }: LayoutSidebarContentProps) { const sidebarExpanded = isSidebarOpen || isMobileDrawerOpen const visibleGroups = visibleSidebarGroups({ isAdmin, can }) return (
) } function visibleSidebarGroups({ isAdmin, can, }: Pick): VisibleLayoutNavGroup[] { const isItemVisible = (item: LayoutNavItem) => (!item.adminOnly || isAdmin) && (!item.permission || can(item.permission)) return LAYOUT_NAV_GROUPS .filter((group) => !group.adminOnly || isAdmin) .map((group) => ({ group, items: group.items.filter(isItemVisible) })) .filter(({ items }) => items.length > 0) } function LayoutSidebarHeader({ sidebarExpanded, onToggleSidebar, onCloseMobileDrawer, }: { sidebarExpanded: boolean onToggleSidebar: () => void onCloseMobileDrawer: () => void }) { return (
MediaStationGo {sidebarExpanded && ( MediaStationGo )}
) } function LayoutSidebarNav({ groups, sidebarExpanded, openGroups, isRouteIn, onToggleGroup, }: { groups: VisibleLayoutNavGroup[] sidebarExpanded: boolean openGroups: Record isRouteIn: (paths: string[]) => boolean onToggleGroup: (id: string) => void }) { return ( ) } function LayoutSidebarNavGroup({ group, items, sidebarExpanded, open, active, onToggleGroup, }: { group: LayoutNavGroup items: LayoutNavItem[] sidebarExpanded: boolean open: boolean active: boolean onToggleGroup: (id: string) => void }) { const GroupIcon = group.icon return ( } label={group.label} collapsed={!sidebarExpanded} open={open} active={active} onToggle={onToggleGroup} > {items.map((item) => { const ItemIcon = item.icon return ( } label={item.label} end={item.end} child /> ) })} ) } function LayoutSidebarLogout({ sidebarExpanded, username, onLogout, }: { sidebarExpanded: boolean username?: string onLogout: () => void }) { return (
) } function SidebarIconButton({ children, className, onClick, }: { children: React.ReactNode className: string onClick: () => void }) { return ( ) }