import { Drawer, DrawerContent, DrawerOverlay } from '@/components/ui/drawer' import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import { useNoteStatsById } from '@/hooks/useNoteStatsById' import { createReactionDraftEvent } from '@/lib/draft-event' import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' import noteStatsService from '@/services/note-stats.service' import { Loader, SmilePlus } from 'lucide-react' import { Event } from 'nostr-tools' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import Emoji from '../Emoji' import EmojiPicker from '../EmojiPicker' import SuggestedEmojis from '../SuggestedEmojis' import { formatCount } from './utils' export default function LikeButton({ event }: { event: Event }) { const { t } = useTranslation() const { isSmallScreen } = useScreenSize() const { pubkey, publish, checkLogin } = useNostr() const [liking, setLiking] = useState(false) const [isEmojiReactionsOpen, setIsEmojiReactionsOpen] = useState(false) const [isPickerOpen, setIsPickerOpen] = useState(false) const noteStats = useNoteStatsById(event.id) const { myLastEmoji, likeCount } = useMemo(() => { const stats = noteStats || {} const like = stats.likes?.find((like) => like.pubkey === pubkey) return { myLastEmoji: like?.emoji, likeCount: stats.likes?.length } }, [noteStats, pubkey]) const like = async (emoji: string) => { checkLogin(async () => { if (liking || !pubkey) return setLiking(true) const timer = setTimeout(() => setLiking(false), 10_000) try { if (!noteStats?.updatedAt) { await noteStatsService.fetchNoteStats(event, pubkey) } const reaction = createReactionDraftEvent(event, emoji) const evt = await publish(reaction) noteStatsService.updateNoteStatsByEvents([evt]) } catch (error) { console.error('like failed', error) } finally { setLiking(false) clearTimeout(timer) } }) } const trigger = ( ) if (isSmallScreen) { return ( <> {trigger} setIsEmojiReactionsOpen(false)} /> { setIsEmojiReactionsOpen(false) like(data.emoji) }} /> ) } return ( { setIsEmojiReactionsOpen(open) if (open) { setIsPickerOpen(false) } }} > {trigger} {isPickerOpen ? ( { e.stopPropagation() setIsEmojiReactionsOpen(false) like(data.emoji) }} /> ) : ( { setIsEmojiReactionsOpen(false) like(emoji) }} onMoreButtonClick={() => { setIsPickerOpen(true) }} /> )} ) }