diff --git a/src/utils/note.ts b/src/utils/note.ts index e182dec..c10e3e9 100644 --- a/src/utils/note.ts +++ b/src/utils/note.ts @@ -1,7 +1,7 @@ import 'linkify-plugin-hashtag'; import linkifyStr from 'linkify-string'; import linkify from 'linkifyjs'; -import { nip21 } from 'nostr-tools'; +import { nip19, nip21 } from 'nostr-tools'; import { Conf } from '@/config.ts'; import { getUrlMediaType, isPermittedMediaType } from '@/utils/media.ts'; @@ -18,10 +18,15 @@ const linkifyOpts: linkify.Opts = { }, url: ({ content }) => { try { - const { value } = nip21.parse(content); - const name = value.substring(0, 8); - const href = Conf.local(`/@${value}`); - return `@${name}`; + const { decoded } = nip21.parse(content); + const pubkey = getDecodedPubkey(decoded); + if (pubkey) { + const name = pubkey.substring(0, 8); + const href = Conf.local(`/users/${pubkey}`); + return `@${name}`; + } else { + return ''; + } } catch { return `${content}`; } @@ -103,4 +108,14 @@ function isLinkURL(link: Link): boolean { return link.type === 'url'; } +/** Get pubkey from decoded bech32 entity, or undefined if not applicable. */ +function getDecodedPubkey(decoded: nip19.DecodeResult): string | undefined { + switch (decoded.type) { + case 'npub': + return decoded.data; + case 'nprofile': + return decoded.data.pubkey; + } +} + export { getMediaLinks, parseNoteContent, stripimeta };