"use client";
import Link from "next/link";
import { useState } from "react";
import { usePathname } from "next/navigation";
import { cn } from "@/lib/utils";
import {
RiExpandRightFill,
RiContractLeftFill,
} from "react-icons/ri";
import { Cuboid, House, ListChecks, Menu, UsersRound } from "lucide-react";
import {
Sheet,
SheetContent,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
import { useMediaQuery } from "react-responsive";
interface LinkItem {
label: string;
path: string;
icon: React.ComponentType<{ className?: string }>;
}
const LINKS: LinkItem[] = [
{
label: "Inicio",
path: "/",
icon: House,
},
{
label: "Equipo",
path: "/team",
icon: UsersRound,
},
{
label: "Mis tareas",
path: "/tasks",
icon: ListChecks,
},
{
label: "Inventario",
path: "/inventory",
icon: Cuboid,
},
];
const Sidebar = () => {
const [open, setOpen] = useState<boolean>(false);
const pathname = usePathname();
const isTablet = useMediaQuery({ query: "(max-width: 900px)" });
if (isTablet) {
return null;
}
return (
<div>
<aside
className={`bg-gray-200/25 transition-all duration-300 ease-in-out h-full sticky inset-0 border-r border-gray-400`}
style={{ minWidth: open ? "14rem" : "6.5rem" }}
>
<header className="px-7 py-10 flex items-end pt-5 absolute right-0 left-0">
<h2
className={`text-2xl font-semibold h-7 transition-all ease-in-out ${
open
? "opacity-100 visible delay-300"
: "absolute opacity-0 invisible left-100"
}`}
>
App
</h2>
<button
onClick={() => setOpen(!open)}
className="text-white flex w-full justify-center"
>
{open ? (
<RiContractLeftFill className="text-2xl text-black ml-[9rem]" />
) : (
<RiExpandRightFill className="text-2xl text-black" />
)}
</button>
</header>
<nav className="pt-2 absolute mt-[10rem] px-6 w-full ">
<ul className="space-y-5">
{LINKS.map((link) => (
<li key={link.label}>
<Link
href={link.path}
className={cn(
"flex gap-2 items-end text-gray-600 px-4 py-2.5 rounded-2xl",
link.path === "/"
? pathname === "/" &&
"bg-primary-foreground text-primary"
: pathname.startsWith(link.path) &&
"bg-primary-foreground text-primary"
)}
>
<link.icon className="text-2xl text-inherit" />
{open && (
<span className="text-sm font-inherit">{link.label}</span>
)}
</Link>
</li>
))}
</ul>
</nav>
</aside>
</div>
);
};
export function SidebarUserMobile() {
const [open, setOpen] = useState<boolean>(true);
const pathname = usePathname();
const isTablet = useMediaQuery({ query: "(max-width: 900px)" });
if (!isTablet) {
return null;
}
return (
<Sheet key={"top"} open={open} onOpenChange={setOpen}>
<SheetTrigger asChild>
<div>
<Menu size="30" />
</div>
</SheetTrigger>
<SheetContent side={"left"}>
<SheetHeader>Menu</SheetHeader>
<nav className="pt-2 mt-24 px-6 w-full">
<ul className="space-y-5">
{LINKS.map((link) => (
<li key={link.label}>
<Link
href={link.path}
onClick={() => setOpen(!open)}
className={cn(
"flex gap-2 text-gray-600 px-4 py-2.5 rounded-2xl",
link.path === "/"
? pathname === "/" && "font-semibold text-white bg-primary"
: pathname.startsWith(link.path) &&
"font-semibold text-white bg-primary"
)}
>
<link.icon className="text-2xl text-inherit" />
<span className="text-sm font-inherit">{link.label}</span>
</Link>
</li>
))}
</ul>
</nav>
</SheetContent>
</Sheet>
);
}
export default Sidebar;