import { useStuff } from '@/hooks/useStuff' import { useAllDescendantThreads } from '@/hooks/useThread' import { getEventKey, isMentioningMutedUsers } from '@/lib/event' import { cn } from '@/lib/utils' import { useContentPolicy } from '@/providers/ContentPolicyProvider' import { useMuteList } from '@/providers/MuteListProvider' import { useNostr } from '@/providers/NostrProvider' import { useUserTrust } from '@/providers/UserTrustProvider' import { MessageCircle } from 'lucide-react' import { Event } from 'nostr-tools' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import PostEditor from '../PostEditor' import KeyboardShortcut from './KeyboardShortcut' import { formatCount } from './utils' export default function ReplyButton({ stuff, onReplyClick }: { stuff: Event | string onReplyClick?: () => void }) { const { t } = useTranslation() const { pubkey, checkLogin } = useNostr() const { event, stuffKey } = useStuff(stuff) const allThreads = useAllDescendantThreads(stuffKey) const { hideUntrustedInteractions, isUserTrusted } = useUserTrust() const { mutePubkeySet } = useMuteList() const { hideContentMentioningMutedUsers } = useContentPolicy() const { replyCount, hasReplied } = useMemo(() => { const hasReplied = pubkey ? allThreads.get(stuffKey)?.some((evt) => evt.pubkey === pubkey) : false let replyCount = 0 const replies = [...(allThreads.get(stuffKey) ?? [])] while (replies.length > 0) { const reply = replies.pop() if (!reply) break const replyKey = getEventKey(reply) const nestedReplies = allThreads.get(replyKey) ?? [] replies.push(...nestedReplies) if (hideUntrustedInteractions && !isUserTrusted(reply.pubkey)) { continue } if (mutePubkeySet.has(reply.pubkey)) { continue } if (hideContentMentioningMutedUsers && isMentioningMutedUsers(reply, mutePubkeySet)) { continue } replyCount++ } return { replyCount, hasReplied } }, [allThreads, event, stuffKey, hideUntrustedInteractions]) const [open, setOpen] = useState(false) return ( <> { e.stopPropagation() checkLogin(() => { if (onReplyClick) { onReplyClick() } else { setOpen(true) } }) }} title={t('Reply (r)')} data-action="reply" > {!!replyCount && {formatCount(replyCount)}} {!onReplyClick && } > ) }