import React, { type ReactNode } from 'react' import classnames from 'classnames' import { Avatar, type AvatarProps } from '~components/Avatar' import { Icon } from '~components/Icon' import { LiveIcon } from './subcomponents/LiveIcon/LiveIcon' import { type TagVariants } from './types' import styles from './Tag.module.css' export type TagWithAvatarProps = Omit & { variant: 'profile' avatar: JSX.Element | AvatarProps } type Variant = (typeof TagVariants)[number] export interface DefaultTagProps { variant?: Variant children: React.ReactNode size?: 'medium' | 'small' inline?: boolean dismissible?: boolean onDismiss?: React.MouseEventHandler onMouseDown?: React.MouseEventHandler onMouseLeave?: React.MouseEventHandler truncateWidth?: number } export type TagProps = DefaultTagProps | TagWithAvatarProps const isJSXElement = ( imageElementOrAvatarProps: JSX.Element | AvatarProps, ): imageElementOrAvatarProps is JSX.Element => 'props' in imageElementOrAvatarProps const renderAvatar = (imageElementOrAvatarProps: JSX.Element | AvatarProps): JSX.Element => isJSXElement(imageElementOrAvatarProps) ? ( <>{imageElementOrAvatarProps} ) : ( ) /** * {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3081928978/Tags Guidance} | * {@link https://cultureamp.design/?path=/docs/components-tag--docs Storybook} */ export const Tag = (props: TagProps): JSX.Element => { const { children, variant = 'default', size = 'medium', inline = false, dismissible = false, onDismiss, onMouseDown, onMouseLeave, truncateWidth, } = props const isTruncated = truncateWidth && truncateWidth > 0 const canShowIcon = size === 'medium' return (
<> {canShowIcon && ((): ReactNode => { switch (props.variant) { case 'validationPositive': return ( ) case 'validationNegative': return ( ) case 'validationCautionary': return ( ) case 'validationInformative': return ( ) case 'profile': return ( {props.avatar && renderAvatar(props.avatar)} ) default: return null } })()} {children} {dismissible && ( <> )} {variant === 'statusLive' && }
) } Tag.displayName = 'Tag'