updated changes based on review

This commit is contained in:
nayan9617
2026-04-11 23:32:29 +05:30
parent 7500b48806
commit 8d1e4e3235
10 changed files with 33 additions and 54 deletions
+2 -2
View File
@@ -33,7 +33,7 @@
import RoomImage from "@app/components/RoomImage.svelte" import RoomImage from "@app/components/RoomImage.svelte"
import { import {
deriveRoom, deriveRoom,
deriveRoomMemberList, deriveRoomMembers,
deriveUserIsRoomAdmin, deriveUserIsRoomAdmin,
deriveUserRoomMembershipStatus, deriveUserRoomMembershipStatus,
deriveUserRooms, deriveUserRooms,
@@ -57,7 +57,7 @@
const {url, h}: Props = $props() const {url, h}: Props = $props()
const room = deriveRoom(url, h) const room = deriveRoom(url, h)
const members = deriveRoomMemberList(url, h) const members = deriveRoomMembers(url, h)
const userIsAdmin = deriveUserIsRoomAdmin(url, h) const userIsAdmin = deriveUserIsRoomAdmin(url, h)
const membershipStatus = deriveUserRoomMembershipStatus(url, h) const membershipStatus = deriveUserRoomMembershipStatus(url, h)
const userRooms = deriveUserRooms(url) const userRooms = deriveUserRooms(url)
+2 -2
View File
@@ -18,7 +18,7 @@
import Profile from "@app/components/Profile.svelte" import Profile from "@app/components/Profile.svelte"
import RoomName from "@app/components/RoomName.svelte" import RoomName from "@app/components/RoomName.svelte"
import RoomMembersAdd from "@app/components/RoomMembersAdd.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 {pushModal} from "@app/util/modal"
import {pushToast} from "@app/util/toast" import {pushToast} from "@app/util/toast"
@@ -30,7 +30,7 @@
const {url, h}: Props = $props() const {url, h}: Props = $props()
const room = deriveRoom(url, h) const room = deriveRoom(url, h)
const members = deriveRoomMemberList(url, h) const members = deriveRoomMembers(url, h)
const userIsAdmin = deriveUserIsRoomAdmin(url, h) const userIsAdmin = deriveUserIsRoomAdmin(url, h)
const back = () => history.back() const back = () => history.back()
+3 -7
View File
@@ -20,7 +20,7 @@
import ProfileMultiSelect from "@app/components/ProfileMultiSelect.svelte" import ProfileMultiSelect from "@app/components/ProfileMultiSelect.svelte"
import {pushToast} from "@app/util/toast" import {pushToast} from "@app/util/toast"
import {pushModal} from "@app/util/modal" 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" import {addRoomMembers} from "@app/core/commands"
interface Props { interface Props {
@@ -31,7 +31,7 @@
const {url, h}: Props = $props() const {url, h}: Props = $props()
const room = deriveRoom(url, h) const room = deriveRoom(url, h)
const spaceMembers = deriveRelayMemberList(url) const spaceMembers = getSpaceMembers(url)
const back = () => history.back() const back = () => history.back()
@@ -56,12 +56,8 @@
} }
const onSubmit = async () => { const onSubmit = async () => {
// Space member list is required to add members to a room
if (!$spaceMembers) { if (!$spaceMembers) {
pushToast({ addMembers()
theme: "error",
message: "Cannot add members: space member list not available from this relay",
})
return return
} }
+3 -3
View File
@@ -22,7 +22,7 @@
import SpaceMembersAdd from "@app/components/SpaceMembersAdd.svelte" import SpaceMembersAdd from "@app/components/SpaceMembersAdd.svelte"
import SpaceMembersBanned from "@app/components/SpaceMembersBanned.svelte" import SpaceMembersBanned from "@app/components/SpaceMembersBanned.svelte"
import { import {
deriveRelayMemberList, getSpaceMembers,
deriveSpaceBannedPubkeyItems, deriveSpaceBannedPubkeyItems,
deriveUserIsSpaceAdmin, deriveUserIsSpaceAdmin,
deriveSupportedMethods, deriveSupportedMethods,
@@ -36,7 +36,7 @@
const {url}: Props = $props() const {url}: Props = $props()
const members = deriveRelayMemberList(url) const members = getSpaceMembers(url)
const bans = deriveSpaceBannedPubkeyItems(url) const bans = deriveSpaceBannedPubkeyItems(url)
const userIsAdmin = deriveUserIsSpaceAdmin(url) const userIsAdmin = deriveUserIsSpaceAdmin(url)
const supportedMethods = deriveSupportedMethods(url) const supportedMethods = deriveSupportedMethods(url)
@@ -114,7 +114,7 @@
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
{#if $members === undefined} {#if $members === undefined}
<div class="card2 bg-base-200 p-4"> <div class="card2 bg-base-200 p-4">
<span class="text-error">Member list not available from this relay</span> <span class="text-error">Member list not available from this space</span>
</div> </div>
{:else if $members.length === 0} {:else if $members.length === 0}
<div class="card2 bg-base-200 p-4"> <div class="card2 bg-base-200 p-4">
+3 -3
View File
@@ -44,7 +44,7 @@
import { import {
ENABLE_ZAPS, ENABLE_ZAPS,
CONTENT_KINDS, CONTENT_KINDS,
deriveRelayMemberList, getSpaceMembers,
deriveUserRooms, deriveUserRooms,
deriveOtherRooms, deriveOtherRooms,
deriveOtherVoiceRooms, deriveOtherVoiceRooms,
@@ -76,7 +76,7 @@
const userRooms = deriveUserRooms(url) const userRooms = deriveUserRooms(url)
const otherRooms = deriveOtherRooms(url) const otherRooms = deriveOtherRooms(url)
const otherVoiceRooms = deriveOtherVoiceRooms(url) const otherVoiceRooms = deriveOtherVoiceRooms(url)
const members = deriveRelayMemberList(url) const members = getSpaceMembers(url)
const userIsAdmin = deriveUserIsSpaceAdmin(url) const userIsAdmin = deriveUserIsSpaceAdmin(url)
const actionItems = deriveSpaceActionItems(url) const actionItems = deriveSpaceActionItems(url)
@@ -182,7 +182,7 @@
<Button onclick={showMembers}> <Button onclick={showMembers}>
<Icon icon={UserRounded} /> <Icon icon={UserRounded} />
{#if $members === undefined} {#if $members === undefined}
View Members (unavailable) View Members
{:else} {:else}
View Members ({$members.length}) View Members ({$members.length})
{/if} {/if}
+3 -8
View File
@@ -95,7 +95,7 @@ import {
stripPrefix, stripPrefix,
relaysMostlyRestricted, relaysMostlyRestricted,
deriveSocket, deriveSocket,
deriveRelayMemberList, getSpaceMembers,
} from "@app/core/state" } from "@app/core/state"
// Utils // Utils
@@ -765,16 +765,11 @@ export const addSpaceMembers = async (
url: string, url: string,
pubkeys: string[], pubkeys: string[],
): Promise<string | undefined> => { ): Promise<string | undefined> => {
const spaceMembers = get(deriveRelayMemberList(url)) const spaceMembers = get(getSpaceMembers(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( const results = await Promise.all(
pubkeys pubkeys
.filter(pubkey => !spaceMembers.includes(pubkey)) .filter(pubkey => spaceMembers && !spaceMembers.includes(pubkey))
.map(pubkey => .map(pubkey =>
manageRelay(url, { manageRelay(url, {
method: ManagementMethod.AllowPubkey, method: ManagementMethod.AllowPubkey,
+9 -12
View File
@@ -8,7 +8,6 @@ import {
on, on,
gt, gt,
max, max,
find,
spec, spec,
call, call,
first, first,
@@ -809,19 +808,17 @@ export const deriveOtherRooms = (url: string) =>
// Space/room memberships // Space/room memberships
export const deriveRelayMemberList = (url: string) => export const getSpaceMembers = (url: string) =>
derived(deriveRelaySignedEvents(url, [{kinds: [RELAY_MEMBERS]}]), $events => { derived(deriveRelaySignedEvents(url, [{kinds: [RELAY_MEMBERS]}]), ([event]) =>
const membersEvent = $events.find(spec({kind: RELAY_MEMBERS})) uniq(getTagValues("member", event?.tags ?? [])),
return membersEvent ? uniq(getTagValues("member", membersEvent.tags)) : undefined )
})
export const deriveRoomMemberList = (url: string, h: string) => { export const deriveRoomMembers = (url: string, h: string) => {
const filters: Filter[] = [{kinds: [ROOM_MEMBERS], "#d": [h]}] const filters: Filter[] = [{kinds: [ROOM_MEMBERS], "#d": [h]}]
return derived(deriveEventsForUrl(url, filters), $events => { return derived(deriveEventsForUrl(url, filters), ([event]) =>
const membersEvent = find(spec({kind: ROOM_MEMBERS}), $events) uniq(getPubkeyTagValues(event?.tags ?? [])),
return membersEvent ? uniq(getPubkeyTagValues(membersEvent.tags)) : undefined )
})
} }
export type BannedPubkeyItem = { export type BannedPubkeyItem = {
@@ -1063,7 +1060,7 @@ export const deriveUserRoomMembershipStatus = (url: string, h: string) => {
return derived( return derived(
[ [
pubkey, pubkey,
deriveRoomMemberList(url, h), deriveRoomMembers(url, h),
deriveEventsForUrl(url, userEventFilters), deriveEventsForUrl(url, userEventFilters),
deriveEventsForUrl(url, joinLeaveFilters), deriveEventsForUrl(url, joinLeaveFilters),
deriveUserIsRoomAdmin(url, h), deriveUserIsRoomAdmin(url, h),
+4 -6
View File
@@ -174,9 +174,8 @@ const syncUserSpaceMembership = (url: string) => {
url, url,
signal: controller.signal, signal: controller.signal,
filters: [ filters: [
// Keep current-user membership history so status replay stays deterministic. {kinds: [RELAY_ADD_MEMBER], "#p": [$pubkey], limit: 1},
{kinds: [RELAY_ADD_MEMBER], "#p": [$pubkey]}, {kinds: [RELAY_REMOVE_MEMBER], "#p": [$pubkey], limit: 1},
{kinds: [RELAY_REMOVE_MEMBER], "#p": [$pubkey]},
{kinds: [ROOM_CREATE_PERMISSION], "#p": [$pubkey], limit: 1}, {kinds: [ROOM_CREATE_PERMISSION], "#p": [$pubkey], limit: 1},
], ],
}) })
@@ -194,9 +193,8 @@ const syncUserRoomMembership = (url: string, h: string) => {
url, url,
signal: controller.signal, signal: controller.signal,
filters: [ filters: [
// Keep current-user membership history so status replay stays deterministic. {kinds: [ROOM_ADD_MEMBER], "#p": [$pubkey], "#h": [h], limit: 1},
{kinds: [ROOM_ADD_MEMBER], "#p": [$pubkey], "#h": [h]}, {kinds: [ROOM_REMOVE_MEMBER], "#p": [$pubkey], "#h": [h], limit: 1},
{kinds: [ROOM_REMOVE_MEMBER], "#p": [$pubkey], "#h": [h]},
], ],
}) })
} }
+2 -9
View File
@@ -28,13 +28,7 @@ import {RoomReferenceExtension} from "@app/editor/RoomReferenceExtension"
import RoomSuggestion from "@app/editor/RoomSuggestion.svelte" import RoomSuggestion from "@app/editor/RoomSuggestion.svelte"
import {NativeClipboardPasteExtension} from "@app/editor/clipboard" import {NativeClipboardPasteExtension} from "@app/editor/clipboard"
import {uploadFile} from "@app/core/commands" import {uploadFile} from "@app/core/commands"
import { import {getSpaceMembers, makeRoomId, splitRoomId, userSpaceUrls, roomsByUrl} from "@app/core/state"
deriveRelayMemberList,
makeRoomId,
splitRoomId,
userSpaceUrls,
roomsByUrl,
} from "@app/core/state"
import {pushToast} from "@app/util/toast" import {pushToast} from "@app/util/toast"
export const makeEditor = async ({ export const makeEditor = async ({
@@ -64,7 +58,7 @@ export const makeEditor = async ({
[ [
throttled(800, profiles), throttled(800, profiles),
throttled(800, handlesByNip05), throttled(800, handlesByNip05),
throttled(800, deriveRelayMemberList(url || "")), throttled(800, getSpaceMembers(url || "")),
], ],
([$profiles, $handlesByNip05, $spaceMembers]) => { ([$profiles, $handlesByNip05, $spaceMembers]) => {
// Remove invalid nip05's from profiles // Remove invalid nip05's from profiles
@@ -79,7 +73,6 @@ export const makeEditor = async ({
getValue: (profile: PublishedProfile) => profile.event.pubkey, getValue: (profile: PublishedProfile) => profile.event.pubkey,
sortFn: ({score = 1, item}) => { sortFn: ({score = 1, item}) => {
const wotScore = getWotGraph().get(item.event.pubkey) || 0 const wotScore = getWotGraph().get(item.event.pubkey) || 0
// 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 const membershipScale = $spaceMembers?.includes(item.event.pubkey) ? 2 : 1
return dec(score) * inc(wotScore / getMaxWot()) * membershipScale return dec(score) * inc(wotScore / getMaxWot()) * membershipScale
+2 -2
View File
@@ -26,7 +26,7 @@
import RoomCompose from "@app/components/RoomCompose.svelte" import RoomCompose from "@app/components/RoomCompose.svelte"
import RoomComposeEdit from "@src/app/components/RoomComposeEdit.svelte" import RoomComposeEdit from "@src/app/components/RoomComposeEdit.svelte"
import RoomComposeParent from "@app/components/RoomComposeParent.svelte" import RoomComposeParent from "@app/components/RoomComposeParent.svelte"
import {userSettingsValues, decodeRelay, PROTECTED, CONTENT_KINDS} from "@app/core/state" import {userSettingsValues, decodeRelay, PROTECTED} from "@app/core/state"
import {prependParent, canEnforceNip70, publishDelete} from "@app/core/commands" import {prependParent, canEnforceNip70, publishDelete} from "@app/core/commands"
import {checked} from "@app/util/notifications" import {checked} from "@app/util/notifications"
import {pushToast} from "@app/util/toast" import {pushToast} from "@app/util/toast"
@@ -258,7 +258,7 @@
url, url,
at: at || now(), at: at || now(),
element: element!, element: element!,
filters: [{kinds: [...CONTENT_KINDS, MESSAGE]}], filters: [{kinds: [MESSAGE, RELAY_ADD_MEMBER]}],
onBackwardExhausted: () => { onBackwardExhausted: () => {
loadingBackward = false loadingBackward = false
}, },