-
- {t('Search GifBuddy for more GIFs')}
-
+
+
+
+ {t('Opens in a new tab. Copy a GIF URL there, then paste below. If this picker closed, click “Insert GIF” again to paste.')}
+
+
+
+
+ setPasteUrl(e.target.value)}
+ className="flex-1 min-w-0"
+ />
+
+
+
+
{isLoggedIn && (
<>
{
@@ -25,6 +28,15 @@ export default function ProfileAbout({ about, className }: { about?: string; cla
if (node.type === 'websocket-url') {
return
}
+ if (node.type === 'payto') {
+ return (
+
+ )
+ }
if (node.type === 'hashtag') {
return
}
diff --git a/src/constants.ts b/src/constants.ts
index 8fba58df..f4dd438e 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -122,12 +122,13 @@ export const FAST_WRITE_RELAY_URLS = [
]
/** Relays used for NIP-94 file metadata (kind 1063) / GIF discovery and publish.
- * Include relay.gifbuddy.lol (GifBuddy) so we get many kind 1063 GIFs; damus/primal/thecitadel have fewer. */
+ * Publish to all of these so GIFs are discoverable across clients; some may be temporarily down. */
export const GIF_RELAY_URLS = [
'wss://relay.gifbuddy.lol',
'wss://relay.damus.io',
'wss://relay.primal.net',
- 'wss://thecitadel.nostr1.com'
+ 'wss://thecitadel.nostr1.com',
+ 'wss://nos.lol',
]
export const SEARCHABLE_RELAY_URLS = [
diff --git a/src/lib/content-parser.ts b/src/lib/content-parser.ts
index 7bf1088a..d92fa524 100644
--- a/src/lib/content-parser.ts
+++ b/src/lib/content-parser.ts
@@ -8,6 +8,7 @@ import {
WS_URL_REGEX,
YOUTUBE_URL_REGEX
} from '@/constants'
+import { PAYTO_URI_REGEX } from '@/lib/payto'
import { isImage, isMedia } from './url'
export type TEmbeddedNodeType =
@@ -24,6 +25,7 @@ export type TEmbeddedNodeType =
| 'emoji'
| 'invoice'
| 'youtube'
+ | 'payto'
export type TEmbeddedNode =
| {
@@ -74,6 +76,12 @@ export const EmbeddedLNInvoiceParser: TContentParser = {
regex: LN_INVOICE_REGEX
}
+/** payto:// URIs (RFC-8905 / NIP-A3) – e.g. in profile about or note content */
+export const EmbeddedPaytoParser: TContentParser = {
+ type: 'payto',
+ regex: PAYTO_URI_REGEX
+}
+
export const EmbeddedUrlParser: TContentParser = (content: string) => {
const matches = content.matchAll(URL_REGEX)
const result: TEmbeddedNode[] = []