import classNames from 'classnames'; import toArray from 'rc-util/lib/Children/toArray'; import * as React from 'react'; import { ConfigContext } from '../config-provider'; import Popover from '../popover'; import { cloneElement } from '../_util/reactNode'; import Avatar from './avatar'; import AvatarContext from './AvatarContext'; import type { AvatarContextType, AvatarSize } from './AvatarContext'; import useStyle from './style'; import useCSSVarCls from '../config-provider/hooks/useCSSVarCls'; interface ContextProps { children?: React.ReactNode; } const AvatarContextProvider: React.FC = (props) => { const { size, shape } = React.useContext(AvatarContext); const avatarContextValue = React.useMemo( () => ({ size: props.size || size, shape: props.shape || shape }), [props.size, props.shape, size, shape], ); return ( {props.children} ); }; export interface GroupProps { className?: string; rootClassName?: string; children?: React.ReactNode; style?: React.CSSProperties; prefixCls?: string; maxCount?: number; maxStyle?: React.CSSProperties; maxPopoverPlacement?: 'top' | 'bottom'; maxPopoverTrigger?: 'hover' | 'focus' | 'click'; /* * Size of avatar, options: `large`, `small`, `default` * or a custom number size * */ size?: AvatarSize; shape?: 'circle' | 'square'; } const Group: React.FC = (props) => { const { getPrefixCls, direction } = React.useContext(ConfigContext); const { prefixCls: customizePrefixCls, className, rootClassName, style, maxCount, maxStyle, size, shape, maxPopoverPlacement = 'top', maxPopoverTrigger = 'hover', children, } = props; const prefixCls = getPrefixCls('avatar', customizePrefixCls); const groupPrefixCls = `${prefixCls}-group`; const cssVarCls = useCSSVarCls(prefixCls); const [wrapCSSVar, hashId] = useStyle(prefixCls, cssVarCls); const cls = classNames( groupPrefixCls, { [`${groupPrefixCls}-rtl`]: direction === 'rtl', }, cssVarCls, className, rootClassName, hashId, ); const childrenWithProps = toArray(children).map((child, index) => cloneElement(child, { key: `avatar-key-${index}` }), ); const numOfChildren = childrenWithProps.length; if (maxCount && maxCount < numOfChildren) { const childrenShow = childrenWithProps.slice(0, maxCount); const childrenHidden = childrenWithProps.slice(maxCount, numOfChildren); childrenShow.push( {`+${numOfChildren - maxCount}`} , ); return wrapCSSVar(
{childrenShow}
, ); } return wrapCSSVar(
{childrenWithProps}
, ); }; export default Group;