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