import { forwardRef, isValidElement, useId, type ReactNode } from 'react' import Block from '../Primitives/Block/Block' import Text from '../Text/Text' import { ButtonV2, ButtonV2Size, ButtonV2Type } from '../ButtonV2' import { useResponsiveTokens } from '../../hooks/useResponsiveTokens' import type { EmptyStateTokensType } from './emptyState.tokens.types' import type { EmptyStateAction, EmptyStateActionConfig, EmptyStateProps, } from './types' const isActionConfig = ( action: EmptyStateAction ): action is EmptyStateActionConfig => { return ( typeof action === 'object' && action !== null && !isValidElement(action) && 'label' in action && typeof action.label === 'string' && 'onClick' in action && typeof action.onClick === 'function' ) } const buttonSizeMap: Record< NonNullable, ButtonV2Size > = { sm: ButtonV2Size.SMALL, md: ButtonV2Size.MEDIUM, lg: ButtonV2Size.LARGE, } const renderAction = ( action: EmptyStateAction | undefined, buttonType: ButtonV2Type, size: NonNullable ): ReactNode => { if (action === undefined || action === null || action === false) { return null } if (isActionConfig(action)) { return ( ) } return action } const EmptyState = forwardRef( ( { illustration, title, description, primaryAction, secondaryAction, size = 'md', ...rest }, ref ) => { const tokens = useResponsiveTokens('EMPTY_STATE') const headingId = useId() const sizeTokens = tokens[size] const hasActions = [primaryAction, secondaryAction].some( (action) => action != null && action !== false ) return ( {illustration != null && ( {illustration} )} {title} {description != null && ( {description} )} {hasActions && ( {renderAction( primaryAction, ButtonV2Type.PRIMARY, size )} {renderAction( secondaryAction, ButtonV2Type.SECONDARY, size )} )} ) } ) EmptyState.displayName = 'EmptyState' export default EmptyState