import { Link } from 'react-router-dom'; import { nip19 } from 'nostr-tools'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { useAuthor } from '@/hooks/useAuthor'; import { genUserName } from '@/lib/genUserName'; import { cn } from '@/lib/utils'; function StackAvatar({ pubkey, index }: { pubkey: string; index: number }) { const author = useAuthor(pubkey); const name = author.data?.metadata?.name ?? genUserName(pubkey); const pic = author.data?.metadata?.picture; const npub = (() => { try { return nip19.npubEncode(pubkey); } catch { return null; } })(); const avatar = ( {name.slice(0, 2).toUpperCase()} ); if (!npub) return avatar; return ( {avatar} ); } /** * A horizontal, overlapping stack of attendee avatars with a "+N" overflow. * Purely presentational — pass a list of pubkeys. */ export function AttendeeStack({ pubkeys, max = 5, className, }: { pubkeys: string[]; max?: number; className?: string; }) { if (pubkeys.length === 0) return null; const shown = pubkeys.slice(0, max); const overflow = pubkeys.length - shown.length; return (
{shown.map((pk, i) => ( ))}
{overflow > 0 && ( +{overflow} )}
); }