// @flow strict import * as React from 'react'; import { JumboSmall, SubTitleLarge, SubTitleMedium, SubTitleSmall, } from '../../components/Text'; import * as COLORS from '../../styles/variables/_color'; import { colorDangerLightest, colorGrayLightest, colorInformationLightest, colorNeutralLightest, colorSuccessLightest, colorWarningLightest, } from '../../styles/variables/_color'; import classify from '../../utils/classify'; import type {IconType} from '../Icon'; import {Icon} from '../Icon'; import type {StatusSemanticType} from '../StatusIndicator'; import {StatusIndicator} from '../StatusIndicator'; import css from './Avatar.module.css'; type ClassNames = $ReadOnly<{ wrapper?: string, ring?: string, content?: string, image?: string, icon?: string, text?: string, }>; export const AVATAR_SIZE = Object.freeze({ small: 'small', medium: 'medium', large: 'large', extraLarge: 'extraLarge', }); export const avatarSizeOptions: Array = [...Object.keys(AVATAR_SIZE)]; export type AvatarSize = $Values; export const AVATAR_COLOR = Object.freeze({ red: colorDangerLightest, orange: colorWarningLightest, green: colorSuccessLightest, blue: colorInformationLightest, gray: colorGrayLightest, indigo: colorNeutralLightest, }); export type AvatarColorType = $Keys; export type AvatarProps = { classNames?: ClassNames, size?: AvatarSize, imageSrc?: string, ring?: boolean, icon?: boolean, text?: string, color?: AvatarColorType, style?: mixed, iconName?: string, iconType?: IconType, status?: StatusSemanticType, statusBorderColorToken?: $Keys, }; const getAvatarText = (text = '') => { const [firstWord, secondWord] = text.split(' '); const firstChar = firstWord ? firstWord[0].toUpperCase() : ''; const secondChar = secondWord ? secondWord[0].toUpperCase() : ''; return firstChar + secondChar; }; const AvatarTextDecorator = ({ avatarText, size, className, }: { avatarText: string, size: AvatarSize, className?: string, }) => { switch (size) { case 'small': return {avatarText}; case 'medium': return ( {avatarText} ); case 'large': return {avatarText}; case 'extraLarge': return {avatarText}; } }; // mapping of iconSize for each avatar size; const iconSize = Object.freeze({ small: 'small', medium: 'medium', large: 'medium', extraLarge: 'large', }); export type AvatarContentProps = { imageSrc?: string, text?: string, iconName?: string, iconType?: IconType, size: AvatarSize, color?: AvatarColorType, ring?: boolean, status?: StatusSemanticType, statusBorderColorToken?: $Keys, classNames?: ClassNames, }; const AvatarConditionalContent = ({ imageSrc, text, iconName, size, iconType, color = 'blue', status, statusBorderColorToken, classNames, }: AvatarContentProps) => (
{!!status && (
)} {imageSrc ? ( Avatar ) : iconName ? ( ) : text ? ( ) : null}
); export const Avatar: React$AbstractComponent = React.forwardRef( ( { classNames, size = AVATAR_SIZE.medium, imageSrc, text, style, iconName, iconType, color, ring = false, status, statusBorderColorToken, }: AvatarProps, ref, ) => (
{ring ? (
) : ( )}
), ); export const BaseAvatar = ({ classNames, size = AVATAR_SIZE.medium, text = '', style, color = 'blue', }: AvatarProps): React.Node => (
);