mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
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}