TelegramPWA/src/components/common/AvatarList.tsx
2024-12-29 11:58:54 +01:00

59 lines
1.4 KiB
TypeScript

import type { FC } from '../../lib/teact/teact';
import React, { memo, useMemo } from '../../lib/teact/teact';
import type { ApiPeer } from '../../api/types';
import type { AvatarSize } from './Avatar';
import buildClassName from '../../util/buildClassName';
import useOldLang from '../../hooks/useOldLang';
import Avatar, { AVATAR_SIZES } from './Avatar';
import styles from './AvatarList.module.scss';
const DEFAULT_LIMIT = 3;
type OwnProps = {
size: AvatarSize;
peers?: ApiPeer[];
className?: string;
limit?: number;
badgeText?: string;
};
const AvatarList: FC<OwnProps> = ({
peers,
size,
className,
limit = DEFAULT_LIMIT,
badgeText,
}) => {
const lang = useOldLang();
const pxSize = typeof size === 'number' ? size : AVATAR_SIZES[size];
const renderingBadgeText = useMemo(() => {
if (badgeText) return badgeText;
if (!peers?.length || peers.length <= limit) return undefined;
return `+${peers.length - limit}`;
}, [badgeText, peers, limit]);
return (
<div
className={buildClassName(className, styles.root)}
style={`--_size: ${pxSize}px;`}
dir={lang.isRtl ? 'rtl' : 'ltr'}
>
{peers?.slice(0, limit).map((peer) => <Avatar size={size} peer={peer} className={styles.avatar} />)}
{renderingBadgeText && (
<div className={styles.badge}>
{renderingBadgeText}
</div>
)}
</div>
);
};
export default memo(AvatarList);