"use client" import { useCustomer } from "autumn-js/react" import { Avatar, AvatarFallback, AvatarImage } from "@ui/components/avatar" import { useAuth } from "@lib/auth-context" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@ui/components/dropdown-menu" import { authClient } from "@lib/auth" import { useRouter } from "next/navigation" import { Brain, LogOut, Settings, Settings2, RotateCcw, HelpCircle, LifeBuoy, Sun, } from "lucide-react" import { cn } from "@lib/utils" import { analytics } from "@/lib/analytics" import { dmSansClassName } from "@/lib/fonts" import { useOrgOnboarding } from "@hooks/use-org-onboarding" import { useTokenUsage } from "@/hooks/use-token-usage" import { useSettingsModal } from "@/components/settings/settings-modal" import { useHasCompanyBrain } from "@/hooks/use-company-brain" import { useViewMode } from "@/lib/view-mode-context" export function UserProfileMenu({ className, avatarClassName, onOpenFeedback, }: { className?: string avatarClassName?: string onOpenFeedback?: () => void }) { const { user } = useAuth() const router = useRouter() const { openSettings } = useSettingsModal() const { setViewMode } = useViewMode() const isCompanyBrain = useHasCompanyBrain() const { resetOrgOnboarded } = useOrgOnboarding() const autumn = useCustomer() const { currentPlan, isLoading: planLoading } = useTokenUsage(autumn) const planBadgeLabel = currentPlan === "pro" ? "PRO" : currentPlan === "max" ? "MAX" : currentPlan === "scale" ? "SCALE" : null const handleTryOnboarding = () => { resetOrgOnboarded() router.push("/onboarding") } const handleSignOut = () => { void (async () => { try { await authClient.signOut() } catch { // still navigate if the request fails (offline, etc.) } router.push("/login") })() } if (!user) return null const initials = (() => { if (user.name) { const parts = user.name.trim().split(/\s+/) return parts.length >= 2 ? `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase() : parts[0].slice(0, 2).toUpperCase() } if (user.email) return user.email.slice(0, 2).toUpperCase() return "SM" })() const avatarColor = (() => { const palette = [ "#0e2244", // navy blue "#1a1a3e", // deep indigo "#1e1030", // dark violet "#0d2e2e", // dark teal "#2a1020", // dark rose "#1a2a10", // deep forest "#2e1a0a", // dark amber "#0a1e2e", // ocean ] const seed = user.email ?? user.name ?? "" let hash = 0 for (let i = 0; i < seed.length; i++) hash = seed.charCodeAt(i) + ((hash << 5) - hash) return palette[((hash % palette.length) + palette.length) % palette.length] })() return (

{user.name}

{user.email}

openSettings()} className="gap-2.5 rounded-lg px-2.5 py-2 text-sm font-medium text-white/85 hover:bg-white/[0.06] focus:bg-white/[0.06] focus:text-white cursor-pointer" > Settings {isCompanyBrain ? null : ( { analytics.companyBrainPromoClicked({ source: "profile_menu" }) router.push("/onboarding?new=1&mode=team") }} className="gap-2.5 rounded-lg px-2.5 py-2 text-sm font-medium text-white/85 hover:bg-white/[0.06] focus:bg-white/[0.06] focus:text-white cursor-pointer" > Set up Company Brain )} {isCompanyBrain ? ( void setViewMode("configure")} className="gap-2.5 rounded-lg px-2.5 py-2 text-sm font-medium text-white/85 hover:bg-white/[0.06] focus:bg-white/[0.06] focus:text-white cursor-pointer" > Configure ) : null} {isCompanyBrain ? ( void setViewMode("integrations")} className="gap-2.5 rounded-lg px-2.5 py-2 text-sm font-medium text-white/85 hover:bg-white/[0.06] focus:bg-white/[0.06] focus:text-white cursor-pointer" > Integrations ) : null} Try onboarding {onOpenFeedback ? ( Feedback ) : null} Help & Support Discord Logout
) }