import { createFileRoute, Outlet, redirect, Link } from "@tanstack/react-router" import { useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Separator } from "@/components/ui/separator" import { ScrollArea } from "@/components/ui/scroll-area" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "@/components/ui/sheet" import { ModeToggle } from "@/components/mode-toggle" import { Menu, Bell, Search as SearchIcon, LayoutDashboard, GraduationCap, FileText, LogOut, KeySquare, IdCard, Users2Icon, FileAxis3D, FolderCheck, } from "lucide-react" import { useSupabaseAuth } from "@/auth/supabase" import { Toaster } from "sonner" export const Route = createFileRoute("/_authenticated")({ beforeLoad: ({ context }) => { if (!context.auth.isAuthenticated) { throw redirect({ to: "/login", search: { redirect: location.href } }) } }, component: Layout, }) const nav = [ { to: "/planes", label: "Planes", icon: GraduationCap }, { to: "/asignaturas", label: "Asignaturas", icon: FileText }, { to: "/dashboard", label: "Dashboard", icon: LayoutDashboard }, { to: "/usuarios", label: "Usuarios", icon: Users2Icon }, { to: "/archivos", label: "Archivos de referencia", icon: FileAxis3D }, ] as const function getInitials(name?: string) { if (!name) return "LS" const parts = name.trim().split(/\s+/).slice(0, 2) return parts.map(p => p[0]?.toUpperCase()).join("") || "LS" } function useUserDisplay() { const { claims, user } = useSupabaseAuth() const nombre = claims?.nombre ?? "" const apellidos = claims?.apellidos ?? "" const titulo = claims?.title ?? "" const clave = claims?.clave ?? "" const fullName = [titulo, nombre, apellidos].filter(Boolean).join(" ") const shortName = [titulo, nombre, apellidos.split(" ")[0] ?? ""].filter(Boolean).join(" ") const role = claims?.role ?? "" return { fullName, shortName, clave, email: user?.email, avatar: claims?.avatar ?? null, initials: getInitials([nombre, apellidos].filter(Boolean).join(" ")), role, } } function Layout() { Route.useRouteContext() const [query, setQuery] = useState("") const user = useUserDisplay() return (