15 changed files with 88 additions and 22 deletions
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
import UserAvatar from '@/components/UserAvatar' |
||||
import { useNostr } from '@/providers/NostrProvider' |
||||
import { useScreenSize } from '@/providers/ScreenSizeProvider' |
||||
import client from '@/services/client.service' |
||||
import { useEffect, useState } from 'react' |
||||
import { useTranslation } from 'react-i18next' |
||||
|
||||
export default function FollowedBy({ pubkey }: { pubkey: string }) { |
||||
const { t } = useTranslation() |
||||
const { isSmallScreen } = useScreenSize() |
||||
const [followedBy, setFollowedBy] = useState<string[]>([]) |
||||
const { pubkey: accountPubkey } = useNostr() |
||||
|
||||
useEffect(() => { |
||||
if (!pubkey || !accountPubkey) return |
||||
|
||||
const init = async () => { |
||||
const followings = (await client.fetchFollowings(accountPubkey)).reverse() |
||||
const followingsOfFollowings = await Promise.all( |
||||
followings.map(async (following) => { |
||||
return client.fetchFollowings(following) |
||||
}) |
||||
) |
||||
const _followedBy: string[] = [] |
||||
const limit = isSmallScreen ? 3 : 5 |
||||
for (const [index, following] of followings.entries()) { |
||||
if (following === pubkey) continue |
||||
if (followingsOfFollowings[index].includes(pubkey)) { |
||||
_followedBy.push(following) |
||||
} |
||||
if (_followedBy.length >= limit) { |
||||
break |
||||
} |
||||
} |
||||
setFollowedBy(_followedBy) |
||||
} |
||||
init() |
||||
}, [pubkey, accountPubkey]) |
||||
|
||||
if (followedBy.length === 0) return null |
||||
|
||||
return ( |
||||
<div className="flex items-center gap-1"> |
||||
<div className="text-muted-foreground">{t('Followed by')}</div> |
||||
{followedBy.map((p) => ( |
||||
<UserAvatar userId={p} key={p} size="xSmall" /> |
||||
))} |
||||
</div> |
||||
) |
||||
} |
||||
Loading…
Reference in new issue