mirror of
https://github.com/purrgrammer/grimoire.git
synced 2026-04-12 16:37:06 +02:00
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:
@@ -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>
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user