import { ScrollArea, ScrollBar } from '@/components/ui/scroll-area' import { createReactionDraftEvent } from '@/lib/draft-event' import { cn } from '@/lib/utils' import { useNostr } from '@/providers/NostrProvider' import { useNoteStats } from '@/providers/NoteStatsProvider' import { TEmoji } from '@/types' import { Loader } from 'lucide-react' import { Event } from 'nostr-tools' import { useMemo, useState } from 'react' import Emoji from '../Emoji' export default function Likes({ event }: { event: Event }) { const { pubkey, checkLogin, publish } = useNostr() const { noteStatsMap, updateNoteStatsByEvents } = useNoteStats() const [liking, setLiking] = useState(null) const likes = useMemo(() => { const _likes = noteStatsMap.get(event.id)?.likes if (!_likes) return [] const stats = new Map }>() _likes.forEach((item) => { const key = typeof item.emoji === 'string' ? item.emoji : item.emoji.url if (!stats.has(key)) { stats.set(key, { key, pubkeys: new Set(), emoji: item.emoji }) } stats.get(key)?.pubkeys.add(item.pubkey) }) return Array.from(stats.values()).sort((a, b) => b.pubkeys.size - a.pubkeys.size) }, [noteStatsMap, event]) if (!likes.length) return null const like = async (key: string, emoji: TEmoji | string) => { checkLogin(async () => { if (liking || !pubkey) return setLiking(key) const timer = setTimeout(() => setLiking((prev) => (prev === key ? null : prev)), 5000) try { const reaction = createReactionDraftEvent(event, emoji) const evt = await publish(reaction) updateNoteStatsByEvents([evt]) } catch (error) { console.error('like failed', error) } finally { setLiking(null) clearTimeout(timer) } }) } return (
{likes.map(({ key, emoji, pubkeys }) => (
{ e.stopPropagation() like(key, emoji) }} > {liking === key ? : }
{pubkeys.size}
))}
) }