diff --git a/packages/app/src/Element/NostrLink.tsx b/packages/app/src/Element/NostrLink.tsx index 4d925216..1b140782 100644 --- a/packages/app/src/Element/NostrLink.tsx +++ b/packages/app/src/Element/NostrLink.tsx @@ -5,6 +5,7 @@ import Mention from "Element/Mention"; import NostrFileHeader from "Element/NostrFileHeader"; import { parseNostrLink } from "Util"; import NoteQuote from "Element/NoteQuote"; +import ZapstrEmbed from "Element/ZapstrEmbed"; export default function NostrLink({ link, depth }: { link: string; depth?: number }) { const nav = parseNostrLink(link); @@ -15,6 +16,10 @@ export default function NostrLink({ link, depth }: { link: string; depth?: numbe if (nav.kind === EventKind.FileHeader) { return ; } + if (nav.kind === 31337) { + return ; + } + if ((depth ?? 0) > 0) { const evLink = nav.encode(); return ( diff --git a/packages/app/src/Element/ZapstrEmbed.tsx b/packages/app/src/Element/ZapstrEmbed.tsx new file mode 100644 index 00000000..422682b0 --- /dev/null +++ b/packages/app/src/Element/ZapstrEmbed.tsx @@ -0,0 +1,11 @@ +import useEventFeed from "Feed/EventFeed"; +import Spinner from "Icons/Spinner"; +import { NostrLink } from "Util"; +import Text from "./Text"; + +export default function ZapstrEmbed({ link }: { link: NostrLink }) { + const ev = useEventFeed(link); + + if (!ev.data) return ; + return ; +} diff --git a/packages/app/src/Feed/EventFeed.ts b/packages/app/src/Feed/EventFeed.ts index 798a5696..359dbee8 100644 --- a/packages/app/src/Feed/EventFeed.ts +++ b/packages/app/src/Feed/EventFeed.ts @@ -1,13 +1,24 @@ import { useMemo } from "react"; +import { NostrPrefix } from "@snort/nostr"; import useRequestBuilder from "Hooks/useRequestBuilder"; import { RequestBuilder, ReplaceableNoteStore } from "System"; -import { NostrLink } from "Util"; +import { NostrLink, unwrap } from "Util"; export default function useEventFeed(link: NostrLink) { const sub = useMemo(() => { const b = new RequestBuilder(`event:${link.id.slice(0, 12)}`); - b.withFilter().id(link.id, link.relays?.at(0)); + if (link.type === NostrPrefix.Address) { + const f = b.withFilter().tag("d", [link.id]); + if (link.author) { + f.authors([unwrap(link.author)]); + } + if (link.kind) { + f.kinds([unwrap(link.kind)]); + } + } else { + b.withFilter().id(link.id, link.relays?.at(0)); + } return b; }, [link]); diff --git a/packages/nostr/src/legacy/Links.ts b/packages/nostr/src/legacy/Links.ts index 8cc26187..c21763ae 100644 --- a/packages/nostr/src/legacy/Links.ts +++ b/packages/nostr/src/legacy/Links.ts @@ -61,16 +61,22 @@ export function decodeTLV(str: string) { entries.push({ type: t, length: l, - value: decodeTLVEntry(t, new Uint8Array(v)), + value: decodeTLVEntry(t, decoded.prefix, new Uint8Array(v)), }); x += 2 + l; } return entries; } -function decodeTLVEntry(type: TLVEntryType, data: Uint8Array) { +function decodeTLVEntry(type: TLVEntryType, prefix: string, data: Uint8Array) { switch (type) { - case TLVEntryType.Special: + case TLVEntryType.Special: { + if (prefix === NostrPrefix.Address) { + return new TextDecoder("ASCII").decode(data); + } else { + return secp.utils.bytesToHex(data); + } + } case TLVEntryType.Author: { return secp.utils.bytesToHex(data); }