import { Avatar as AvatarComponent, AvatarFallback, AvatarImage, } from "../../../ui/avatar"; import { ComponentProps, useMemo } from "react"; import { Badge, BadgeProps } from "../../Badge"; import { getAvatarColor, getInitials } from "./utils"; import { View } from "react-native"; import { ModuleAvatar, ModuleAvatarProps } from "../ModuleAvatar"; import { AvatarBadge } from "../types"; const getAvatarSize = ( size: ShadAvatarProps["size"], ): ModuleAvatarProps["size"] | undefined => { const sizeMap: Partial< Record< Exclude, ModuleAvatarProps["size"] > > = { xlarge: "lg", large: "md", small: "sm", } as const; return size && sizeMap[size] ? sizeMap[size] : sizeMap.small; }; const getBadgeSize = ( size: ShadAvatarProps["size"], ): BadgeProps["size"] | undefined => { const sizeMap: Partial< Record, BadgeProps["size"]> > = { xlarge: "lg", large: "md", small: "sm", } as const; return size && sizeMap[size] ? sizeMap[size] : sizeMap.small; }; type ShadAvatarProps = ComponentProps; type Props = { type: ShadAvatarProps["type"]; name: string | string[]; src?: string; size?: ShadAvatarProps["size"]; color?: ShadAvatarProps["color"] | "random"; badge?: AvatarBadge; } & Pick; export const BaseAvatar = ({ src, name, size, type = "base", color = "random", "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, badge, }: Props) => { const initials = getInitials(name, size); const avatarColor = color === "random" ? getAvatarColor(Array.isArray(name) ? name.join("") : name) : color; const hasAria = Boolean(ariaLabel || ariaLabelledby); const badgeSize = getBadgeSize(size); const moduleAvatarSize = getAvatarSize(size); const badgeContent = useMemo( () => badge ? ( <> {badge.type === "module" && ( )} {badge.type !== "module" && ( )} ) : null, [badge, badgeSize, moduleAvatarSize], ); return ( {src ? ( ) : ( {initials} )} {badge && ( {badgeContent} )} ); }; BaseAvatar.displayName = "BaseAvatar";