| import { | |
| LayoutDashboard, | |
| Upload, | |
| FileText, | |
| FileEdit, | |
| Settings, | |
| Users, | |
| LogOut, | |
| Zap, | |
| } from "lucide-react"; | |
| import { NavLink } from "@/components/NavLink"; | |
| import { useLocation } from "react-router-dom"; | |
| import { | |
| Sidebar, | |
| SidebarContent, | |
| SidebarGroup, | |
| SidebarGroupContent, | |
| SidebarGroupLabel, | |
| SidebarMenu, | |
| SidebarMenuButton, | |
| SidebarMenuItem, | |
| SidebarFooter, | |
| useSidebar, | |
| } from "@/components/ui/sidebar"; | |
| const mainItems = [ | |
| { title: "Dashboard", url: "/dashboard", icon: LayoutDashboard }, | |
| { title: "Upload Tender", url: "/upload", icon: Upload }, | |
| { title: "My Tenders", url: "/tenders", icon: FileText }, | |
| { title: "Proposals", url: "/proposals", icon: FileEdit }, | |
| ]; | |
| const secondaryItems = [ | |
| { title: "Consultant Portal", url: "/consultant", icon: Users }, | |
| { title: "Settings", url: "/settings", icon: Settings }, | |
| ]; | |
| export function AppSidebar() { | |
| const { state } = useSidebar(); | |
| const collapsed = state === "collapsed"; | |
| const location = useLocation(); | |
| const isActive = (path: string) => | |
| location.pathname === path || location.pathname.startsWith(path + "/"); | |
| return ( | |
| <Sidebar collapsible="icon"> | |
| <SidebarContent> | |
| <SidebarGroup> | |
| <SidebarGroupLabel> | |
| <div className="flex items-center gap-2"> | |
| <Zap className="h-5 w-5 text-primary" /> | |
| {!collapsed && <span className="text-base font-bold text-foreground">TenderPulse</span>} | |
| </div> | |
| </SidebarGroupLabel> | |
| <SidebarGroupContent> | |
| <SidebarMenu> | |
| {mainItems.map((item) => ( | |
| <SidebarMenuItem key={item.title}> | |
| <SidebarMenuButton asChild isActive={isActive(item.url)}> | |
| <NavLink | |
| to={item.url} | |
| end={item.url === "/dashboard"} | |
| className="hover:bg-muted/50" | |
| activeClassName="bg-primary/10 text-primary font-medium" | |
| > | |
| <item.icon className="mr-2 h-4 w-4" /> | |
| {!collapsed && <span>{item.title}</span>} | |
| </NavLink> | |
| </SidebarMenuButton> | |
| </SidebarMenuItem> | |
| ))} | |
| </SidebarMenu> | |
| </SidebarGroupContent> | |
| </SidebarGroup> | |
| <SidebarGroup> | |
| <SidebarGroupLabel>Management</SidebarGroupLabel> | |
| <SidebarGroupContent> | |
| <SidebarMenu> | |
| {secondaryItems.map((item) => ( | |
| <SidebarMenuItem key={item.title}> | |
| <SidebarMenuButton asChild isActive={isActive(item.url)}> | |
| <NavLink | |
| to={item.url} | |
| className="hover:bg-muted/50" | |
| activeClassName="bg-primary/10 text-primary font-medium" | |
| > | |
| <item.icon className="mr-2 h-4 w-4" /> | |
| {!collapsed && <span>{item.title}</span>} | |
| </NavLink> | |
| </SidebarMenuButton> | |
| </SidebarMenuItem> | |
| ))} | |
| </SidebarMenu> | |
| </SidebarGroupContent> | |
| </SidebarGroup> | |
| </SidebarContent> | |
| <SidebarFooter> | |
| <SidebarMenu> | |
| <SidebarMenuItem> | |
| <SidebarMenuButton className="text-muted-foreground hover:text-destructive"> | |
| <LogOut className="mr-2 h-4 w-4" /> | |
| {!collapsed && <span>Log Out</span>} | |
| </SidebarMenuButton> | |
| </SidebarMenuItem> | |
| </SidebarMenu> | |
| </SidebarFooter> | |
| </Sidebar> | |
| ); | |
| } | |