You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

75 lines
2.4 KiB

import { ExtendedKind } from '@/constants'
import {
findPaymentAttestationForTarget,
getPaymentAttestationTargetId,
getSuperchatPaymentRecipientPubkey
} from '@/lib/superchat'
import client from '@/services/client.service'
import { Event as NostrEvent } from 'nostr-tools'
import { useEffect, useState } from 'react'
export function usePaymentAttestationStatus(targetEvent: NostrEvent | undefined) {
const [attested, setAttested] = useState(false)
const [attestationEvent, setAttestationEvent] = useState<NostrEvent | null>(null)
const [checking, setChecking] = useState(false)
const recipientPubkey = targetEvent ? getSuperchatPaymentRecipientPubkey(targetEvent) : null
const targetId = targetEvent?.id?.toLowerCase()
useEffect(() => {
setAttested(false)
setAttestationEvent(null)
if (!targetEvent?.id || !recipientPubkey) return
let cancelled = false
setChecking(true)
void client
.fetchEvents(
[],
{
kinds: [ExtendedKind.PAYMENT_ATTESTATION],
authors: [recipientPubkey],
'#e': [targetEvent.id],
limit: 5
},
{ cache: true, eoseTimeout: 4000, globalTimeout: 10_000 }
)
.then((attestations) => {
if (cancelled) return
const match = findPaymentAttestationForTarget(attestations, targetEvent.id, recipientPubkey)
setAttestationEvent(match ?? null)
setAttested(Boolean(match))
})
.catch(() => {
/* optional */
})
.finally(() => {
if (!cancelled) setChecking(false)
})
return () => {
cancelled = true
}
}, [targetEvent, recipientPubkey, targetId])
useEffect(() => {
if (!targetEvent?.id || !recipientPubkey) return
const handleAttestation = (data: globalThis.Event) => {
const evt = (data as CustomEvent<NostrEvent>).detail
if (!evt || evt.kind !== ExtendedKind.PAYMENT_ATTESTATION) return
if (evt.pubkey.toLowerCase() !== recipientPubkey.toLowerCase()) return
const attestedId = getPaymentAttestationTargetId(evt)
if (attestedId?.toLowerCase() === targetEvent.id.toLowerCase()) {
setAttested(true)
setAttestationEvent(evt)
}
}
client.addEventListener('newEvent', handleAttestation)
return () => client.removeEventListener('newEvent', handleAttestation)
}, [targetEvent?.id, recipientPubkey])
return { attested, attestationEvent, checking, recipientPubkey }
}