import { Avatar, AvatarFallback, AvatarImage, } from '@affine/admin/components/ui/avatar'; import { Button } from '@affine/admin/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@affine/admin/components/ui/dropdown-menu'; import { MoreVerticalIcon } from '@blocksuite/icons/rc'; import { CircleUser } from 'lucide-react'; import { useCallback } from 'react'; import { toast } from 'sonner'; import { affineFetch } from '../../fetch-utils'; import { useCurrentUser, useRevalidateCurrentUser } from '../common'; interface UserDropdownProps { isCollapsed: boolean; } const adminBadgeClass = 'inline-flex h-5 items-center rounded-md border border-border/60 bg-chip-blue px-2 py-0.5 text-xxs font-medium text-chip-text'; const UserInfo = ({ name, email, avatarUrl, }: { email: string; avatarUrl: string | null; name?: string; }) => { return ( <>
{name ?? email.split('@')[0]} Admin
); }; const UserName = ({ name, email, }: { name?: string | null; email?: string; }) => { if (name) { return ( {name} ); } const fallback = email?.split('@')[0] ?? ''; return ( {fallback} ); }; export function UserDropdown({ isCollapsed }: UserDropdownProps) { const currentUser = useCurrentUser(); const relative = useRevalidateCurrentUser(); const handleLogout = useCallback(() => { affineFetch('/api/auth/sign-out', { method: 'POST' }) .then(() => { toast.success('Logged out successfully'); return relative(); }) .catch(err => { toast.error(`Failed to logout: ${err.message}`); }); }, [relative]); if (isCollapsed) { return ( {currentUser ? ( ) : null} Logout ); } return (
Admin
{currentUser ? ( ) : null} Logout
); }