From 2e663dcb4c59ad01046701606a4d5009b0bb8127 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Wed, 18 Oct 2023 10:01:25 +0300 Subject: [PATCH] NostrLink.encode(prefix: NostrPrefix) --- packages/app/src/Element/Deck/Articles.tsx | 5 +---- .../app/src/Element/Embed/ZapstrEmbed.tsx | 2 +- .../app/src/Element/Event/NoteContextMenu.tsx | 4 ++-- .../app/src/Element/Event/NoteCreator.tsx | 2 +- packages/app/src/Element/Event/NoteFooter.tsx | 2 +- packages/app/src/Element/Event/NoteInner.tsx | 6 ++--- packages/app/src/Element/Event/Poll.tsx | 9 ++------ packages/app/src/Element/Event/Thread.tsx | 2 +- packages/app/src/Element/Event/ZapGoal.tsx | 2 +- packages/app/src/Element/LiveEvent.tsx | 2 +- packages/app/src/Element/LiveStreams.tsx | 2 +- packages/app/src/Pages/DeckLayout.tsx | 2 +- .../app/src/Pages/Profile/ProfilePage.tsx | 2 +- packages/app/src/Pages/Root.tsx | 2 +- packages/app/src/SnortUtils/index.ts | 10 --------- packages/app/src/Zapper.ts | 4 ++-- packages/system/src/nostr-link.ts | 22 +++++++++---------- 17 files changed, 31 insertions(+), 49 deletions(-) diff --git a/packages/app/src/Element/Deck/Articles.tsx b/packages/app/src/Element/Deck/Articles.tsx index 7c5eb398..8c7eff25 100644 --- a/packages/app/src/Element/Deck/Articles.tsx +++ b/packages/app/src/Element/Deck/Articles.tsx @@ -9,10 +9,7 @@ import { DeckContext } from "Pages/DeckLayout"; export default function Articles() { const data = useArticles(); const deck = useContext(DeckContext); - const related = useReactions( - "articles:reactions", - data.data?.map(v => NostrLink.fromEvent(v, CONFIG.eventLinkPrefix)) ?? [], - ); + const related = useReactions("articles:reactions", data.data?.map(v => NostrLink.fromEvent(v)) ?? []); return ( <> diff --git a/packages/app/src/Element/Embed/ZapstrEmbed.tsx b/packages/app/src/Element/Embed/ZapstrEmbed.tsx index ce33c677..04ccc4ee 100644 --- a/packages/app/src/Element/Embed/ZapstrEmbed.tsx +++ b/packages/app/src/Element/Embed/ZapstrEmbed.tsx @@ -12,7 +12,7 @@ export default function ZapstrEmbed({ ev }: { ev: NostrEvent }) { const subject = ev.tags.find(a => a[0] === "subject"); const refPersons = ev.tags.filter(a => a[0] === "p"); - const link = NostrLink.fromEvent(ev, CONFIG.eventLinkPrefix).encode(); + const link = NostrLink.fromEvent(ev).encode(CONFIG.eventLinkPrefix); return ( <>
diff --git a/packages/app/src/Element/Event/NoteContextMenu.tsx b/packages/app/src/Element/Event/NoteContextMenu.tsx index 8865a2c3..645690f8 100644 --- a/packages/app/src/Element/Event/NoteContextMenu.tsx +++ b/packages/app/src/Element/Event/NoteContextMenu.tsx @@ -45,7 +45,7 @@ export function NoteContextMenu({ ev, ...props }: NosteContextMenuProps) { } async function share() { - const link = NostrLink.fromEvent(ev, CONFIG.eventLinkPrefix).encode(); + const link = NostrLink.fromEvent(ev).encode(CONFIG.eventLinkPrefix); const url = `${window.location.protocol}//${window.location.host}/${link}`; if ("share" in window.navigator) { await window.navigator.share({ @@ -81,7 +81,7 @@ export function NoteContextMenu({ ev, ...props }: NosteContextMenuProps) { } async function copyId() { - const link = NostrLink.fromEvent(ev).encode(); + const link = NostrLink.fromEvent(ev).encode(CONFIG.eventLinkPrefix); await navigator.clipboard.writeText(link); } diff --git a/packages/app/src/Element/Event/NoteCreator.tsx b/packages/app/src/Element/Event/NoteCreator.tsx index 8a6bad0b..9218caa7 100644 --- a/packages/app/src/Element/Event/NoteCreator.tsx +++ b/packages/app/src/Element/Event/NoteCreator.tsx @@ -104,7 +104,7 @@ export function NoteCreator() { note.note += "\n"; } const link = NostrLink.fromEvent(note.quote); - note.note += `nostr:${link.encode()}`; + note.note += `nostr:${link.encode(CONFIG.eventLinkPrefix)}`; const quoteTag = link.toEventTag(); if (quoteTag) { extraTags ??= []; diff --git a/packages/app/src/Element/Event/NoteFooter.tsx b/packages/app/src/Element/Event/NoteFooter.tsx index 64a8b75e..1d587d14 100644 --- a/packages/app/src/Element/Event/NoteFooter.tsx +++ b/packages/app/src/Element/Event/NoteFooter.tsx @@ -123,7 +123,7 @@ export default function NoteFooter(props: NoteFooterProps) { name: getDisplayName(author, ev.pubkey), zap: { pubkey: ev.pubkey, - event: NostrLink.fromEvent(ev, CONFIG.eventLinkPrefix), + event: NostrLink.fromEvent(ev), }, } as ZapTarget, ]; diff --git a/packages/app/src/Element/Event/NoteInner.tsx b/packages/app/src/Element/Event/NoteInner.tsx index 098912e8..c60faeb5 100644 --- a/packages/app/src/Element/Event/NoteInner.tsx +++ b/packages/app/src/Element/Event/NoteInner.tsx @@ -151,12 +151,12 @@ export function NoteInner(props: NoteProps) { return; } - const link = NostrLink.fromEvent(eTarget, CONFIG.eventLinkPrefix); + const link = NostrLink.fromEvent(eTarget); // detect cmd key and open in new tab if (e.metaKey) { - window.open(`/${link.encode()}`, "_blank"); + window.open(`/${link.encode(CONFIG.eventLinkPrefix)}`, "_blank"); } else { - navigate(`/${link.encode()}`, { + navigate(`/${link.encode(CONFIG.eventLinkPrefix)}`, { state: eTarget, }); } diff --git a/packages/app/src/Element/Event/Poll.tsx b/packages/app/src/Element/Event/Poll.tsx index eb96fd28..482c0a01 100644 --- a/packages/app/src/Element/Event/Poll.tsx +++ b/packages/app/src/Element/Event/Poll.tsx @@ -58,13 +58,8 @@ export default function Poll(props: PollProps) { setVoting(opt); const r = Object.keys(relays.item); - const zap = await publisher.zap( - amount * 1000, - props.ev.pubkey, - r, - NostrLink.fromEvent(props.ev, CONFIG.eventLinkPrefix), - undefined, - eb => eb.tag(["poll_option", opt.toString()]), + const zap = await publisher.zap(amount * 1000, props.ev.pubkey, r, NostrLink.fromEvent(props.ev), undefined, eb => + eb.tag(["poll_option", opt.toString()]), ); const lnurl = props.ev.tags.find(a => a[0] === "zap")?.[1] || pollerProfile?.lud16 || pollerProfile?.lud06; diff --git a/packages/app/src/Element/Event/Thread.tsx b/packages/app/src/Element/Event/Thread.tsx index 5a6dba40..96392ec6 100644 --- a/packages/app/src/Element/Event/Thread.tsx +++ b/packages/app/src/Element/Event/Thread.tsx @@ -283,7 +283,7 @@ export function Thread(props: { onBack?: () => void; disableSpotlight?: boolean notes={replies} related={getAllLinkReactions( thread.reactions, - replies.map(a => NostrLink.fromEvent(a, CONFIG.eventLinkPrefix)), + replies.map(a => NostrLink.fromEvent(a)), )} chains={thread.chains} onNavigate={navigateThread} diff --git a/packages/app/src/Element/Event/ZapGoal.tsx b/packages/app/src/Element/Event/ZapGoal.tsx index fc04d7d7..9cc40a76 100644 --- a/packages/app/src/Element/Event/ZapGoal.tsx +++ b/packages/app/src/Element/Event/ZapGoal.tsx @@ -12,7 +12,7 @@ import { FormattedNumber } from "react-intl"; export function ZapGoal({ ev }: { ev: NostrEvent }) { const [zap, setZap] = useState(false); - const zaps = useZapsFeed(NostrLink.fromEvent(ev, CONFIG.eventLinkPrefix)); + const zaps = useZapsFeed(NostrLink.fromEvent(ev)); const target = Number(findTag(ev, "amount")); const amount = zaps.reduce((acc, v) => (acc += v.amount * 1000), 0); const progress = amount / target; diff --git a/packages/app/src/Element/LiveEvent.tsx b/packages/app/src/Element/LiveEvent.tsx index af44d757..838444aa 100644 --- a/packages/app/src/Element/LiveEvent.tsx +++ b/packages/app/src/Element/LiveEvent.tsx @@ -44,7 +44,7 @@ export function LiveEvent({ ev }: { ev: NostrEvent }) { } function cta() { - const link = `https://zap.stream/${NostrLink.fromEvent(ev, CONFIG.eventLinkPrefix).encode()}`; + const link = `https://zap.stream/${NostrLink.fromEvent(ev).encode(CONFIG.eventLinkPrefix)}`; switch (status) { case "live": { return ( diff --git a/packages/app/src/Element/LiveStreams.tsx b/packages/app/src/Element/LiveStreams.tsx index 02f83c26..74cb7657 100644 --- a/packages/app/src/Element/LiveStreams.tsx +++ b/packages/app/src/Element/LiveStreams.tsx @@ -32,7 +32,7 @@ function LiveStreamEvent({ ev }: { ev: NostrEvent }) { const image = findTag(ev, "image"); const status = findTag(ev, "status"); - const link = NostrLink.fromEvent(ev).encode(); + const link = NostrLink.fromEvent(ev).encode(CONFIG.eventLinkPrefix); const imageProxy = proxy(image ?? ""); return ( diff --git a/packages/app/src/Pages/DeckLayout.tsx b/packages/app/src/Pages/DeckLayout.tsx index e43e568f..2334b0c3 100644 --- a/packages/app/src/Pages/DeckLayout.tsx +++ b/packages/app/src/Pages/DeckLayout.tsx @@ -185,7 +185,7 @@ function MediaCol({ setThread }: { setThread: (e: NostrLink) => void }) { "--img": `url(${proxy(images[0].content)})`, } as CSSProperties } - onClick={() => setThread(NostrLink.fromEvent(e, CONFIG.eventLinkPrefix))}>
+ onClick={() => setThread(NostrLink.fromEvent(e))}> ); }} /> diff --git a/packages/app/src/Pages/Profile/ProfilePage.tsx b/packages/app/src/Pages/Profile/ProfilePage.tsx index c3f4dfeb..09dd6587 100644 --- a/packages/app/src/Pages/Profile/ProfilePage.tsx +++ b/packages/app/src/Pages/Profile/ProfilePage.tsx @@ -238,7 +238,7 @@ export default function ProfilePage({ id: propId, state }: ProfilePageProps) { ); diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx index 13d57174..593c2b1b 100644 --- a/packages/app/src/Pages/Root.tsx +++ b/packages/app/src/Pages/Root.tsx @@ -148,7 +148,7 @@ export const NotesTab = () => { noteOnClick={ deckContext ? ev => { - deckContext.setThread(NostrLink.fromEvent(ev, CONFIG.eventLinkPrefix)); + deckContext.setThread(NostrLink.fromEvent(ev)); } : undefined } diff --git a/packages/app/src/SnortUtils/index.ts b/packages/app/src/SnortUtils/index.ts index 7b12ff34..c8e18885 100644 --- a/packages/app/src/SnortUtils/index.ts +++ b/packages/app/src/SnortUtils/index.ts @@ -110,16 +110,6 @@ export function eventLink(hex: u256, relays?: Array | string) { return `/${encoded}`; } -/** - * Convert hex pubkey to bech32 link url - */ -export function profileLink(hex: HexKey, relays?: Array | string) { - const encoded = relays - ? encodeTLV(NostrPrefix.Profile, hex, Array.isArray(relays) ? relays : [relays]) - : hexToBech32(NostrPrefix.PublicKey, hex); - return `/${encoded}`; -} - /** * Convert hex to bech32 */ diff --git a/packages/app/src/Zapper.ts b/packages/app/src/Zapper.ts index ba89c841..2950294c 100644 --- a/packages/app/src/Zapper.ts +++ b/packages/app/src/Zapper.ts @@ -56,7 +56,7 @@ export class Zapper { weight: Number(v[3] ?? 0), zap: { pubkey: v[1], - event: NostrLink.fromEvent(ev, CONFIG.eventLinkPrefix), + event: NostrLink.fromEvent(ev), }, } as ZapTarget; } else { @@ -67,7 +67,7 @@ export class Zapper { weight: 1, zap: { pubkey: ev.pubkey, - event: NostrLink.fromEvent(ev, CONFIG.eventLinkPrefix), + event: NostrLink.fromEvent(ev), }, } as ZapTarget; } diff --git a/packages/system/src/nostr-link.ts b/packages/system/src/nostr-link.ts index f341bbc6..f97856a2 100644 --- a/packages/system/src/nostr-link.ts +++ b/packages/system/src/nostr-link.ts @@ -1,14 +1,14 @@ import { bech32ToHex, hexToBech32, unwrap } from "@snort/shared"; import { - NostrPrefix, decodeTLV, - TLVEntryType, encodeTLV, - NostrEvent, - TaggedNostrEvent, EventExt, - Tag, EventKind, + NostrEvent, + NostrPrefix, + Tag, + TaggedNostrEvent, + TLVEntryType, } from "."; import { findTag } from "./utils"; @@ -21,11 +21,11 @@ export class NostrLink { readonly relays?: Array, ) {} - encode(): string { - if (this.type === NostrPrefix.Note || this.type === NostrPrefix.PrivateKey || this.type === NostrPrefix.PublicKey) { - return hexToBech32(this.type, this.id); + encode(type: NostrPrefix = this.type): string { + if (type === NostrPrefix.Note || type === NostrPrefix.PrivateKey || type === NostrPrefix.PublicKey) { + return hexToBech32(type, this.id); } else { - return encodeTLV(this.type, this.id, this.relays, this.kind, this.author); + return encodeTLV(type, this.id, this.relays, this.kind, this.author); } } @@ -163,14 +163,14 @@ export class NostrLink { throw new Error(`Unknown tag kind ${tag[0]}`); } - static fromEvent(ev: TaggedNostrEvent | NostrEvent, prefixHint = NostrPrefix.Event) { + static fromEvent(ev: TaggedNostrEvent | NostrEvent) { const relays = "relays" in ev ? ev.relays : undefined; if (ev.kind >= 30_000 && ev.kind < 40_000) { const dTag = unwrap(findTag(ev, "d")); return new NostrLink(NostrPrefix.Address, dTag, ev.kind, ev.pubkey, relays); } - return new NostrLink(prefixHint, ev.id, ev.kind, ev.pubkey, relays); + return new NostrLink(NostrPrefix.Event, ev.id, ev.kind, ev.pubkey, relays); } }