'use client' import type { MouseEventHandler, ReactNode } from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { resetUser } from '@/app/components/base/amplitude/utils' import PremiumBadge from '@/app/components/base/premium-badge' import ThemeSwitcher from '@/app/components/base/theme-switcher' import { Avatar } from '@/app/components/base/ui/avatar' import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLinkItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@/app/components/base/ui/dropdown-menu' import { ACCOUNT_SETTING_TAB } from '@/app/components/header/account-setting/constants' import { IS_CLOUD_EDITION } from '@/config' import { useAppContext } from '@/context/app-context' import { useGlobalPublicStore } from '@/context/global-public-context' import { useDocLink } from '@/context/i18n' import { useModalContext } from '@/context/modal-context' import { useProviderContext } from '@/context/provider-context' import { env } from '@/env' import Link from '@/next/link' import { useRouter } from '@/next/navigation' import { useLogout } from '@/service/use-common' import { cn } from '@/utils/classnames' import AccountAbout from '../account-about' import GithubStar from '../github-star' import Indicator from '../indicator' import Compliance from './compliance' import { ExternalLinkIndicator, MenuItemContent } from './menu-item-content' import Support from './support' type AccountMenuRouteItemProps = { href: string iconClassName: string label: ReactNode trailing?: ReactNode } function AccountMenuRouteItem({ href, iconClassName, label, trailing, }: AccountMenuRouteItemProps) { return ( } > ) } type AccountMenuExternalItemProps = { href: string iconClassName: string label: ReactNode trailing?: ReactNode } function AccountMenuExternalItem({ href, iconClassName, label, trailing, }: AccountMenuExternalItemProps) { return ( ) } type AccountMenuActionItemProps = { iconClassName: string label: ReactNode onClick?: MouseEventHandler trailing?: ReactNode } function AccountMenuActionItem({ iconClassName, label, onClick, trailing, }: AccountMenuActionItemProps) { return ( ) } type AccountMenuSectionProps = { children: ReactNode } function AccountMenuSection({ children }: AccountMenuSectionProps) { return {children} } export default function AppSelector() { const router = useRouter() const [aboutVisible, setAboutVisible] = useState(false) const [isAccountMenuOpen, setIsAccountMenuOpen] = useState(false) const { systemFeatures } = useGlobalPublicStore() const { t } = useTranslation() const docLink = useDocLink() const { userProfile, langGeniusVersionInfo, isCurrentWorkspaceOwner } = useAppContext() const { isEducationAccount } = useProviderContext() const { setShowAccountSettingModal } = useModalContext() const { mutateAsync: logout } = useLogout() const handleLogout = async () => { await logout() resetUser() localStorage.removeItem('setup_status') // Tokens are now stored in cookies and cleared by backend // To avoid use other account's education notice info localStorage.removeItem('education-reverify-prev-expire-at') localStorage.removeItem('education-reverify-has-noticed') localStorage.removeItem('education-expired-has-noticed') router.push('/signin') } return ( {userProfile.name} {isEducationAccount && ( EDU )} {userProfile.email} } /> setShowAccountSettingModal({ payload: ACCOUNT_SETTING_TAB.MEMBERS })} /> {!systemFeatures.branding.enabled && ( <> } /> setIsAccountMenuOpen(false)} /> {IS_CLOUD_EDITION && isCurrentWorkspaceOwner && } } /> )} /> { env.NEXT_PUBLIC_SITE_ABOUT !== 'hide' && ( { setAboutVisible(true) setIsAccountMenuOpen(false) }} trailing={( {langGeniusVersionInfo.current_version} )} /> ) } > )} } /> { void handleLogout() }} /> { aboutVisible && setAboutVisible(false)} langGeniusVersionInfo={langGeniusVersionInfo} /> } ) }