From f00ea38e17a1712f9790a39bbc05e51cbdf9ff01 Mon Sep 17 00:00:00 2001 From: codytseng Date: Sun, 16 Feb 2025 20:33:33 +0800 Subject: [PATCH] fix: clear content when reposting protected events --- src/components/NoteCard/RepostNoteCard.tsx | 57 +++++++++++++++------- src/lib/draft-event.ts | 9 ++-- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/components/NoteCard/RepostNoteCard.tsx b/src/components/NoteCard/RepostNoteCard.tsx index ea194317..36f43518 100644 --- a/src/components/NoteCard/RepostNoteCard.tsx +++ b/src/components/NoteCard/RepostNoteCard.tsx @@ -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({ 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(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 diff --git a/src/lib/draft-event.ts b/src/lib/draft-event.ts index 31baa97b..bd8e8041 100644 --- a/src/lib/draft-event.ts +++ b/src/lib/draft-event.ts @@ -9,6 +9,7 @@ import { extractImagesFromContent, extractMentions, getEventCoordinate, + isProtectedEvent, isReplaceable } from './event' @@ -35,14 +36,15 @@ export function createReactionDraftEvent(event: Event): TDraftEvent { // https://github.com/nostr-protocol/nips/blob/master/18.md export function createRepostDraftEvent(event: Event): TDraftEvent { + const isProtected = isProtectedEvent(event) const tags = [ - ['e', event.id, client.getEventHint(event.id), event.pubkey], + ['e', event.id, client.getEventHint(event.id), 'mentions', event.pubkey], ['p', event.pubkey] ] return { kind: kinds.Repost, - content: JSON.stringify(event), + content: isProtected ? '' : JSON.stringify(event), tags, created_at: dayjs().unix() } @@ -63,7 +65,6 @@ export async function createShortTextNoteDraftEvent( const tags = pubkeys .map((pubkey) => ['p', pubkey]) - .concat(otherRelatedEventIds.map((eventId) => ['e', eventId, client.getEventHint(eventId)])) .concat(quoteEventIds.map((eventId) => ['q', eventId, client.getEventHint(eventId)])) .concat(hashtags.map((hashtag) => ['t', hashtag])) @@ -71,6 +72,8 @@ export async function createShortTextNoteDraftEvent( tags.push(['e', rootEventId, client.getEventHint(rootEventId), 'root']) } + tags.push(...otherRelatedEventIds.map((eventId) => ['e', eventId, client.getEventHint(eventId)])) + if (parentEventId) { tags.push(['e', parentEventId, client.getEventHint(parentEventId), 'reply']) }