import React, { useMemo } from 'react'; import { StyleSheet, View } from 'react-native'; import { UserResponse } from 'stream-chat'; import { avatarSizes } from './constants'; import { UserAvatar } from './UserAvatar'; import { BadgeCount } from '../Badge'; export type AvatarStackProps = { avatarSize?: 'md' | 'sm' | 'xs'; maxVisible?: number; items: React.ReactNode[]; overlap?: number; }; export const AvatarStack = (props: AvatarStackProps) => { const { avatarSize = 'sm', maxVisible = 3, items = [], overlap = 0 } = props; const styles = useStyles(); const diameter = avatarSizes[avatarSize].width; const visiblePortion = diameter * (1 - overlap); const visibleItems = items.slice(0, maxVisible); const extraCount = items.length - visibleItems.length; const totalWidth = diameter + (visibleItems.length - 1) * visiblePortion; const badgeCountSize = avatarSize === 'md' ? 'lg' : avatarSize === 'sm' ? 'md' : 'sm'; return ( {visibleItems.map((item, index) => { return ( {item} ); })} {extraCount > 0 && ( )} ); }; export type UserAvatarStackProps = Pick< AvatarStackProps, 'avatarSize' | 'maxVisible' | 'overlap' > & { users: UserResponse[]; }; export const UserAvatarStack = ({ avatarSize = 'sm', maxVisible, overlap, users, }: UserAvatarStackProps) => { const items = useMemo( () => users.map((user) => { return ; }), [avatarSize, users], ); return ( ); }; const useStyles = () => { return useMemo( () => StyleSheet.create({ container: { flexDirection: 'row', alignItems: 'center', }, item: { position: 'absolute', }, badgeCount: {}, wrapper: { flexDirection: 'row', }, }), [], ); };