From 61f5543773980d04cc61fc4b40b809bd8901e0dd Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 15 Jan 2026 11:16:56 +0000 Subject: [PATCH] feat: add renderers for NIP-43 Add/Remove User events - Change kind 13534 icon from Shield to Users for consistency - Add feed and detail renderers for kind 8000 (Add User) - Add feed and detail renderers for kind 8001 (Remove User) - Both show the affected pubkey using PubkeyListFull component --- .../nostr/kinds/RelayMembersRenderer.tsx | 6 +- .../nostr/kinds/RelayUserChangeRenderer.tsx | 137 ++++++++++++++++++ src/components/nostr/kinds/index.tsx | 10 ++ src/constants/kinds.ts | 2 +- 4 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 src/components/nostr/kinds/RelayUserChangeRenderer.tsx diff --git a/src/components/nostr/kinds/RelayMembersRenderer.tsx b/src/components/nostr/kinds/RelayMembersRenderer.tsx index 537c23b..2e5767a 100644 --- a/src/components/nostr/kinds/RelayMembersRenderer.tsx +++ b/src/components/nostr/kinds/RelayMembersRenderer.tsx @@ -1,4 +1,4 @@ -import { Shield, Users } from "lucide-react"; +import { Users } from "lucide-react"; import { getTagValues } from "@/lib/nostr-utils"; import { BaseEventProps, @@ -35,7 +35,7 @@ export function RelayMembersRenderer({ event }: BaseEventProps) { event={event} className="flex items-center gap-1.5 text-sm font-medium" > - + Relay Members @@ -61,7 +61,7 @@ export function RelayMembersDetailRenderer({ event }: { event: NostrEvent }) { return (
- + Relay Members
diff --git a/src/components/nostr/kinds/RelayUserChangeRenderer.tsx b/src/components/nostr/kinds/RelayUserChangeRenderer.tsx new file mode 100644 index 0000000..c46444a --- /dev/null +++ b/src/components/nostr/kinds/RelayUserChangeRenderer.tsx @@ -0,0 +1,137 @@ +import { UserPlus, UserMinus } from "lucide-react"; +import { getTagValue } from "applesauce-core/helpers"; +import { + BaseEventProps, + BaseEventContainer, + ClickableEventTitle, +} from "./BaseEventRenderer"; +import { PubkeyListFull } from "../lists"; +import type { NostrEvent } from "@/types/nostr"; + +/** + * Kind 8000 Renderer - Add User (Feed View) + * NIP-43 event published when a member is added to a relay + */ +export function AddUserRenderer({ event }: BaseEventProps) { + const addedPubkey = getTagValue(event, "p"); + + if (!addedPubkey) { + return ( + +
+ Invalid add user event (missing pubkey) +
+
+ ); + } + + return ( + +
+ + + User Added + + +
+ Member added to relay +
+
+
+ ); +} + +/** + * Kind 8000 Detail View - Full add user details + */ +export function AddUserDetailRenderer({ event }: { event: NostrEvent }) { + const addedPubkey = getTagValue(event, "p"); + + return ( +
+
+ + User Added +
+ + {addedPubkey ? ( + } + /> + ) : ( +
+ Invalid event (missing pubkey) +
+ )} +
+ ); +} + +/** + * Kind 8001 Renderer - Remove User (Feed View) + * NIP-43 event published when a member is removed from a relay + */ +export function RemoveUserRenderer({ event }: BaseEventProps) { + const removedPubkey = getTagValue(event, "p"); + + if (!removedPubkey) { + return ( + +
+ Invalid remove user event (missing pubkey) +
+
+ ); + } + + return ( + +
+ + + User Removed + + +
+ Member removed from relay +
+
+
+ ); +} + +/** + * Kind 8001 Detail View - Full remove user details + */ +export function RemoveUserDetailRenderer({ event }: { event: NostrEvent }) { + const removedPubkey = getTagValue(event, "p"); + + return ( +
+
+ + User Removed +
+ + {removedPubkey ? ( + } + /> + ) : ( +
+ Invalid event (missing pubkey) +
+ )} +
+ ); +} diff --git a/src/components/nostr/kinds/index.tsx b/src/components/nostr/kinds/index.tsx index a41c085..fcec3b3 100644 --- a/src/components/nostr/kinds/index.tsx +++ b/src/components/nostr/kinds/index.tsx @@ -71,6 +71,12 @@ import { RelayMembersRenderer, RelayMembersDetailRenderer, } from "./RelayMembersRenderer"; +import { + AddUserRenderer, + AddUserDetailRenderer, + RemoveUserRenderer, + RemoveUserDetailRenderer, +} from "./RelayUserChangeRenderer"; // NIP-51 List Renderers import { MuteListRenderer, MuteListDetailRenderer } from "./MuteListRenderer"; import { PinListRenderer, PinListDetailRenderer } from "./PinListRenderer"; @@ -163,6 +169,8 @@ const kindRenderers: Record> = { 1621: IssueRenderer, // Issue (NIP-34) 9735: Kind9735Renderer, // Zap Receipt 9802: Kind9802Renderer, // Highlight + 8000: AddUserRenderer, // Add User (NIP-43) + 8001: RemoveUserRenderer, // Remove User (NIP-43) 777: SpellRenderer, // Spell (Grimoire) 10000: MuteListRenderer, // Mute List (NIP-51) 10001: PinListRenderer, // Pin List (NIP-51) @@ -260,6 +268,8 @@ const detailRenderers: Record< 1618: PullRequestDetailRenderer, // Pull Request Detail (NIP-34) 1621: IssueDetailRenderer, // Issue Detail (NIP-34) 9802: Kind9802DetailRenderer, // Highlight Detail + 8000: AddUserDetailRenderer, // Add User Detail (NIP-43) + 8001: RemoveUserDetailRenderer, // Remove User Detail (NIP-43) 10000: MuteListDetailRenderer, // Mute List Detail (NIP-51) 10001: PinListDetailRenderer, // Pin List Detail (NIP-51) 10002: Kind10002DetailRenderer, // Relay List Detail (NIP-65) diff --git a/src/constants/kinds.ts b/src/constants/kinds.ts index fda5f80..cfbec7c 100644 --- a/src/constants/kinds.ts +++ b/src/constants/kinds.ts @@ -892,7 +892,7 @@ export const EVENT_KINDS: Record = { name: "Relay Members", description: "Relay membership list", nip: "43", - icon: Shield, + icon: Users, }, // 17375: { // kind: 17375,