updated changes based on review
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
|||||||
@@ -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]},
|
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user