diff --git a/src/components/nostr/kinds/GroupMetadataRenderer.tsx b/src/components/nostr/kinds/GroupMetadataRenderer.tsx new file mode 100644 index 0000000..d7b23f0 --- /dev/null +++ b/src/components/nostr/kinds/GroupMetadataRenderer.tsx @@ -0,0 +1,91 @@ +import type { NostrEvent } from "@/types/nostr"; +import { getTagValue } from "applesauce-core/helpers"; +import { getSeenRelays } from "applesauce-core/helpers/relays"; +import { BaseEventContainer, ClickableEventTitle } from "./BaseEventRenderer"; +import { useGrimoire } from "@/core/state"; +import { MessageSquare } from "lucide-react"; + +interface GroupMetadataRendererProps { + event: NostrEvent; +} + +/** + * Renderer for NIP-29 Group Metadata events (kind 39000) + * Displays group info and links to chat + */ +export function GroupMetadataRenderer({ event }: GroupMetadataRendererProps) { + const { addWindow } = useGrimoire(); + + // Extract group metadata + const groupId = getTagValue(event, "d") || ""; + const name = getTagValue(event, "name") || groupId; + const about = getTagValue(event, "about"); + const picture = getTagValue(event, "picture"); + + // Get relay URL from where we saw this event + const seenRelaysSet = getSeenRelays(event); + const relayUrl = seenRelaysSet?.values().next().value; + + const handleOpenChat = () => { + if (!relayUrl) return; + + addWindow("chat", { + protocol: "nip-29", + identifier: { + type: "group", + value: groupId, + relays: [relayUrl], + }, + }); + }; + + const canOpenChat = !!relayUrl && !!groupId; + + return ( + +
+ {/* Group Picture */} +
+ {picture ? ( + {name} + ) : ( +
+ +
+ )} +
+ + {/* Group Info */} +
+ + {name} + + + {about && ( +

+ {about} +

+ )} + + {/* Open Chat Link */} + {canOpenChat && ( + + )} +
+
+
+ ); +} diff --git a/src/components/nostr/kinds/index.tsx b/src/components/nostr/kinds/index.tsx index 2af9d0f..a5833b0 100644 --- a/src/components/nostr/kinds/index.tsx +++ b/src/components/nostr/kinds/index.tsx @@ -61,6 +61,7 @@ import { ZapstoreAppSetRenderer } from "./ZapstoreAppSetRenderer"; import { ZapstoreAppSetDetailRenderer } from "./ZapstoreAppSetDetailRenderer"; import { ZapstoreReleaseRenderer } from "./ZapstoreReleaseRenderer"; import { ZapstoreReleaseDetailRenderer } from "./ZapstoreReleaseDetailRenderer"; +import { GroupMetadataRenderer } from "./GroupMetadataRenderer"; import { NostrEvent } from "@/types/nostr"; import { BaseEventContainer, type BaseEventProps } from "./BaseEventRenderer"; @@ -116,6 +117,7 @@ const kindRenderers: Record> = { 31989: HandlerRecommendationRenderer, // Handler Recommendation (NIP-89) 31990: ApplicationHandlerRenderer, // Application Handler (NIP-89) 32267: ZapstoreAppRenderer, // Zapstore App + 39000: GroupMetadataRenderer, // Group Metadata (NIP-29) 39701: Kind39701Renderer, // Web Bookmarks (NIP-B0) };