"use client"; import { BadgeCheck, ChevronsUpDown, LogOut, Settings, User } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { memo, useCallback } from "react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { SidebarGroup, SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar, } from "@/components/ui/sidebar"; interface UserData { name: string; email: string; avatar: string; } // Memoized NavUser component for better performance export const NavUser = memo(function NavUser({ user }: { user: UserData }) { const { isMobile } = useSidebar(); const router = useRouter(); const { search_space_id } = useParams(); // Memoized logout handler const handleLogout = useCallback(() => { if (typeof window !== "undefined") { localStorage.removeItem("surfsense_bearer_token"); router.push("/"); } }, [router]); // Get user initials for avatar fallback const userInitials = user.name .split(" ") .map((n) => n[0]) .join("") .toUpperCase() .slice(0, 2); return ( {userInitials || }
{user.name} {user.email}
{userInitials || }
{user.name} {user.email}
router.push(`/dashboard/${search_space_id}/api-key`)} aria-label="Manage API key" > API Key router.push(`/settings`)} aria-label="Go to settings" > Settings Sign out
); });