|
|
|
|
@ -1,7 +1,8 @@
@@ -1,7 +1,8 @@
|
|
|
|
|
import { tagNameEquals } from '@/lib/tag' |
|
|
|
|
import { useMuteList } from '@/providers/MuteListProvider' |
|
|
|
|
import client from '@/services/client.service' |
|
|
|
|
import { Event, kinds, verifyEvent } from 'nostr-tools' |
|
|
|
|
import { useMemo } from 'react' |
|
|
|
|
import { Event, kinds, nip19, verifyEvent } from 'nostr-tools' |
|
|
|
|
import { useEffect, useState } from 'react' |
|
|
|
|
import GenericNoteCard from './GenericNoteCard' |
|
|
|
|
|
|
|
|
|
export default function RepostNoteCard({ |
|
|
|
|
@ -14,25 +15,47 @@ export default function RepostNoteCard({
@@ -14,25 +15,47 @@ export default function RepostNoteCard({
|
|
|
|
|
filterMutedNotes?: boolean |
|
|
|
|
}) { |
|
|
|
|
const { mutePubkeys } = useMuteList() |
|
|
|
|
const targetEvent = useMemo(() => { |
|
|
|
|
try { |
|
|
|
|
const targetEvent = event.content ? (JSON.parse(event.content) as Event) : null |
|
|
|
|
if (!targetEvent || !verifyEvent(targetEvent) || targetEvent.kind === kinds.Repost) { |
|
|
|
|
return null |
|
|
|
|
} |
|
|
|
|
client.addEventToCache(targetEvent) |
|
|
|
|
const targetSeenOn = client.getSeenEventRelays(targetEvent.id) |
|
|
|
|
if (targetSeenOn.length === 0) { |
|
|
|
|
const seenOn = client.getSeenEventRelays(event.id) |
|
|
|
|
seenOn.forEach((relay) => { |
|
|
|
|
client.trackEventSeenOn(targetEvent.id, relay) |
|
|
|
|
const [targetEvent, setTargetEvent] = useState<Event | null>(null) |
|
|
|
|
useEffect(() => { |
|
|
|
|
const fetch = async () => { |
|
|
|
|
try { |
|
|
|
|
const eventFromContent = event.content ? (JSON.parse(event.content) as Event) : null |
|
|
|
|
if (eventFromContent && verifyEvent(eventFromContent)) { |
|
|
|
|
if (eventFromContent.kind === kinds.Repost) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
client.addEventToCache(eventFromContent) |
|
|
|
|
const targetSeenOn = client.getSeenEventRelays(eventFromContent.id) |
|
|
|
|
if (targetSeenOn.length === 0) { |
|
|
|
|
const seenOn = client.getSeenEventRelays(event.id) |
|
|
|
|
seenOn.forEach((relay) => { |
|
|
|
|
client.trackEventSeenOn(eventFromContent.id, relay) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
setTargetEvent(eventFromContent) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const [, id, relay, , pubkey] = event.tags.find(tagNameEquals('e')) ?? [] |
|
|
|
|
if (!id) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
const targetEventId = nip19.neventEncode({ |
|
|
|
|
id, |
|
|
|
|
relays: relay ? [relay] : [], |
|
|
|
|
author: pubkey |
|
|
|
|
}) |
|
|
|
|
const targetEvent = await client.fetchEvent(targetEventId) |
|
|
|
|
if (targetEvent) { |
|
|
|
|
setTargetEvent(targetEvent) |
|
|
|
|
} |
|
|
|
|
} catch { |
|
|
|
|
// ignore
|
|
|
|
|
} |
|
|
|
|
return targetEvent |
|
|
|
|
} catch { |
|
|
|
|
return null |
|
|
|
|
} |
|
|
|
|
fetch() |
|
|
|
|
}, [event]) |
|
|
|
|
|
|
|
|
|
if (!targetEvent) return null |
|
|
|
|
if (filterMutedNotes && mutePubkeys.includes(targetEvent.pubkey)) { |
|
|
|
|
return null |
|
|
|
|
|