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