"use client"; import { BadgeCheck, ChevronsUpDown, LogOut, Settings, User as UserIcon } from "lucide-react"; import { useParams, useRouter } from "next/navigation"; import { memo, useCallback, useEffect, useState } 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"; import { apiClient } from "@/lib/api"; interface User { id: string; email: string; is_active: boolean; is_superuser: boolean; is_verified: boolean; } interface UserData { name: string; email: string; avatar: string; } // Memoized NavUser component for better performance export const NavUser = memo(function NavUser() { const { isMobile } = useSidebar(); const router = useRouter(); const { search_space_id } = useParams(); // User state management const [user, setUser] = useState(null); const [isLoadingUser, setIsLoadingUser] = useState(true); const [userError, setUserError] = useState(null); // Fetch user details useEffect(() => { const fetchUser = async () => { try { if (typeof window === "undefined") return; try { const userData = await apiClient.get("users/me"); setUser(userData); setUserError(null); } catch (error) { console.error("Error fetching user:", error); setUserError(error instanceof Error ? error.message : "Unknown error occurred"); } finally { setIsLoadingUser(false); } } catch (error) { console.error("Error in fetchUser:", error); setIsLoadingUser(false); } }; fetchUser(); }, []); // Create user object for display const userData: UserData = { name: user?.email ? user.email.split("@")[0] : "User", email: user?.email || (isLoadingUser ? "Loading..." : userError ? "Error loading user" : "Unknown User"), avatar: "/icon-128.png", // Default avatar }; // 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 = userData.name .split(" ") .map((n: string) => n[0]) .join("") .toUpperCase() .slice(0, 2); return ( {userInitials || }
{userData.name} {userData.email}
{userInitials || }
{userData.name} {userData.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
); });