import { useState, useCallback, useEffect, useMemo, useRef } from "react"; import type { ReactNode } from "react"; import { Link, useLocation, useParams } from "react-router"; import ViewTransitionLink from "@/components/ViewTransitionLink"; import { getProfileMenuSide, isSidebarExpanded } from "@/components/AppSidebar.logic"; import { SiloBrand } from "@/components/SiloBrand"; import { useAuth } from "@/hooks/useAuth"; import { useCurrentProfile } from "@/hooks/useCurrentProfile"; import { navigateToPluginRoute } from "@/lib/buildPluginHref"; import { useUserLibraries } from "@/hooks/queries/libraries"; import { usePluginSettingsList } from "@/hooks/queries/pluginSettings"; import { useRequestFeatureStatus } from "@/hooks/queries/useRequests"; import { useSidebarPins, useToggleSidebarPin } from "@/hooks/queries/sidebarPins"; import { useViewTransitionNavigate } from "@/hooks/useViewTransition"; import { pluginRouteHref } from "@/lib/pluginRouteHref"; import { buildLibraryCollectionCatalogHref, buildPersonalCatalogHref, buildQueryCatalogHref, buildSectionCatalogHref, parseCatalogSearchParams, } from "@/pages/catalogSearchParams"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Film, Tv, Library, Search, Heart, List, Clock, FolderOpen, LogOut, UserCircle, Shield, Settings, Sparkles, CalendarDays, Home, UsersRound, ChevronDown, ChevronRight, PinOff, LayoutGrid, Puzzle, BookHeadphones, Send, } from "lucide-react"; import { useTheme } from "@/hooks/useTheme"; import { CURATED_THEME_IDS, THEMES } from "@/lib/themes"; import { cn } from "@/lib/utils"; function getLibraryIcon(type: string) { switch (type) { case "movies": return ; case "series": return ; case "audiobook": case "audiobooks": return ; default: return ; } } function getLibraryIdFromPathname(pathname: string): number | null { const match = pathname.match(/^\/library\/(\d+)(?:\/|$)/); if (!match) return null; const id = Number(match[1]); return Number.isInteger(id) && id > 0 ? id : null; } function SidebarLabel({ children, show }: { children: ReactNode; show: boolean }) { return ( {children} ); } function SidebarSectionHeader({ children, show, collapsible = false, expanded = false, onToggle, }: { children: ReactNode; show: boolean; collapsible?: boolean; expanded?: boolean; onToggle?: () => void; }) { const textClass = "text-muted-foreground text-[10px] font-semibold tracking-[0.22em] uppercase"; const collapsedDivider = (