diff --git a/src/app/commands.ts b/src/app/commands.ts index a93729fd..0222ad88 100644 --- a/src/app/commands.ts +++ b/src/app/commands.ts @@ -18,6 +18,7 @@ import { getListTags, getRelayTags, isShareableRelayUrl, + getRelayTagValues, } from "@welshman/util" import type {TrustedEvent, EventTemplate, List} from "@welshman/util" import type {SubscribeRequestWithHandlers} from "@welshman/net" @@ -145,31 +146,35 @@ export const broadcastUserData = async (relays: string[]) => { export const addSpaceMembership = async (url: string) => { const list = get(userMembership) || makeList({kind: MEMBERSHIPS}) const event = await addToListPublicly(list, ["r", url]).reconcile(nip44EncryptToSelf) + const relays = [...ctx.app.router.WriteRelays().getUrls(), ...getRelayTagValues(event.tags)] - return publishThunk({event, relays: ctx.app.router.WriteRelays().getUrls()}).result + return publishThunk({event, relays}).result } export const removeSpaceMembership = async (url: string) => { const list = get(userMembership) || makeList({kind: MEMBERSHIPS}) const pred = (t: string[]) => t[t[0] === "r" ? 1 : 2] === url const event = await removeFromListByPredicate(list, pred).reconcile(nip44EncryptToSelf) + const relays = [...ctx.app.router.WriteRelays().getUrls(), ...getRelayTagValues(event.tags)] - return publishThunk({event, relays: ctx.app.router.WriteRelays().getUrls()}).result + return publishThunk({event, relays}).result } export const addRoomMembership = async (url: string, room: string) => { const list = get(userMembership) || makeList({kind: MEMBERSHIPS}) const event = await addToListPublicly(list, tagRoom(room, url)).reconcile(nip44EncryptToSelf) + const relays = [...ctx.app.router.WriteRelays().getUrls(), ...getRelayTagValues(event.tags)] - return publishThunk({event, relays: ctx.app.router.WriteRelays().getUrls()}).result + return publishThunk({event, relays}).result } export const removeRoomMembership = async (url: string, room: string) => { const list = get(userMembership) || makeList({kind: MEMBERSHIPS}) const pred = (t: string[]) => equals(tagRoom(room, url), t) const event = await removeFromListByPredicate(list, pred).reconcile(nip44EncryptToSelf) + const relays = [...ctx.app.router.WriteRelays().getUrls(), ...getRelayTagValues(event.tags)] - return publishThunk({event, relays: ctx.app.router.WriteRelays().getUrls()}).result + return publishThunk({event, relays}).result } export const setRelayPolicy = (url: string, read: boolean, write: boolean) => { diff --git a/src/app/components/MenuSpace.svelte b/src/app/components/MenuSpace.svelte index 7b57a997..8050380f 100644 --- a/src/app/components/MenuSpace.svelte +++ b/src/app/components/MenuSpace.svelte @@ -11,11 +11,14 @@ import SpaceInvite from "@app/components/SpaceInvite.svelte" import SpaceExit from "@app/components/SpaceExit.svelte" import SpaceJoin from "@app/components/SpaceJoin.svelte" + import ProfileList from "@app/components/ProfileList.svelte" import RoomCreate from "@app/components/RoomCreate.svelte" import { getMembershipRoomsByUrl, getMembershipUrls, + hasMembershipUrl, userMembership, + memberships, roomsByUrl, GENERAL, } from "@app/state" @@ -34,6 +37,9 @@ showMenu = !showMenu } + const showMembers = () => + pushModal(ProfileList, {pubkeys: members, title: `Members of`, subtitle: displayRelayUrl(url)}) + const createInvite = () => pushModal(SpaceInvite, {url}) const leaveSpace = () => pushModal(SpaceExit, {url}) @@ -57,6 +63,7 @@ $: rooms = getMembershipRoomsByUrl(url, $userMembership) $: otherRooms = ($roomsByUrl.get(url) || []).filter(room => !rooms.concat(GENERAL).includes(room)) + $: members = $memberships.filter(l => hasMembershipUrl(l, url)).map(l => l.event.pubkey) onMount(async () => { const error = (await checkRelayConnection(url)) || (await checkRelayAuth(url)) @@ -78,6 +85,12 @@