From 667e17035153af92c449c529a81b10f29b0bc783 Mon Sep 17 00:00:00 2001 From: nayan9617 Date: Sat, 11 Apr 2026 16:46:05 +0530 Subject: [PATCH 1/5] Use relay member lists directly --- src/app/components/RoomDetail.svelte | 10 +- src/app/components/RoomMembers.svelte | 66 ++++--- src/app/components/RoomMembersAdd.svelte | 13 +- src/app/components/SpaceMembers.svelte | 94 +++++----- src/app/components/SpaceMenu.svelte | 10 +- src/app/core/commands.ts | 10 +- src/app/core/state.ts | 194 +++++++++++--------- src/app/core/sync.ts | 17 +- src/app/editor/index.ts | 7 +- src/routes/spaces/[relay]/chat/+page.svelte | 4 +- 10 files changed, 250 insertions(+), 175 deletions(-) diff --git a/src/app/components/RoomDetail.svelte b/src/app/components/RoomDetail.svelte index 80688c7c..f15fc325 100644 --- a/src/app/components/RoomDetail.svelte +++ b/src/app/components/RoomDetail.svelte @@ -33,7 +33,7 @@ import RoomImage from "@app/components/RoomImage.svelte" import { deriveRoom, - deriveRoomMembers, + deriveRoomMemberList, deriveUserIsRoomAdmin, deriveUserRoomMembershipStatus, deriveUserRooms, @@ -57,7 +57,7 @@ const {url, h}: Props = $props() const room = deriveRoom(url, h) - const members = deriveRoomMembers(url, h) + const members = deriveRoomMemberList(url, h) const userIsAdmin = deriveUserIsRoomAdmin(url, h) const membershipStatus = deriveUserRoomMembershipStatus(url, h) const userRooms = deriveUserRooms(url) @@ -243,7 +243,7 @@ {/if} - {#if $members.length > 0} + {#if $members !== undefined && $members.length > 0}
Members: @@ -251,6 +251,10 @@
+ {:else if $members === undefined} +
+ Member list not available from this relay +
{/if}
Room Settings diff --git a/src/app/components/RoomMembers.svelte b/src/app/components/RoomMembers.svelte index e9dd1beb..e330303c 100644 --- a/src/app/components/RoomMembers.svelte +++ b/src/app/components/RoomMembers.svelte @@ -18,7 +18,7 @@ import Profile from "@app/components/Profile.svelte" import RoomName from "@app/components/RoomName.svelte" import RoomMembersAdd from "@app/components/RoomMembersAdd.svelte" - import {deriveRoom, deriveRoomMembers, deriveUserIsRoomAdmin} from "@app/core/state" + import {deriveRoom, deriveRoomMemberList, deriveUserIsRoomAdmin} from "@app/core/state" import {pushModal} from "@app/util/modal" import {pushToast} from "@app/util/toast" @@ -30,7 +30,7 @@ const {url, h}: Props = $props() const room = deriveRoom(url, h) - const members = deriveRoomMembers(url, h) + const members = deriveRoomMemberList(url, h) const userIsAdmin = deriveUserIsRoomAdmin(url, h) const back = () => history.back() @@ -73,34 +73,44 @@
- {#each $members as pubkey (pubkey)} -
-
-
- -
-
- - {#if menuPubkey === pubkey} - - - - {/if} + {#if $members === undefined} +
+ Member list not available from this relay +
+ {:else if $members.length === 0} +
+ No members yet +
+ {:else} + {#each $members as pubkey (pubkey)} +
+
+
+ +
+
+ + {#if menuPubkey === pubkey} + + + + {/if} +
-
- {/each} + {/each} + {/if}
diff --git a/src/app/components/RoomMembersAdd.svelte b/src/app/components/RoomMembersAdd.svelte index 63397e3d..20effc5d 100644 --- a/src/app/components/RoomMembersAdd.svelte +++ b/src/app/components/RoomMembersAdd.svelte @@ -20,7 +20,7 @@ import ProfileMultiSelect from "@app/components/ProfileMultiSelect.svelte" import {pushToast} from "@app/util/toast" import {pushModal} from "@app/util/modal" - import {deriveRoom, deriveSpaceMembers} from "@app/core/state" + import {deriveRoom, deriveRelayMemberList} from "@app/core/state" import {addRoomMembers} from "@app/core/commands" interface Props { @@ -31,7 +31,7 @@ const {url, h}: Props = $props() const room = deriveRoom(url, h) - const spaceMembers = deriveSpaceMembers(url) + const spaceMembers = deriveRelayMemberList(url) const back = () => history.back() @@ -56,6 +56,15 @@ } const onSubmit = async () => { + // Space member list is required to add members to a room + if (!$spaceMembers) { + pushToast({ + theme: "error", + message: "Cannot add members: space member list not available from this relay", + }) + return + } + const pubkeysSnapshot = $state.snapshot(pubkeys) const nonSpaceMembers = pubkeysSnapshot.filter(pubkey => !$spaceMembers.includes(pubkey)) diff --git a/src/app/components/SpaceMembers.svelte b/src/app/components/SpaceMembers.svelte index a3eae54c..eb149e8b 100644 --- a/src/app/components/SpaceMembers.svelte +++ b/src/app/components/SpaceMembers.svelte @@ -22,7 +22,7 @@ import SpaceMembersAdd from "@app/components/SpaceMembersAdd.svelte" import SpaceMembersBanned from "@app/components/SpaceMembersBanned.svelte" import { - deriveSpaceMembers, + deriveRelayMemberList, deriveSpaceBannedPubkeyItems, deriveUserIsSpaceAdmin, deriveSupportedMethods, @@ -36,7 +36,7 @@ const {url}: Props = $props() - const members = deriveSpaceMembers(url) + const members = deriveRelayMemberList(url) const bans = deriveSpaceBannedPubkeyItems(url) const userIsAdmin = deriveUserIsSpaceAdmin(url) const supportedMethods = deriveSupportedMethods(url) @@ -112,46 +112,58 @@ {/if} {/if}
- {#each $members as pubkey (pubkey)} -
-
-
- -
- {#if canBan || canUnallow} -
- - {#if menuPubkey === pubkey} - - - - {/if} -
- {/if} -
+ {#if $members === undefined} +
+ Member list not available from this relay
- {/each} + {:else if $members.length === 0} +
+ No members yet +
+ {:else} + {#each $members as pubkey (pubkey)} +
+
+
+ +
+ {#if canBan || canUnallow} +
+ + {#if menuPubkey === pubkey} + + + + {/if} +
+ {/if} +
+
+ {/each} + {/if}
diff --git a/src/app/components/SpaceMenu.svelte b/src/app/components/SpaceMenu.svelte index 782e3509..fbefc8c8 100644 --- a/src/app/components/SpaceMenu.svelte +++ b/src/app/components/SpaceMenu.svelte @@ -44,7 +44,7 @@ import { ENABLE_ZAPS, CONTENT_KINDS, - deriveSpaceMembers, + deriveRelayMemberList, deriveUserRooms, deriveOtherRooms, deriveOtherVoiceRooms, @@ -76,7 +76,7 @@ const userRooms = deriveUserRooms(url) const otherRooms = deriveOtherRooms(url) const otherVoiceRooms = deriveOtherVoiceRooms(url) - const members = deriveSpaceMembers(url) + const members = deriveRelayMemberList(url) const userIsAdmin = deriveUserIsSpaceAdmin(url) const actionItems = deriveSpaceActionItems(url) @@ -181,7 +181,11 @@
  • {#if $userIsAdmin} diff --git a/src/app/core/commands.ts b/src/app/core/commands.ts index 9f99c659..4dca53ac 100644 --- a/src/app/core/commands.ts +++ b/src/app/core/commands.ts @@ -95,7 +95,7 @@ import { stripPrefix, relaysMostlyRestricted, deriveSocket, - deriveSpaceMembers, + deriveRelayMemberList, } from "@app/core/state" // Utils @@ -765,7 +765,13 @@ export const addSpaceMembers = async ( url: string, pubkeys: string[], ): Promise => { - const spaceMembers = get(deriveSpaceMembers(url)) + const spaceMembers = get(deriveRelayMemberList(url)) + + // Cannot add members without access to the member list + if (spaceMembers === undefined) { + return "Member list not available from this relay" + } + const results = await Promise.all( pubkeys .filter(pubkey => !spaceMembers.includes(pubkey)) diff --git a/src/app/core/state.ts b/src/app/core/state.ts index 59ea9e3c..b32650fa 100644 --- a/src/app/core/state.ts +++ b/src/app/core/state.ts @@ -8,6 +8,7 @@ import { on, gt, max, + find, spec, call, first, @@ -806,36 +807,51 @@ export const deriveOtherRooms = (url: string) => // Space/room memberships -const getSpaceMembers = (_url: string, events: TrustedEvent[]) => { - const members = new Set() +export const deriveRelayMemberList = (url: string) => + derived(deriveRelaySignedEvents(url, [{kinds: [RELAY_MEMBERS]}]), $events => { + const membersEvent = $events.find(spec({kind: RELAY_MEMBERS})) + return membersEvent ? uniq(getTagValues("member", membersEvent.tags)) : undefined + }) - for (const event of sortEventsAsc(events)) { - if (event.kind === RELAY_MEMBERS) { - members.clear() +export const deriveRoomMemberList = (url: string, h: string) => { + const filters: Filter[] = [{kinds: [ROOM_MEMBERS], "#d": [h]}] - for (const pubkey of uniq(getTagValues("member", event.tags))) { - members.add(pubkey) - } + return derived(deriveEventsForUrl(url, filters), $events => { + const membersEvent = find(spec({kind: ROOM_MEMBERS}), $events) + return membersEvent ? uniq(getPubkeyTagValues(membersEvent.tags)) : undefined + }) +} - continue +export type BannedPubkeyItem = { + pubkey: string + reason: string +} + +export const spaceBannedPubkeyItems = new Map() + +export const deriveSpaceBannedPubkeyItems = (url: string) => { + const store = writable(spaceBannedPubkeyItems.get(url) || []) + + manageRelay(url, {method: ManagementMethod.ListBannedPubkeys, params: []}).then(res => { + spaceBannedPubkeyItems.set(url, res.result) + store.set(res.result) + }) + + return store +} + +export const deriveRoomAdmins = (url: string, h: string) => { + const filters: Filter[] = [{kinds: [ROOM_ADMINS], "#d": [h]}] + + return derived(deriveEventsForUrl(url, filters), $events => { + const adminsEvent = first($events) + + if (adminsEvent) { + return getPubkeyTagValues(adminsEvent.tags) } - const pubkeys = getPubkeyTagValues(event.tags) - - if (event.kind === RELAY_ADD_MEMBER) { - for (const pubkey of pubkeys) { - members.add(pubkey) - } - } - - if (event.kind === RELAY_REMOVE_MEMBER) { - for (const pubkey of pubkeys) { - members.delete(pubkey) - } - } - } - - return Array.from(members) + return [] + }) } const getRoomMembers = (_url: string, h: string, events: TrustedEvent[]) => { @@ -874,53 +890,6 @@ const getRoomMembers = (_url: string, h: string, events: TrustedEvent[]) => { return Array.from(members) } -export const deriveSpaceMembers = (url: string) => - derived( - deriveRelaySignedEvents(url, [{kinds: [RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER, RELAY_MEMBERS]}]), - $events => getSpaceMembers(url, $events), - ) - -export type BannedPubkeyItem = { - pubkey: string - reason: string -} - -export const spaceBannedPubkeyItems = new Map() - -export const deriveSpaceBannedPubkeyItems = (url: string) => { - const store = writable(spaceBannedPubkeyItems.get(url) || []) - - manageRelay(url, {method: ManagementMethod.ListBannedPubkeys, params: []}).then(res => { - spaceBannedPubkeyItems.set(url, res.result) - store.set(res.result) - }) - - return store -} - -export const deriveRoomMembers = (url: string, h: string) => { - const filters: Filter[] = [ - {kinds: [ROOM_MEMBERS], "#d": [h]}, - {kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER], "#h": [h]}, - ] - - return derived(deriveEventsForUrl(url, filters), $events => getRoomMembers(url, h, $events)) -} - -export const deriveRoomAdmins = (url: string, h: string) => { - const filters: Filter[] = [{kinds: [ROOM_ADMINS], "#d": [h]}] - - return derived(deriveEventsForUrl(url, filters), $events => { - const adminsEvent = first($events) - - if (adminsEvent) { - return getPubkeyTagValues(adminsEvent.tags) - } - - return [] - }) -} - // Action items (admin review queue) // const pendingJoins: TrustedEvent[] = [] @@ -1017,19 +986,49 @@ export const deriveUserIsSpaceAdmin = memoize((url?: string) => { }) export const deriveUserSpaceMembershipStatus = (url: string) => { - const filters: Filter[] = [{kinds: [RELAY_JOIN, RELAY_LEAVE]}] + // Fetch member list and user add/remove events directly in this derivation. + const memberListFilters: Filter[] = [{kinds: [RELAY_MEMBERS]}] + const userEventFilters: Filter[] = [{kinds: [RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER]}] return derived( [ pubkey, - deriveSpaceMembers(url), - deriveEventsForUrl(url, filters), + deriveRelaySignedEvents(url, memberListFilters), + deriveRelaySignedEvents(url, userEventFilters), + deriveEventsForUrl(url, [{kinds: [RELAY_JOIN, RELAY_LEAVE]}]), deriveUserIsSpaceAdmin(url), ], - ([$pubkey, $members, $events, $isAdmin]) => { - const isMember = $members.includes($pubkey!) || $isAdmin + ([$pubkey, $memberListEvents, $userAddRemoveEvents, $joinLeaveEvents, $isAdmin]) => { + // If admin, always granted. + if ($isAdmin) { + return MembershipStatus.Granted + } - for (const event of $events) { + const membersEvent = $memberListEvents.find(spec({kind: RELAY_MEMBERS})) + const memberList = membersEvent ? uniq(getTagValues("member", membersEvent.tags)) : undefined + + let isMember = false + + if (memberList) { + // Member list exists - check if user is in it. + isMember = memberList.includes($pubkey!) + } else { + // No member list available - replay the user's add/remove history. + for (const event of sortBy(e => e.created_at, $userAddRemoveEvents)) { + if (event.pubkey !== $pubkey) { + continue + } + + if (event.kind === RELAY_ADD_MEMBER) { + isMember = true + } else if (event.kind === RELAY_REMOVE_MEMBER) { + isMember = false + } + } + } + + for (const event of $joinLeaveEvents) { + // Join events indicate pending or granted status, leave resets to initial. if (event.pubkey !== $pubkey) { continue } @@ -1055,19 +1054,46 @@ export const deriveUserIsRoomAdmin = (url: string, h: string) => ) export const deriveUserRoomMembershipStatus = (url: string, h: string) => { - const filters: Filter[] = [{kinds: [ROOM_JOIN, ROOM_LEAVE], "#h": [h]}] + // Fetch the room member list and the current user's add/remove events. + const userEventFilters: Filter[] = [{kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER], "#h": [h]}] + const joinLeaveFilters: Filter[] = [{kinds: [ROOM_JOIN, ROOM_LEAVE], "#h": [h]}] return derived( [ pubkey, - deriveRoomMembers(url, h), - deriveEventsForUrl(url, filters), + deriveRoomMemberList(url, h), + deriveEventsForUrl(url, userEventFilters), + deriveEventsForUrl(url, joinLeaveFilters), deriveUserIsRoomAdmin(url, h), ], - ([$pubkey, $members, $events, $isAdmin]) => { - const isMember = $members.includes($pubkey!) || $isAdmin + ([$pubkey, $memberList, $userAddRemoveEvents, $joinLeaveEvents, $isAdmin]) => { + // If admin of this room's space, always granted. + if ($isAdmin) { + return MembershipStatus.Granted + } - for (const event of $events) { + let isMember = false + + if ($memberList) { + // Member list exists - check if user is in it. + isMember = $memberList.includes($pubkey!) + } else { + // No member list available - replay the user's add/remove history. + for (const event of sortEventsAsc($userAddRemoveEvents)) { + if (event.pubkey !== $pubkey) { + continue + } + + if (event.kind === ROOM_ADD_MEMBER) { + isMember = true + } else if (event.kind === ROOM_REMOVE_MEMBER) { + isMember = false + } + } + } + + for (const event of $joinLeaveEvents) { + // Join events indicate pending or granted status, leave resets to initial. if (event.pubkey !== $pubkey) { continue } diff --git a/src/app/core/sync.ts b/src/app/core/sync.ts index 7cfd04fc..05e9a097 100644 --- a/src/app/core/sync.ts +++ b/src/app/core/sync.ts @@ -174,8 +174,9 @@ const syncUserSpaceMembership = (url: string) => { url, signal: controller.signal, filters: [ - {kinds: [RELAY_ADD_MEMBER], "#p": [$pubkey], limit: 1}, - {kinds: [RELAY_REMOVE_MEMBER], "#p": [$pubkey], limit: 1}, + // Keep current-user membership history so status replay stays deterministic. + {kinds: [RELAY_ADD_MEMBER], "#p": [$pubkey]}, + {kinds: [RELAY_REMOVE_MEMBER], "#p": [$pubkey]}, {kinds: [ROOM_CREATE_PERMISSION], "#p": [$pubkey], limit: 1}, ], }) @@ -193,8 +194,9 @@ const syncUserRoomMembership = (url: string, h: string) => { url, signal: controller.signal, filters: [ - {kinds: [ROOM_ADD_MEMBER], "#p": [$pubkey], "#h": [h], limit: 1}, - {kinds: [ROOM_REMOVE_MEMBER], "#p": [$pubkey], "#h": [h], limit: 1}, + // Keep current-user membership history so status replay stays deterministic. + {kinds: [ROOM_ADD_MEMBER], "#p": [$pubkey], "#h": [h]}, + {kinds: [ROOM_REMOVE_MEMBER], "#p": [$pubkey], "#h": [h]}, ], }) } @@ -297,15 +299,16 @@ const syncSpace = (url: string, rooms: string[]) => { pullRoomContent(room) } - const relayKinds = [RELAY_MEMBERS, RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER] + // Fetch authoritative member lists and room metadata. + const relayKinds = [RELAY_MEMBERS] const roomMetaKinds = [ROOM_META, ROOM_ADMINS, ROOM_MEMBERS, LIVEKIT_PARTICIPANTS] - const roomMemberKinds = [ROOM_DELETE, ROOM_JOIN, ROOM_LEAVE, ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER] + const roomDeleteKinds = [ROOM_DELETE] pullAndListen({ url, signal: controller.signal, filters: [ - {kinds: [...relayKinds, ...roomMetaKinds, ...roomMemberKinds, ...CONTENT_KINDS, MESSAGE]}, + {kinds: [...relayKinds, ...roomMetaKinds, ...roomDeleteKinds, ...CONTENT_KINDS, MESSAGE]}, makeCommentFilter(CONTENT_KINDS, {since}), {kinds: [PollResponse], since}, ], diff --git a/src/app/editor/index.ts b/src/app/editor/index.ts index f56fd4b1..d600d148 100644 --- a/src/app/editor/index.ts +++ b/src/app/editor/index.ts @@ -19,7 +19,7 @@ import {escapeHtml} from "@lib/html" import {makeMentionNodeView} from "@app/editor/MentionNodeView" import ProfileSuggestion from "@app/editor/ProfileSuggestion.svelte" import {uploadFile} from "@app/core/commands" -import {deriveSpaceMembers} from "@app/core/state" +import {deriveRelayMemberList} from "@app/core/state" import {pushToast} from "@app/util/toast" export const makeEditor = async ({ @@ -49,7 +49,7 @@ export const makeEditor = async ({ [ throttled(800, profiles), throttled(800, handlesByNip05), - throttled(800, deriveSpaceMembers(url || "")), + throttled(800, deriveRelayMemberList(url || "")), ], ([$profiles, $handlesByNip05, $spaceMembers]) => { // Remove invalid nip05's from profiles @@ -64,7 +64,8 @@ export const makeEditor = async ({ getValue: (profile: PublishedProfile) => profile.event.pubkey, sortFn: ({score = 1, item}) => { const wotScore = getWotGraph().get(item.event.pubkey) || 0 - const membershipScale = $spaceMembers.includes(item.event.pubkey) ? 2 : 1 + // Boost score for space members. If member list is unavailable, this falls through to 1x multiplier + const membershipScale = $spaceMembers?.includes(item.event.pubkey) ? 2 : 1 return dec(score) * inc(wotScore / getMaxWot()) * membershipScale }, diff --git a/src/routes/spaces/[relay]/chat/+page.svelte b/src/routes/spaces/[relay]/chat/+page.svelte index 04d52a1a..5e0e63a1 100644 --- a/src/routes/spaces/[relay]/chat/+page.svelte +++ b/src/routes/spaces/[relay]/chat/+page.svelte @@ -26,7 +26,7 @@ import RoomCompose from "@app/components/RoomCompose.svelte" import RoomComposeEdit from "@src/app/components/RoomComposeEdit.svelte" import RoomComposeParent from "@app/components/RoomComposeParent.svelte" - import {userSettingsValues, decodeRelay, PROTECTED} from "@app/core/state" + import {userSettingsValues, decodeRelay, PROTECTED, CONTENT_KINDS} from "@app/core/state" import {prependParent, canEnforceNip70, publishDelete} from "@app/core/commands" import {checked} from "@app/util/notifications" import {pushToast} from "@app/util/toast" @@ -258,7 +258,7 @@ url, at: at || now(), element: element!, - filters: [{kinds: [MESSAGE, RELAY_ADD_MEMBER]}], + filters: [{kinds: [...CONTENT_KINDS, MESSAGE]}], onBackwardExhausted: () => { loadingBackward = false }, -- 2.52.0 From 1bac21ba2abc45f8827707b37a2627f45b7011ba Mon Sep 17 00:00:00 2001 From: nayan9617 Date: Sat, 11 Apr 2026 21:49:24 +0530 Subject: [PATCH 2/5] Trim room member sync --- src/app/core/sync.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/core/sync.ts b/src/app/core/sync.ts index 05e9a097..6e7462d5 100644 --- a/src/app/core/sync.ts +++ b/src/app/core/sync.ts @@ -286,7 +286,7 @@ const syncSpace = (url: string, rooms: string[]) => { {kinds: [MESSAGE, ...CONTENT_KINDS], since, "#h": [room]}, makeCommentFilter(CONTENT_KINDS, {since, "#h": [room]}), { - kinds: [ROOM_DELETE, ROOM_JOIN, ROOM_LEAVE, ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER], + kinds: [ROOM_DELETE, ROOM_JOIN, ROOM_LEAVE], "#h": [room], }, {kinds: [PollResponse], since}, @@ -302,7 +302,7 @@ const syncSpace = (url: string, rooms: string[]) => { // Fetch authoritative member lists and room metadata. const relayKinds = [RELAY_MEMBERS] const roomMetaKinds = [ROOM_META, ROOM_ADMINS, ROOM_MEMBERS, LIVEKIT_PARTICIPANTS] - const roomDeleteKinds = [ROOM_DELETE] + const roomDeleteKinds = [ROOM_DELETE, ROOM_JOIN, ROOM_LEAVE] pullAndListen({ url, -- 2.52.0 From 8d1e4e3235f4c74f433b4166f155fb5590702020 Mon Sep 17 00:00:00 2001 From: nayan9617 Date: Sat, 11 Apr 2026 23:32:29 +0530 Subject: [PATCH 3/5] updated changes based on review --- src/app/components/RoomDetail.svelte | 4 ++-- src/app/components/RoomMembers.svelte | 4 ++-- src/app/components/RoomMembersAdd.svelte | 10 +++------- src/app/components/SpaceMembers.svelte | 6 +++--- src/app/components/SpaceMenu.svelte | 6 +++--- src/app/core/commands.ts | 11 +++-------- src/app/core/state.ts | 21 +++++++++------------ src/app/core/sync.ts | 10 ++++------ src/app/editor/index.ts | 11 ++--------- src/routes/spaces/[relay]/chat/+page.svelte | 4 ++-- 10 files changed, 33 insertions(+), 54 deletions(-) diff --git a/src/app/components/RoomDetail.svelte b/src/app/components/RoomDetail.svelte index f15fc325..3115b3d5 100644 --- a/src/app/components/RoomDetail.svelte +++ b/src/app/components/RoomDetail.svelte @@ -33,7 +33,7 @@ import RoomImage from "@app/components/RoomImage.svelte" import { deriveRoom, - deriveRoomMemberList, + deriveRoomMembers, deriveUserIsRoomAdmin, deriveUserRoomMembershipStatus, deriveUserRooms, @@ -57,7 +57,7 @@ const {url, h}: Props = $props() const room = deriveRoom(url, h) - const members = deriveRoomMemberList(url, h) + const members = deriveRoomMembers(url, h) const userIsAdmin = deriveUserIsRoomAdmin(url, h) const membershipStatus = deriveUserRoomMembershipStatus(url, h) const userRooms = deriveUserRooms(url) diff --git a/src/app/components/RoomMembers.svelte b/src/app/components/RoomMembers.svelte index e330303c..8ff478b9 100644 --- a/src/app/components/RoomMembers.svelte +++ b/src/app/components/RoomMembers.svelte @@ -18,7 +18,7 @@ import Profile from "@app/components/Profile.svelte" import RoomName from "@app/components/RoomName.svelte" import RoomMembersAdd from "@app/components/RoomMembersAdd.svelte" - import {deriveRoom, deriveRoomMemberList, deriveUserIsRoomAdmin} from "@app/core/state" + import {deriveRoom, deriveRoomMembers, deriveUserIsRoomAdmin} from "@app/core/state" import {pushModal} from "@app/util/modal" import {pushToast} from "@app/util/toast" @@ -30,7 +30,7 @@ const {url, h}: Props = $props() const room = deriveRoom(url, h) - const members = deriveRoomMemberList(url, h) + const members = deriveRoomMembers(url, h) const userIsAdmin = deriveUserIsRoomAdmin(url, h) const back = () => history.back() diff --git a/src/app/components/RoomMembersAdd.svelte b/src/app/components/RoomMembersAdd.svelte index 20effc5d..efee9925 100644 --- a/src/app/components/RoomMembersAdd.svelte +++ b/src/app/components/RoomMembersAdd.svelte @@ -20,7 +20,7 @@ import ProfileMultiSelect from "@app/components/ProfileMultiSelect.svelte" import {pushToast} from "@app/util/toast" import {pushModal} from "@app/util/modal" - import {deriveRoom, deriveRelayMemberList} from "@app/core/state" + import {deriveRoom, getSpaceMembers} from "@app/core/state" import {addRoomMembers} from "@app/core/commands" interface Props { @@ -31,7 +31,7 @@ const {url, h}: Props = $props() const room = deriveRoom(url, h) - const spaceMembers = deriveRelayMemberList(url) + const spaceMembers = getSpaceMembers(url) const back = () => history.back() @@ -56,12 +56,8 @@ } const onSubmit = async () => { - // Space member list is required to add members to a room if (!$spaceMembers) { - pushToast({ - theme: "error", - message: "Cannot add members: space member list not available from this relay", - }) + addMembers() return } diff --git a/src/app/components/SpaceMembers.svelte b/src/app/components/SpaceMembers.svelte index eb149e8b..d716eaf0 100644 --- a/src/app/components/SpaceMembers.svelte +++ b/src/app/components/SpaceMembers.svelte @@ -22,7 +22,7 @@ import SpaceMembersAdd from "@app/components/SpaceMembersAdd.svelte" import SpaceMembersBanned from "@app/components/SpaceMembersBanned.svelte" import { - deriveRelayMemberList, + getSpaceMembers, deriveSpaceBannedPubkeyItems, deriveUserIsSpaceAdmin, deriveSupportedMethods, @@ -36,7 +36,7 @@ const {url}: Props = $props() - const members = deriveRelayMemberList(url) + const members = getSpaceMembers(url) const bans = deriveSpaceBannedPubkeyItems(url) const userIsAdmin = deriveUserIsSpaceAdmin(url) const supportedMethods = deriveSupportedMethods(url) @@ -114,7 +114,7 @@
    {#if $members === undefined}
    - Member list not available from this relay + Member list not available from this space
    {:else if $members.length === 0}
    diff --git a/src/app/components/SpaceMenu.svelte b/src/app/components/SpaceMenu.svelte index fbefc8c8..1b45fd2a 100644 --- a/src/app/components/SpaceMenu.svelte +++ b/src/app/components/SpaceMenu.svelte @@ -44,7 +44,7 @@ import { ENABLE_ZAPS, CONTENT_KINDS, - deriveRelayMemberList, + getSpaceMembers, deriveUserRooms, deriveOtherRooms, deriveOtherVoiceRooms, @@ -76,7 +76,7 @@ const userRooms = deriveUserRooms(url) const otherRooms = deriveOtherRooms(url) const otherVoiceRooms = deriveOtherVoiceRooms(url) - const members = deriveRelayMemberList(url) + const members = getSpaceMembers(url) const userIsAdmin = deriveUserIsSpaceAdmin(url) const actionItems = deriveSpaceActionItems(url) @@ -182,7 +182,7 @@