diff --git a/src/src/components/navbar/side-nav-bar-mobile.tsx b/src/src/components/navbar/side-nav-bar-mobile.tsx index 131dec63..43220208 100644 --- a/src/src/components/navbar/side-nav-bar-mobile.tsx +++ b/src/src/components/navbar/side-nav-bar-mobile.tsx @@ -9,16 +9,31 @@ import { } from '@/components/ui/dropdown-menu' import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet' import { AdminMenus } from '@/config' -import { ChevronDown, ChevronRight, CircleUser, Menu, Package2, Settings, User, LogOut } from 'lucide-react' +import { useCurrentUser } from '@/lib/hooks/useCurrentUser' +import { useGrantedPolicies } from '@/lib/hooks/useGrantedPolicies' +import { USER_ROLE } from '@/lib/utils' +import useSession from '@/useSession' +import { + ChevronDown, + ChevronRight, + CircleUser, + LogOut, + Menu, + Package2, + Settings, + User, +} from 'lucide-react' import Link from 'next/link' import { usePathname } from 'next/navigation' -import { useState } from 'react' +import { useMemo, useState } from 'react' import ClientLink from '../ui/client-link' -import useSession from '@/useSession' export default function SideNavBarMobile() { const pathname = usePathname() const sessionData = useSession() + const { can } = useGrantedPolicies() + const currentUser = useCurrentUser() + const isAdmin = currentUser?.roles?.includes(USER_ROLE.ADMIN) ?? false // Initialize expanded menus based on current path const getInitialExpandedMenus = () => { @@ -36,6 +51,29 @@ export default function SideNavBarMobile() { const [expandedMenus, setExpandedMenus] = useState>(getInitialExpandedMenus()) + // Filter menus based on permissions + const visibleMenus = useMemo(() => { + return AdminMenus.filter((menu) => { + // If menu has policy, check permission + if (menu.policy && !can(menu.policy)) { + return false + } + + // If menu has submenus, check if at least one submenu is visible + if (menu.submenus && menu.submenus.length > 0) { + const visibleSubmenus = menu.submenus.filter((submenu) => { + // If submenu has policy, check permission; otherwise show it + return !submenu.policy || can(submenu.policy) + }) + // Show parent menu only if at least one submenu is visible + return visibleSubmenus.length > 0 + } + + // Menu without policy or with permission is visible + return true + }) + }, [can]) + const toggleMenu = (menuName: string) => { const newExpandedMenus = new Set(expandedMenus) if (newExpandedMenus.has(menuName)) { @@ -74,18 +112,25 @@ export default function SideNavBarMobile() { AbpReact - - Admin - + {isAdmin && ( + + Admin + + )} - + {/* Mobile Navigation */}