import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuLabel, } from '@/components/ui/dropdown-menu'; import { useEvent } from '@/hooks/useEvent'; import { useSettingsStore } from '@/store/settings'; import { setUserInfo, useCurrentWorkspaceId, useUserInfo, useUserStore, } from '@/store/user'; import { languages } from '@/utils/constants'; import { useTranslation, setLanguage } from '@i18next-toolkit/react'; import { useNavigate } from '@tanstack/react-router'; import { version } from '@/utils/env'; import React from 'react'; import { LuMoreVertical } from 'react-icons/lu'; import { trpc } from '@/api/trpc'; import { useSocketConnected } from '@/api/socketio'; import { cn } from '@/utils/style'; interface UserConfigProps { isCollapsed: boolean; } export const UserConfig: React.FC = React.memo((props) => { const userInfo = useUserInfo(); const { i18n, t } = useTranslation(); const navigate = useNavigate(); const colorScheme = useSettingsStore((state) => state.colorScheme); const workspaceId = useCurrentWorkspaceId(); const workspaces = useUserStore((state) => { const userInfo = state.info; if (userInfo) { return userInfo.workspaces.map((w) => ({ id: w.workspace.id, name: w.workspace.name, role: w.role, current: userInfo.currentWorkspace?.id === w.workspace.id, })); } return []; }); const switchWorkspaceMutation = trpc.workspace.switch.useMutation({ onSuccess: (userInfo) => { setUserInfo(userInfo); }, }); const socketConnected = useSocketConnected(); const handleChangeColorSchema = useEvent((colorScheme) => { useSettingsStore.setState({ colorScheme, }); }); const nickname = userInfo?.nickname ?? userInfo?.username ?? ''; const avatar = (
{userInfo?.avatar && } {nickname.substring(0, 2).toUpperCase()}
); const name = (
{nickname}
); const more = ( ); return (
{props.isCollapsed ? ( <> {avatar} ) : ( <> {avatar} {name} {more} )} navigate({ to: '/settings/profile', }) } > {t('Profile')} navigate({ to: '/settings/notifications', }) } > {t('Notifications')} {t('Workspaces')} {workspaces.map((workspace) => ( switchWorkspaceMutation.mutateAsync({ workspaceId: workspace.id, }) } > {workspace.name} ))} {t('Language')} {languages.map((language) => ( {language.label} ))} {t('Theme')} {t('Dark')} {t('Light')} window.open('https://tianji.msgbyte.com/docs/intro')} > {t('Document')} {t('Community')} window.open('https://discord.gg/8Vv47wAEej')} > {t('Join Discord')} window.open('https://twitter.com/moonrailgun')} > {t('Follow Twitter')} v{version}
); }); UserConfig.displayName = 'UserConfig';