From 45c9ca7a2b340e2b6c6fcf94ba8e83ccb8e22105 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 5 Jan 2026 09:27:06 +0000 Subject: [PATCH] fix: stringify contentJson for CopyableJsonViewer and support 'about' field - Fix React error 31: CopyableJsonViewer expects string, not object - Add JSON.stringify() with pretty printing for metadata display - Support both 'description' and 'about' fields in content JSON (common in kind 0) - Add tests for 'about' field handling --- .../kinds/ApplicationHandlerDetailRenderer.tsx | 2 +- src/lib/nip89-helpers.test.ts | 17 +++++++++++++++++ src/lib/nip89-helpers.ts | 9 +++++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/components/nostr/kinds/ApplicationHandlerDetailRenderer.tsx b/src/components/nostr/kinds/ApplicationHandlerDetailRenderer.tsx index 65009a7..86db8c9 100644 --- a/src/components/nostr/kinds/ApplicationHandlerDetailRenderer.tsx +++ b/src/components/nostr/kinds/ApplicationHandlerDetailRenderer.tsx @@ -196,7 +196,7 @@ export function ApplicationHandlerDetailRenderer({ {contentJson && Object.keys(contentJson).length > 0 && (

Metadata

- +
)} diff --git a/src/lib/nip89-helpers.test.ts b/src/lib/nip89-helpers.test.ts index 02b87d9..9fe6138 100644 --- a/src/lib/nip89-helpers.test.ts +++ b/src/lib/nip89-helpers.test.ts @@ -91,6 +91,23 @@ describe("Kind 31990 (Application Handler) Helpers", () => { expect(getAppDescription(event)).toBe("A great app"); }); + it("should extract about field as fallback", () => { + const event = createHandlerEvent({ + content: JSON.stringify({ about: "An awesome app" }), + }); + expect(getAppDescription(event)).toBe("An awesome app"); + }); + + it("should prefer description over about", () => { + const event = createHandlerEvent({ + content: JSON.stringify({ + description: "Description text", + about: "About text", + }), + }); + expect(getAppDescription(event)).toBe("Description text"); + }); + it("should return undefined if no content", () => { const event = createHandlerEvent({ content: "" }); expect(getAppDescription(event)).toBeUndefined(); diff --git a/src/lib/nip89-helpers.ts b/src/lib/nip89-helpers.ts index eefdb5d..8062979 100644 --- a/src/lib/nip89-helpers.ts +++ b/src/lib/nip89-helpers.ts @@ -47,14 +47,19 @@ export function getAppName(event: NostrEvent): string { /** * Extract app description from kind 31990 event content JSON + * Checks both 'description' and 'about' fields */ export function getAppDescription(event: NostrEvent): string | undefined { if (event.kind !== 31990 || !event.content) return undefined; try { const metadata = JSON.parse(event.content); - if (metadata && typeof metadata === "object" && metadata.description && typeof metadata.description === "string") { - return metadata.description; + if (metadata && typeof metadata === "object") { + // Check description first, then about (common in kind 0 profile format) + const desc = metadata.description || metadata.about; + if (desc && typeof desc === "string") { + return desc; + } } } catch { // Invalid JSON