fix: add defensive type checks to prevent React error 31

- Add type guards in nip89-helpers to ensure string types
- Check metadata object structure before accessing properties
- Add fallbacks for undefined address.identifier values
- Prevents accidentally rendering objects as React children
This commit is contained in:
Claude
2026-01-04 21:43:43 +00:00
parent ce38dad704
commit 583dfd9786
3 changed files with 21 additions and 8 deletions

View File

@@ -61,7 +61,7 @@ function HandlerCard({
<div className="flex items-center gap-2">
<Package className="size-5 text-muted-foreground" />
<span className="text-sm text-muted-foreground">
Loading {address.identifier}...
Loading {address?.identifier || "handler"}...
</span>
</div>
</div>

View File

@@ -46,7 +46,9 @@ function HandlerItem({
}) {
const { addWindow } = useGrimoire();
const handlerEvent = useNostrEvent(address);
const appName = handlerEvent ? getAppName(handlerEvent) : address.identifier;
const appName = handlerEvent
? getAppName(handlerEvent)
: (address?.identifier || "Unknown Handler");
const handleClick = () => {
addWindow("open", { pointer: address });

View File

@@ -32,7 +32,9 @@ export function getAppName(event: NostrEvent): string {
if (event.content) {
try {
const metadata = JSON.parse(event.content);
if (metadata.name) return metadata.name;
if (metadata && typeof metadata === "object" && metadata.name && typeof metadata.name === "string") {
return metadata.name;
}
} catch {
// Not valid JSON, continue to fallback
}
@@ -40,7 +42,7 @@ export function getAppName(event: NostrEvent): string {
// Fallback to d tag identifier
const dTag = getTagValue(event, "d");
return dTag || "Unknown App";
return dTag && typeof dTag === "string" ? dTag : "Unknown App";
}
/**
@@ -51,10 +53,13 @@ export function getAppDescription(event: NostrEvent): string | undefined {
try {
const metadata = JSON.parse(event.content);
return metadata.description;
if (metadata && typeof metadata === "object" && metadata.description && typeof metadata.description === "string") {
return metadata.description;
}
} catch {
return undefined;
// Invalid JSON
}
return undefined;
}
/**
@@ -65,10 +70,16 @@ export function getAppImage(event: NostrEvent): string | undefined {
try {
const metadata = JSON.parse(event.content);
return metadata.image || metadata.picture;
if (metadata && typeof metadata === "object") {
const image = metadata.image || metadata.picture;
if (image && typeof image === "string") {
return image;
}
}
} catch {
return undefined;
// Invalid JSON
}
return undefined;
}
/**