diff --git a/src/components/nostr/kinds/RelayMembersRenderer.tsx b/src/components/nostr/kinds/RelayMembersRenderer.tsx new file mode 100644 index 0000000..452315e --- /dev/null +++ b/src/components/nostr/kinds/RelayMembersRenderer.tsx @@ -0,0 +1,67 @@ +import { Users } from "lucide-react"; +import { getTagValues } from "@/lib/nostr-utils"; +import { + BaseEventProps, + BaseEventContainer, + ClickableEventTitle, +} from "./BaseEventRenderer"; +import { PubkeyListPreview, PubkeyListFull } from "../lists"; +import type { NostrEvent } from "@/types/nostr"; + +/** + * Kind 13534 Renderer - Relay Members (Feed View) + * NIP-43 relay membership list using "member" tags + */ +export function RelayMembersRenderer({ event }: BaseEventProps) { + const members = getTagValues(event, "member"); + + return ( + +
+ + + Relay Members + + + {members.length === 0 ? ( +
+ Empty membership list +
+ ) : ( + + )} +
+
+ ); +} + +/** + * Kind 13534 Detail View - Full relay membership list + */ +export function RelayMembersDetailRenderer({ event }: { event: NostrEvent }) { + const members = getTagValues(event, "member"); + + return ( +
+
+ + Relay Members +
+ + {members.length > 0 ? ( + + ) : ( +
+ Empty membership list +
+ )} +
+ ); +} diff --git a/src/components/nostr/kinds/RelayUserChangeRenderer.tsx b/src/components/nostr/kinds/RelayUserChangeRenderer.tsx new file mode 100644 index 0000000..6586c31 --- /dev/null +++ b/src/components/nostr/kinds/RelayUserChangeRenderer.tsx @@ -0,0 +1,132 @@ +import { UserPlus, UserMinus } from "lucide-react"; +import { getTagValue } from "applesauce-core/helpers"; +import { + BaseEventProps, + BaseEventContainer, + ClickableEventTitle, +} from "./BaseEventRenderer"; +import { PubkeyListFull } from "../lists"; +import { UserName } from "../UserName"; +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 pubkey = getTagValue(event, "p"); + + if (!pubkey) { + return ( + +
+ Invalid event (missing pubkey) +
+
+ ); + } + + return ( + +
+ + + User Added + + +
+ + added to relay +
+
+
+ ); +} + +/** + * Kind 8000 Detail View + */ +export function AddUserDetailRenderer({ event }: { event: NostrEvent }) { + const pubkey = getTagValue(event, "p"); + + return ( +
+
+ + User Added +
+ + {pubkey ? ( + + ) : ( +
+ 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 pubkey = getTagValue(event, "p"); + + if (!pubkey) { + return ( + +
+ Invalid event (missing pubkey) +
+
+ ); + } + + return ( + +
+ + + User Removed + + +
+ + removed from relay +
+
+
+ ); +} + +/** + * Kind 8001 Detail View + */ +export function RemoveUserDetailRenderer({ event }: { event: NostrEvent }) { + const pubkey = getTagValue(event, "p"); + + return ( +
+
+ + User Removed +
+ + {pubkey ? ( + + ) : ( +
+ Invalid event (missing pubkey) +
+ )} +
+ ); +} diff --git a/src/components/nostr/kinds/index.tsx b/src/components/nostr/kinds/index.tsx index 0494f88..fcec3b3 100644 --- a/src/components/nostr/kinds/index.tsx +++ b/src/components/nostr/kinds/index.tsx @@ -67,6 +67,16 @@ import { ZapstoreAppSetDetailRenderer } from "./ZapstoreAppSetDetailRenderer"; import { ZapstoreReleaseRenderer } from "./ZapstoreReleaseRenderer"; import { ZapstoreReleaseDetailRenderer } from "./ZapstoreReleaseDetailRenderer"; import { GroupMetadataRenderer } from "./GroupMetadataRenderer"; +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"; @@ -159,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) @@ -178,6 +190,7 @@ const kindRenderers: Record> = { 10101: WikiAuthorsRenderer, // Good Wiki Authors (NIP-51) 10102: WikiRelaysRenderer, // Good Wiki Relays (NIP-51) 10317: Kind10317Renderer, // User Grasp List (NIP-34) + 13534: RelayMembersRenderer, // Relay Members (NIP-43) 30000: FollowSetRenderer, // Follow Sets (NIP-51) 30002: GenericRelayListRenderer, // Relay Sets (NIP-51) 30003: BookmarkSetRenderer, // Bookmark Sets (NIP-51) @@ -255,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) @@ -268,6 +283,7 @@ const detailRenderers: Record< 10101: WikiAuthorsDetailRenderer, // Good Wiki Authors Detail (NIP-51) 10102: WikiRelaysDetailRenderer, // Good Wiki Relays Detail (NIP-51) 10317: Kind10317DetailRenderer, // User Grasp List Detail (NIP-34) + 13534: RelayMembersDetailRenderer, // Relay Members Detail (NIP-43) 30000: FollowSetDetailRenderer, // Follow Sets Detail (NIP-51) 30003: BookmarkSetDetailRenderer, // Bookmark Sets Detail (NIP-51) 30004: ArticleCurationSetDetailRenderer, // Article Curation Sets Detail (NIP-51) diff --git a/src/constants/kinds.ts b/src/constants/kinds.ts index 462cc1a..cfbec7c 100644 --- a/src/constants/kinds.ts +++ b/src/constants/kinds.ts @@ -887,13 +887,13 @@ export const EVENT_KINDS: Record = { nip: "47", icon: Wallet, }, - // 13534: { - // kind: 13534, - // name: "Membership Lists", - // description: "Membership Lists", - // nip: "43", - // icon: Users, - // }, + 13534: { + kind: 13534, + name: "Relay Members", + description: "Relay membership list", + nip: "43", + icon: Users, + }, // 17375: { // kind: 17375, // name: "Cashu Wallet Event", @@ -950,27 +950,27 @@ export const EVENT_KINDS: Record = { nip: "98", icon: Key, }, - // 28934: { - // kind: 28934, - // name: "Join Request", - // description: "Join Request", - // nip: "43", - // icon: UserPlus, - // }, - // 28935: { - // kind: 28935, - // name: "Invite Request", - // description: "Invite Request", - // nip: "43", - // icon: Mail, - // }, - // 28936: { - // kind: 28936, - // name: "Leave Request", - // description: "Leave Request", - // nip: "43", - // icon: UserMinus, - // }, + 28934: { + kind: 28934, + name: "Join Request", + description: "Relay join request with invite code", + nip: "43", + icon: UserPlus, + }, + 28935: { + kind: 28935, + name: "Invite Request", + description: "Request invite code from relay", + nip: "43", + icon: Mail, + }, + 28936: { + kind: 28936, + name: "Leave Request", + description: "Request to revoke relay access", + nip: "43", + icon: UserMinus, + }, // Group Control 9000: {