diff --git a/src/app/components/RoomCreate.svelte b/src/app/components/RoomCreate.svelte index 144ca0e..c8bf405 100644 --- a/src/app/components/RoomCreate.svelte +++ b/src/app/components/RoomCreate.svelte @@ -14,9 +14,10 @@ import Icon from "@lib/components/Icon.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" - import {hasNip29, loadChannel} from "@app/core/state" + import {deriveUserCanCreateRoom, hasNip29, loadChannel} from "@app/core/state" import {makeSpacePath} from "@app/util/routes" import {pushToast} from "@app/util/toast" + import {get} from "svelte/store" const {url} = $props() @@ -51,6 +52,8 @@ goto(makeSpacePath(url, room.id)) } + const canCreateRoom = get(deriveUserCanCreateRoom(url)) + const create = async () => { loading = true @@ -99,7 +102,10 @@ Go back - diff --git a/src/app/core/state.ts b/src/app/core/state.ts index 580ccac..4a4e97d 100644 --- a/src/app/core/state.ts +++ b/src/app/core/state.ts @@ -22,6 +22,7 @@ import { groupBy, always, tryCatch, + last, } from "@welshman/lib" import type {Socket} from "@welshman/net" import {Pool, load, AuthStateEvent, AuthStatus, SocketEvent, netContext} from "@welshman/net" @@ -760,6 +761,17 @@ export const deriveUserMembershipStatus = (url: string, room: string) => }, ) +export const deriveUserCanCreateRoom = (url: string) => + derived([pubkey, deriveEventsForUrl(url, [{kinds: [39004]}])], ([$pubkey, $events]) => { + const latest = last($events) + + if (!latest) { + return true + } + + return getTagValues("p", latest.tags).includes($pubkey!) + }) + // Other utils export const encodeRelay = (url: string) =>