import { isMentioningMutedUsers } from '@/lib/event' import { tagNameEquals } from '@/lib/tag' import { useContentPolicy } from '@/providers/ContentPolicyProvider' import { useMuteList } from '@/providers/MuteListProvider' import client from '@/services/client.service' import { eventService } from '@/services/client.service' import { Event, kinds, nip19, verifyEvent } from 'nostr-tools' import { useEffect, useMemo, useState } from 'react' import MainNoteCard from './MainNoteCard' export default function RepostNoteCard({ event, className, filterMutedNotes = true, pinned = false }: { event: Event className?: string filterMutedNotes?: boolean pinned?: boolean }) { const { mutePubkeySet } = useMuteList() const { hideContentMentioningMutedUsers } = useContentPolicy() const [targetEvent, setTargetEvent] = useState(null) const shouldHide = useMemo(() => { if (!targetEvent) return true if (filterMutedNotes && mutePubkeySet.has(targetEvent.pubkey)) { return true } if (hideContentMentioningMutedUsers && isMentioningMutedUsers(targetEvent, mutePubkeySet)) { return true } return false }, [targetEvent, filterMutedNotes, hideContentMentioningMutedUsers, mutePubkeySet]) 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 eventService.fetchEvent(targetEventId) if (targetEvent) { setTargetEvent(targetEvent) } } catch { // ignore } } fetch() }, [event]) if (!targetEvent || shouldHide) return null return }