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 };