// components/layout/sidebar.tsx "use client"; import { useMemo, useState } from "react"; import Link from "next/link"; import Image from "next/image"; import { usePathname } from "next/navigation"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { LayoutDashboard, Settings, Menu, X, BookOpen, } from "lucide-react"; import { useSidebarStore } from "@/lib/stores/sidebar-store"; import type { ServerPermissions } from "@/lib/auth/server-permissions"; import type { LucideIcon } from "lucide-react"; interface NavigationItem { name: string; href: string; icon: LucideIcon; permission?: string; anyPermissions?: string[]; } const mainNavigation: NavigationItem[] = [ { name: "Dashboard", href: "/dashboard", icon: LayoutDashboard, // No permission required - everyone can see dashboard }, { name: "Knowledge Base", href: "/dashboard/knowledge", icon: BookOpen, // No permission required - everyone can access knowledge base }, ]; const accountNavigation = [{ name: "Settings", href: "/dashboard/settings", icon: Settings }]; interface SidebarProps { permissions: ServerPermissions; } export function Sidebar({ permissions, }: SidebarProps) { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const pathname = usePathname(); const isCollapsed = useSidebarStore((state) => state.isCollapsed); const closeMobileMenu = () => setIsMobileMenuOpen(false); // Filter navigation items based on permissions const visibleNavigation = useMemo(() => { return mainNavigation.filter((item) => { // If no permission required, always show if (!item.permission && !("anyPermissions" in item)) return true; // Check if item has multiple permissions (anyPermissions) if ("anyPermissions" in item && item.anyPermissions) { // User must have at least one of the specified permissions return item.anyPermissions.some((perm) => permissions.permissions.includes(perm as any) ); } // Check single permission if (item.permission) { return permissions.permissions.includes(item.permission as any); } return true; }); }, [permissions.permissions]); return ( <> {/* Mobile menu button */}