import { NavLink, useLocation } from 'react-router-dom'; import { cn } from '@/lib/utils'; import { useAuth } from '@/contexts/AuthContext'; import { getRoleLabel } from '@/data/dummyData'; import { LayoutDashboard, FileText, Warehouse, ClipboardCheck, Award, Receipt, Users, Settings, LogOut, ChevronLeft, ChevronRight, Package, Factory, BarChart3, Fish, X, Calendar, } from 'lucide-react'; import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Avatar, AvatarFallback } from '@/components/ui/avatar'; import { useIsMobile } from '@/hooks/use-mobile'; interface NavItem { label: string; href: string; icon: React.ComponentType<{ className?: string }>; roles?: string[]; } const navItems: NavItem[] = [ { label: 'Dashboard', href: '/dashboard', icon: LayoutDashboard }, { label: 'Hatcheries', href: '/hatcheries', icon: Fish }, { label: 'Farms', href: '/farms', icon: Warehouse }, { label: 'Applications', href: '/applications', icon: FileText }, { label: 'Audits', href: '/audits', icon: ClipboardCheck }, { label: 'FOI Applications', href: '/foi/applications', icon: ClipboardCheck, roles: ['foi'] }, { label: 'FO Field Visits', href: '/fo/visits', icon: ClipboardCheck, roles: ['fo'] }, { label: 'CC Officer Audits', href: '/cc-officer/audits', icon: ClipboardCheck, roles: ['cc_officer'] }, { label: 'Certificates', href: '/certificates', icon: Award }, { label: 'CC Certification', href: '/cc-officer/certification', icon: Award, roles: ['cc_officer'] }, { label: 'JD Approvals', href: '/jd/approvals', icon: ClipboardCheck, roles: ['jd'] }, { label: 'Director Approvals', href: '/director/approvals', icon: ClipboardCheck, roles: ['director'] }, { label: 'Surveillance Schedule', href: '/surveillance-schedule', icon: Calendar }, { label: 'Raw Materials', href: '/raw-materials', icon: Package }, { label: 'Processors', href: '/processors', icon: Factory }, { label: 'TA Claims', href: '/ta-claims', icon: Receipt }, { label: 'Reports', href: '/reports', icon: BarChart3 }, { label: 'Users', href: '/users', icon: Users, roles: ['admin'] }, { label: 'Settings', href: '/settings', icon: Settings }, ]; interface SidebarProps { mobileOpen: boolean; onMobileClose: () => void; } export function Sidebar({ mobileOpen, onMobileClose }: SidebarProps) { const [collapsed, setCollapsed] = useState(false); const { user, logout } = useAuth(); const location = useLocation(); const isMobile = useIsMobile(); // Close sidebar on mobile when route changes useEffect(() => { if (isMobile && mobileOpen) { onMobileClose(); } }, [location.pathname]); const filteredNavItems = navItems.filter(item => { if (!item.roles) return true; return user && item.roles.includes(user.role); }); const roleSpecificNavItems = filteredNavItems.filter((item) => { if (!user) return false; if (user.role === 'cc_officer') { const allowedForCcOfficer = new Set([ '/dashboard', '/hatcheries', '/farms', '/applications', '/cc-officer/audits', '/certificates', '/cc-officer/certification', ]); return allowedForCcOfficer.has(item.href); } if (user.role === 'foi') { const allowedForFoi = new Set([ '/dashboard', '/foi/applications', ]); return allowedForFoi.has(item.href); } if (user.role === 'fo') { const allowedForFo = new Set([ '/dashboard', '/fo/visits', ]); return allowedForFo.has(item.href); } if (user.role === 'jd') { const allowedForJd = new Set([ '/dashboard', '/jd/approvals', '/surveillance-schedule', ]); return allowedForJd.has(item.href); } if (user.role === 'director') { const allowedForDirector = new Set([ '/dashboard', '/director/approvals', '/surveillance-schedule', ]); return allowedForDirector.has(item.href); } return true; }); return ( <> {/* Mobile overlay */} {isMobile && mobileOpen && (
)} ); }