Admin Sidebar

 avatar
NexAI
typescript
12 days ago
3.6 kB
2
Indexable
Typescript
import {
  Home,
  BookType,
  FolderKanban,
  Briefcase,
  Users,
  BarChart2,
  SidebarCloseIcon,
  SidebarOpenIcon,
} from "lucide-react";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { useState } from "react";
import {
  Sidebar,
  SidebarContent,
  SidebarGroup,
  SidebarGroupContent,
  SidebarGroupLabel,
  SidebarHeader,
  SidebarMenu,
  SidebarMenuItem,
  SidebarMenuButton,
  SidebarTrigger,
  useSidebar,
} from "@/components/ui/sidebar";

import { Button } from "@/components/ui/button";

const menuItems = [
  { icon: Home, label: "Dashboard", href: "/admin" },
  { icon: FolderKanban, label: "Projects", href: "/admin/projects" },
  { icon: BookType, label: "Project Types", href: "/admin/project-types" },
  { icon: Briefcase, label: "Services", href: "/admin/services" },
  { icon: Users, label: "Users", href: "/admin/users" },
  { icon: BarChart2, label: "Analytics", href: "/admin/analytics" },
];

export function AdminSidebar() {
  const pathname = usePathname();
  const [isOpen, setIsOpen] = useState(true); // Sidebar toggle state

  const toggleSidebar = () => setIsOpen((prev) => !prev);

  return (
    <>
      <Sidebar
        className={`fixed top-0 left-0 h-screen border-r transition-all duration-300 bg-white ${
          isOpen ? "w-64" : "w-16"
        }`}
      >
        <div className="h-full flex flex-col gap-4 ">
          <SidebarHeader className="h-16 gap-2  flex flex-row-reverse justify-between items-center px-4">
            {isOpen ? (
              <Button
                variant={"outline"}
                size={"icon"}
                className=" top-2 right-2"
                onClick={toggleSidebar}
              >
                <SidebarCloseIcon />
              </Button>
            ) : (
              <Button variant={"outline"} size={"icon"} onClick={toggleSidebar}>
                <SidebarOpenIcon onClick={toggleSidebar} />
              </Button>
            )}
            {isOpen && (
              <div className=" text-sm md:text-lg font-bold ml-4">
                Admin Dashboard
              </div>
            )}
          </SidebarHeader>
          <SidebarContent className="max-h-96  flex flex-col justify-center ">
            <SidebarGroup>
              <SidebarGroupContent>
                <SidebarMenu className="flex  flex-col gap-2 ">
                  {menuItems.map((item) => (
                    <SidebarMenuItem key={item.href}>
                      <SidebarMenuButton
                        asChild
                        isActive={pathname.startsWith(item.href)}
                      >
                        <Link
                          href={item.href}
                          className={`flex items-center px-4 py-3 rounded-lg ${
                            pathname.startsWith(item.href)
                              ? "bg-blue-100 text-blue-500"
                              : "text-gray-700 hover:bg-gray-200"
                          }`}
                        >
                          <item.icon className="w-6 h-6" />
                          {isOpen && <span className="ml-4">{item.label}</span>}
                        </Link>
                      </SidebarMenuButton>
                    </SidebarMenuItem>
                  ))}
                </SidebarMenu>
              </SidebarGroupContent>
            </SidebarGroup>
          </SidebarContent>
        </div>
      </Sidebar>
    </>
  );
}
Leave a Comment