"use client"; import { BadgeCheck, Cat, ChevronDown, ClipboardCheck, Copy, Dumbbell, FileX2, Image as ImageIcon, type LucideIcon, Puzzle, RefreshCw, Shirt, Upload, Wrench, } from "lucide-react"; import { usePathname } from "next/navigation"; import { useState } from "react"; import { CatalogManagerDialog } from "@/app/admin/catalog/catalog-manager-dialog-wrapper"; import { OrganizeImportsLauncher } from "@/components/admin/studio/organize-imports-launcher"; import Link from "@/components/link"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; type StudioLink = { href: string; label: string; icon: LucideIcon }; const assets: StudioLink[] = [ { href: "/admin/studio/furni", label: "Furniture", icon: Puzzle }, { href: "/admin/studio/badges", label: "Badges", icon: BadgeCheck }, { href: "/admin/studio/clothing", label: "Clothing", icon: Shirt }, { href: "/admin/studio/effects", label: "Effects", icon: Dumbbell }, { href: "/admin/studio/pets", label: "Pets", icon: Cat }, ]; const imports: StudioLink[] = [ { href: "/admin/studio/upload", label: "Upload files", icon: Upload }, { href: "/admin/studio/clone", label: "Import from a source", icon: Copy }, { href: "/admin/studio/sync", label: "Sync & repository", icon: RefreshCw }, ]; const maintenance: StudioLink[] = [ { href: "/admin/studio/audit", label: "Catalog audit", icon: ClipboardCheck }, { href: "/admin/studio/repair-icons", label: "Repair icons", icon: ImageIcon, }, { href: "/admin/studio/maintenance", label: "Catalog maintenance", icon: Wrench, }, { href: "/admin/studio/nitro-cleanup", label: "Nitro cleanup", icon: FileX2, }, ]; const activePath = (path: string, href: string) => path === href || path.startsWith(`${href}/`); function StudioMenu({ label, links, pathname, }: { label: string; links: StudioLink[]; pathname: string; }) { const [open, setOpen] = useState(false); const active = links.find((link) => activePath(pathname, link.href)); return ( {label} {links.map(({ href, label: title, icon: Icon }) => ( setOpen(false)} aria-current={activePath(pathname, href) ? "page" : undefined} className="flex min-h-11 items-center gap-3 rounded-md px-3 text-sm hover:bg-[var(--admin-accent)]/10 aria-[current=page]:bg-[var(--admin-accent)]/15" > {title} ))} ); } export function StudioLayoutClient({ canEditCatalog, children, }: { canEditCatalog: boolean; children: React.ReactNode; }) { const pathname = usePathname() ?? ""; return (
{children}
); }