"use client"; import { useState, useMemo } from "react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { Icon } from "@iconify/react"; import { useQueries, useQuery } from "@tanstack/react-query"; import { useTranslations } from "next-intl"; import { fetchCollections, fetchContentList } from "@/lib/api"; import { LocaleSwitcher } from "./LocaleSwitcher"; const navLinkClass = "inline-flex items-center gap-2 rounded-lg px-3 py-2.5 text-sm font-medium min-h-[44px] md:min-h-0 md:py-2"; type SidebarProps = { locale: string; mobileOpen?: boolean; onClose?: () => void; }; export function Sidebar({ locale, mobileOpen = false, onClose }: SidebarProps) { const t = useTranslations("Sidebar"); const pathname = usePathname(); const [search, setSearch] = useState(""); const { data, isLoading, error } = useQuery({ queryKey: ["collections"], queryFn: fetchCollections, }); const filteredCollections = useMemo(() => { const list = data?.collections ?? []; if (!search.trim()) return list; const q = search.trim().toLowerCase(); return list.filter( (c) => c.name.toLowerCase().includes(q) || (c.category?.toLowerCase().includes(q) ?? false) || (c.tags?.some((t) => t.toLowerCase().includes(q)) ?? false) || (c.description?.toLowerCase().includes(q) ?? false), ); }, [data?.collections, search]); const countQueries = useQueries({ queries: filteredCollections.map((c) => ({ queryKey: ["contentCount", c.name], queryFn: () => fetchContentList(c.name, { _per_page: 1 }).then((r) => r.total), staleTime: 60_000, })), }); const formatCount = (n: number) => (n >= 100 ? "99+" : String(n)); const tSidebar = useTranslations("Sidebar"); const isDrawer = typeof onClose === "function"; const asideClass = "relative flex h-screen flex-col overflow-hidden border-r border-accent-200/50 bg-gradient-to-b from-violet-50/95 via-accent-50/90 to-amber-50/85 shadow-[2px_0_16px_-2px_rgba(225,29,72,0.06)] " + (isDrawer ? "fixed left-0 top-0 z-40 w-72 max-w-[85vw] transition-transform duration-200 ease-out md:relative md:left-auto md:top-auto md:z-auto md:h-full md:w-full md:max-w-none md:translate-x-0 " + (mobileOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0") : "w-full"); return ( ); }