components/app-sidebar.tsx
"use client";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { Inbox, LayoutGrid, Settings, Users } from "lucide-react";
import {
Sidebar,
SidebarContent,
SidebarGroup,
SidebarGroupLabel,
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
useSidebar,
} from "@/components/ui/sidebar";
const items = [
{ title: "Overview", url: "/overview", icon: LayoutGrid },
{ title: "Customers", url: "/customers", icon: Users },
{ title: "Inbox", url: "/inbox", icon: Inbox },
{ title: "Settings", url: "/settings", icon: Settings },
];
export function AppSidebar() {
const pathname = usePathname();
const { isMobile, setOpenMobile } = useSidebar();
// The layout stays mounted when a Link changes the page, and so does the
// provider's openMobile state. Close the sheet yourself on a phone.
const closeOnPhone = () => {
if (isMobile) setOpenMobile(false);
};
return (
<Sidebar collapsible="icon">
<SidebarContent>
<SidebarGroup>
<SidebarGroupLabel>Workspace</SidebarGroupLabel>
<SidebarMenu>
{items.map((item) => (
<SidebarMenuItem key={item.url}>
<SidebarMenuButton asChild isActive={pathname === item.url} tooltip={item.title}>
<Link href={item.url} onClick={closeOnPhone}>
<item.icon />
<span>{item.title}</span>
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
))}
</SidebarMenu>
</SidebarGroup>
</SidebarContent>
</Sidebar>
);
}