"use client"; import Image from "next/image"; import Link from "next/link"; import { useState } from "react"; import { SignOutButton, useUser } from "@/auth/clerk"; import { clearLocalAuthToken, isLocalAuthMode } from "@/auth/localAuth"; import { Activity, Bot, Boxes, ChevronDown, LayoutDashboard, LogOut, Plus, Server, Settings, Store, Trello, } from "lucide-react"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; type UserMenuProps = { className?: string; displayName?: string; displayEmail?: string; forgejoAvatarUrl?: string | null; }; export function UserMenu({ className, displayName: displayNameFromDb, displayEmail: displayEmailFromDb, forgejoAvatarUrl, }: UserMenuProps) { const [open, setOpen] = useState(false); const { user } = useUser(); const localMode = isLocalAuthMode(); if (!user && !localMode) return null; const avatarUrl = forgejoAvatarUrl ?? (localMode ? null : (user?.imageUrl ?? null)); const avatarLabelSource = displayNameFromDb ?? (localMode ? "Local User" : user?.id) ?? "U"; const avatarLabel = avatarLabelSource.slice(0, 1).toUpperCase(); const displayName = displayNameFromDb ?? (localMode ? "Local User" : "Account"); const displayEmail = displayEmailFromDb ?? (localMode ? "local@localhost" : ""); return (
{forgejoAvatarUrl ? ( // eslint-disable-next-line @next/next/no-img-element User avatar ) : avatarUrl ? ( User avatar ) : ( avatarLabel )}
{displayName}
{displayEmail ? (
{displayEmail}
) : null}
setOpen(false)} > Open boards setOpen(false)} > Create board
{( [ { href: "/dashboard", label: "Dashboard", icon: LayoutDashboard }, { href: "/activity", label: "Activity", icon: Activity }, { href: "/agents", label: "Agents", icon: Bot }, { href: "/gateways", label: "Gateways", icon: Server }, { href: "/skills/marketplace", label: "Skills marketplace", icon: Store, }, { href: "/skills/packs", label: "Skill packs", icon: Boxes }, { href: "/settings", label: "Settings", icon: Settings }, ] as const ).map((item) => ( setOpen(false)} > {item.label} ))}
{localMode ? ( ) : ( )}
); }