import { LanguageSwitcher } from "@/components/language-switcher"; import { SiteFooter } from "@/components/site-footer"; import { TrialUrgencyBanner } from "@/components/trial-urgency-banner"; import { useAuth } from "@/hooks/use-auth"; import { api } from "@/lib/api-client"; import { useTranslation } from "@/lib/i18n"; import { KEYS_5 } from "@/lib/keys"; import { capture, resetUser } from "@/lib/posthog"; import { getUserSettings, setUserSetting } from "@/lib/user-settings"; import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Separator, Sheet, SheetContent, SheetTitle, Skeleton, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@sase/ui"; import { useQuery } from "@tanstack/react-query"; import { Link, Outlet, createFileRoute, useNavigate, useRouterState } from "@tanstack/react-router"; import { BarChart3, BookOpen, CalendarDays, ChevronsUpDown, Copy, CreditCard, FlaskConical, History, LayoutDashboard, Library, LogOut, Mail, Menu, Moon, PanelLeftClose, PanelLeftOpen, Receipt, Search, Settings, Share2, Shield, Sparkles, Sun, Users, } from "lucide-react"; import { useEffect, useState } from "react"; export const Route = createFileRoute("/dashboard")({ component: DashboardLayout, }); // ─── NAV SECTIONS ───────────────────────────────────────────────────────────── type NavItem = { to: string; labelKey: string; icon: React.ComponentType<{ className?: string }>; exact?: boolean; }; const mainMenuItems: readonly NavItem[] = [ { to: "/dashboard", labelKey: "nav.dashboard", icon: LayoutDashboard, exact: true }, { to: "/dashboard/search", labelKey: "nav.search", icon: Search }, { to: "/dashboard/catalog", labelKey: "nav.catalog", icon: Library }, { to: "/dashboard/history", labelKey: "nav.history", icon: History }, ]; const accountItems: readonly NavItem[] = [ { to: "/dashboard/subscription", labelKey: "nav.subscription", icon: CreditCard }, { to: "/dashboard/billing", labelKey: "nav.billing", icon: Receipt }, { to: "/dashboard/settings", labelKey: "nav.settings", icon: Settings }, ]; const supportItems: readonly NavItem[] = [ { to: "/dashboard/changelog", labelKey: "nav.changelog", icon: CalendarDays }, { to: "/contact", labelKey: "nav.contact", icon: Mail }, { to: "/blog", labelKey: "nav.blog", icon: BookOpen }, ]; const adminItems: readonly NavItem[] = [ { to: "/dashboard/admin", labelKey: "nav.adminPanel", icon: Shield }, { to: "/dashboard/admin/users", labelKey: "nav.users", icon: Users }, { to: "/dashboard/admin/analytics", labelKey: "nav.analytics", icon: BarChart3 }, { to: "/dashboard/admin/copy-logs", labelKey: "nav.copyLogs", icon: Copy }, { to: "/dashboard/admin/referrals", labelKey: "nav.referrals", icon: Share2 }, { to: "/dashboard/service-test", labelKey: "nav.serviceTest", icon: FlaskConical }, ]; // ─── HELPERS ────────────────────────────────────────────────────────────────── function NavSection({ title, collapsed }: { title: string; collapsed: boolean }) { if (collapsed) { return ; } return (

{title}

); } function NavLink({ to, label, icon: Icon, collapsed, onClick, exact, }: { to: string; label: string; icon: React.ComponentType<{ className?: string }>; collapsed: boolean; onClick?: () => void; exact?: boolean; }) { const link = ( {/* Left accent bar — visible when active (both collapsed & expanded) */}