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.
78 lines
2.6 KiB
78 lines
2.6 KiB
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<Event | null>(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 <MainNoteCard className={className} reposter={event.pubkey} event={targetEvent} pinned={pinned} /> |
|
}
|
|
|