import React, { ReactElement, useCallback, useRef } from "react"; import cx from "classnames"; import Avatar, { AvatarProps } from "../Avatar/Avatar"; import Counter from "../Counter/Counter"; import MenuButton from "../MenuButton/MenuButton"; import Menu from "../Menu/Menu/Menu"; import AvatarMenuItem from "../Menu/MenuItem/AvatarMenuItem"; import AvatarGroupCounterTooltipContainer from "./AvatarGroupCounterTooltipContainer"; import VibeComponentProps from "../../types/VibeComponentProps"; import { AvatarSize, AvatarType } from "../Avatar/AvatarConstants"; import { getStyle } from "../../helpers/typesciptCssModulesHelper"; import { AvatarGroupCounterVisualProps } from "./AvatarGroup"; import { TooltipProps } from "../Tooltip/Tooltip"; import { avatarOnClick } from "./AvatarGroupHelper"; import styles from "./AvatarGroupCounter.module.scss"; import { AVATAR_GROUP_COUNTER_AVATAR_SIZE } from "./AvatarGroupConstants"; export interface AvatarGroupCounterProps extends VibeComponentProps { /** * Array of Avatar elements */ counterTooltipAvatars?: ReactElement[]; /** * AvatarGroupCounterVisualProps: props for counter */ counterProps?: AvatarGroupCounterVisualProps; counterTooltipCustomProps?: Partial; counterTooltipIsVirtualizedList?: boolean; size?: AvatarSize; type?: AvatarType; counterAriaLabel?: string; disabled?: boolean; } const AvatarGroupCounter: React.FC = ({ counterTooltipAvatars = [], counterProps, counterTooltipCustomProps, counterTooltipIsVirtualizedList = false, size = Avatar.sizes.MEDIUM, type, counterAriaLabel, disabled }) => { const { color: counterColor = Counter.colors.LIGHT, count: counterValue = counterTooltipAvatars.length, prefix: counterPrefix = "+", maxDigits: counterMaxDigits = 3, ariaLabelItemsName: counterAriaLabelItemsName = "items", noAnimation, dialogContainerSelector } = counterProps || {}; const counterSizeStyle = getStyle(styles, size?.toString()); const counterColorStyle = styles[counterColor]; const focusPrevPlaceholderRef = useRef(null); const focusNextPlaceholderRef = useRef(null); const counterContainerRef = useRef(null); const counterComponent = useCallback(() => { return ( ); }, [ counterAriaLabel, counterAriaLabelItemsName, counterColor, counterMaxDigits, counterPrefix, counterValue, disabled, noAnimation ]); if (!counterTooltipAvatars.length && !counterValue) { return null; } if (disabled) { return (
{counterComponent()}
); } const areAvatarsClickable = counterTooltipAvatars.some(a => a.props?.onClick); if (areAvatarsClickable) { return ( {counterTooltipAvatars.map((avatar, index) => { return ( // eslint-disable-next-line react/jsx-key avatarOnClick(event, avatar.props) }} avatarProps={{ ...avatar.props, customSize: AVATAR_GROUP_COUNTER_AVATAR_SIZE, ariaLabel: "", tabIndex: -1 }} /> ); })} ); } return (
{/* eslint-disable jsx-a11y/no-noninteractive-tabindex */}
{/* eslint-enable jsx-a11y/no-noninteractive-tabindex */} {counterComponent()}
); }; export default AvatarGroupCounter;