import { CloseIcon } from '@blocksuite/icons'; import { type AvatarFallbackProps, type AvatarImageProps, type AvatarProps as RadixAvatarProps, Fallback as AvatarFallback, Image as AvatarImage, Root as AvatarRoot, } from '@radix-ui/react-avatar'; import { assignInlineVars } from '@vanilla-extract/dynamic'; import clsx from 'clsx'; import type { CSSProperties, HTMLAttributes, MouseEvent } from 'react'; import { forwardRef, type ReactElement, useMemo, useState } from 'react'; import { IconButton } from '../button'; import { Tooltip, type TooltipProps } from '../tooltip'; import { ColorfulFallback } from './colorful-fallback'; import * as style from './style.css'; import { sizeVar } from './style.css'; export type AvatarProps = { size?: number; url?: string | null; name?: string; className?: string; style?: CSSProperties; colorfulFallback?: boolean; hoverIcon?: ReactElement; onRemove?: (e: MouseEvent) => void; avatarTooltipOptions?: Omit; removeTooltipOptions?: Omit; fallbackProps?: AvatarFallbackProps; imageProps?: Omit; avatarProps?: RadixAvatarProps; hoverWrapperProps?: HTMLAttributes; removeButtonProps?: HTMLAttributes; } & HTMLAttributes; export const Avatar = forwardRef( ( { size = 20, style: propsStyles = {}, url, name, className, colorfulFallback = false, hoverIcon, fallbackProps: { className: fallbackClassName, ...fallbackProps } = {}, imageProps, avatarProps, onRemove, hoverWrapperProps: { className: hoverWrapperClassName, ...hoverWrapperProps } = {}, avatarTooltipOptions, removeTooltipOptions, removeButtonProps: { className: removeButtonClassName, ...removeButtonProps } = {}, ...props }, ref ) => { const firstCharOfName = useMemo(() => { return name?.slice(0, 1) || 'A'; }, [name]); const [imageDom, setImageDom] = useState(null); const [removeButtonDom, setRemoveButtonDom] = useState(null); return (
{colorfulFallback ? ( ) : ( firstCharOfName )} {hoverIcon ? (
{hoverIcon}
) : null}
{onRemove ? ( ) : null}
); } ); Avatar.displayName = 'Avatar';