mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
at ruby-v 1.8 kB view raw
1import {View} from 'react-native' 2import {moderateProfile} from '@atproto/api' 3 4import {useModerationOpts} from '#/state/preferences/moderation-opts' 5import {useProfilesQuery} from '#/state/queries/profile' 6import {UserAvatar} from '#/view/com/util/UserAvatar' 7import {atoms as a, useTheme} from '#/alf' 8 9export function AvatarStack({ 10 profiles, 11 size = 26, 12}: { 13 profiles: string[] 14 size?: number 15}) { 16 const halfSize = size / 2 17 const {data, error} = useProfilesQuery({handles: profiles}) 18 const t = useTheme() 19 const moderationOpts = useModerationOpts() 20 21 if (error) { 22 console.error(error) 23 return null 24 } 25 26 const isPending = !data || !moderationOpts 27 28 const items = isPending 29 ? Array.from({length: profiles.length}).map((_, i) => ({ 30 key: i, 31 profile: null, 32 moderation: null, 33 })) 34 : data.profiles.map(item => ({ 35 key: item.did, 36 profile: item, 37 moderation: moderateProfile(item, moderationOpts), 38 })) 39 40 return ( 41 <View 42 style={[ 43 a.flex_row, 44 a.align_center, 45 a.relative, 46 {width: size + (items.length - 1) * halfSize}, 47 ]}> 48 {items.map((item, i) => ( 49 <View 50 key={item.key} 51 style={[ 52 t.atoms.bg_contrast_25, 53 a.relative, 54 { 55 width: size, 56 height: size, 57 left: i * -halfSize, 58 borderWidth: 1, 59 borderColor: t.atoms.bg.backgroundColor, 60 borderRadius: 999, 61 zIndex: 3 - i, 62 }, 63 ]}> 64 {item.profile && ( 65 <UserAvatar 66 size={size - 2} 67 avatar={item.profile.avatar} 68 moderation={item.moderation.ui('avatar')} 69 /> 70 )} 71 </View> 72 ))} 73 </View> 74 ) 75}