import { Button } from '@/components/ui/button' import { Drawer, DrawerContent, DrawerOverlay } from '@/components/ui/drawer' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import { useNoteStatsById } from '@/hooks/useNoteStatsById' import { createRepostDraftEvent } from '@/lib/draft-event' import { getSharableEventId } from '@/lib/event' import { cn } from '@/lib/utils' import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' import noteStatsService from '@/services/note-stats.service' import { Loader, PencilLine, Repeat } from 'lucide-react' import { Event, kinds } from 'nostr-tools' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import PostEditor from '../PostEditor' import { formatCount } from './utils' export default function RepostButton({ event }: { event: Event }) { const { t } = useTranslation() const { isSmallScreen } = useScreenSize() const { publish, checkLogin, pubkey } = useNostr() const noteStats = useNoteStatsById(event.id) const [reposting, setReposting] = useState(false) const [isPostDialogOpen, setIsPostDialogOpen] = useState(false) const [isDrawerOpen, setIsDrawerOpen] = useState(false) const { repostCount, hasReposted } = useMemo(() => { return { repostCount: noteStats?.repostPubkeySet?.size, hasReposted: pubkey ? noteStats?.repostPubkeySet?.has(pubkey) : false } }, [noteStats, event.id]) const canRepost = !hasReposted && !reposting const repost = async () => { checkLogin(async () => { if (!canRepost || !pubkey) return setReposting(true) const timer = setTimeout(() => setReposting(false), 5000) try { const hasReposted = noteStats?.repostPubkeySet?.has(pubkey) if (hasReposted) return if (!noteStats?.updatedAt) { const events = await noteStatsService.fetchNoteStats(event, pubkey) if (events.some((e) => e.kind === kinds.Repost && e.pubkey === pubkey)) { return } } const repost = createRepostDraftEvent(event) const evt = await publish(repost) noteStatsService.updateNoteStatsByEvents([evt]) } catch (error) { console.error('repost failed', error) } finally { setReposting(false) clearTimeout(timer) } }) } const trigger = ( { if (isSmallScreen) { setIsDrawerOpen(true) } }} > {reposting ? : } {!!repostCount && {formatCount(repostCount)}} ) const postEditor = ( ) if (isSmallScreen) { return ( <> {trigger} setIsDrawerOpen(false)} /> { e.stopPropagation() setIsDrawerOpen(false) repost() }} disabled={!canRepost} className="w-full p-6 justify-start text-lg gap-4 [&_svg]:size-5" variant="ghost" > {t('Repost')} { e.stopPropagation() setIsDrawerOpen(false) checkLogin(() => { setIsPostDialogOpen(true) }) }} className="w-full p-6 justify-start text-lg gap-4 [&_svg]:size-5" variant="ghost" > {t('Quote')} {postEditor} > ) } return ( <> {trigger} { e.stopPropagation() repost() }} disabled={!canRepost} > {t('Repost')} { e.stopPropagation() checkLogin(() => { setIsPostDialogOpen(true) }) }} > {t('Quote')} {postEditor} > ) }