import { useFetchEvent } from '@/hooks' import { openNoteFromFetchOrCache } from '@/lib/navigation-related-events' import { parsePaytoTagType } from '@/lib/payto' import { relayHintsFromEventTags } from '@/lib/relay-list-builder' import { getPaymentNotificationInfo, getSuperchatReferenceFetchId } from '@/lib/superchat' import { toProfile } from '@/lib/link' import { cn } from '@/lib/utils' import { Event } from 'nostr-tools' import { useMemo, type MouseEvent } from 'react' import { useTranslation } from 'react-i18next' import { useSmartNoteNavigationOptional, useSecondaryPageOptional } from '@/PageManager' import Username from '../Username' import SuperchatPaymentMethodLabel from './SuperchatPaymentMethodLabel' import SuperchatCommentMarkdown from './SuperchatCommentMarkdown' import TurnIntoSuperchatButton from '../TurnIntoSuperchatButton' export default function Superchat({ event, className, showAttestationAction = false }: { event: Event className?: string /** Notifications feed only — attest incoming payments. */ showAttestationAction?: boolean }) { const { t } = useTranslation() const info = useMemo(() => getPaymentNotificationInfo(event), [event]) const paytoType = useMemo( () => (info?.payto ? parsePaytoTagType(info.payto) : 'unknown'), [info?.payto] ) const { navigateToNote } = useSmartNoteNavigationOptional() const secondaryPage = useSecondaryPageOptional() const push = secondaryPage?.push ?? ((url: string) => { window.location.href = url }) const referencedFetchId = useMemo( () => (info ? getSuperchatReferenceFetchId(info) : undefined), [info] ) const threadRelayHints = useMemo(() => relayHintsFromEventTags(event), [event]) const threadFetchOpts = useMemo( () => (threadRelayHints.length ? { relayHints: threadRelayHints } : undefined), [threadRelayHints] ) const { event: targetEvent } = useFetchEvent(referencedFetchId, undefined, threadFetchOpts) if (!info) { return (
[{t('Invalid superchat')}]
) } const { senderPubkey, recipientPubkey, comment } = info const hasThreadTarget = Boolean(targetEvent || referencedFetchId) const hasTarget = hasThreadTarget || Boolean(recipientPubkey) const hasMetaLine = (recipientPubkey && recipientPubkey !== senderPubkey) || hasTarget const openTarget = (e: MouseEvent) => { e.stopPropagation() if (referencedFetchId) { openNoteFromFetchOrCache(navigateToNote, referencedFetchId, targetEvent) } else if (recipientPubkey) { push(toProfile(recipientPubkey)) } } return (
{hasMetaLine ? (
{recipientPubkey && recipientPubkey !== senderPubkey ? ( {t('to')}{' '} ) : null} {hasTarget ? ( ) : null}
) : null}
{t('Superchat')}
{comment ? ( ) : null} {showAttestationAction ? ( ) : null}
) }