From d8c3378e5cfc7753a66075176a311c0bef74f5e7 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 10 Dec 2024 15:16:54 -0800 Subject: [PATCH] Create nip29 group when creating a room --- src/app/commands.ts | 25 ++++++++++++++++++- src/app/components/RoomCreate.svelte | 25 ++++++++++++++++++- src/routes/+layout.svelte | 10 ++++---- src/routes/spaces/[relay]/[room]/+page.svelte | 15 ++++++----- 4 files changed, 62 insertions(+), 13 deletions(-) diff --git a/src/app/commands.ts b/src/app/commands.ts index 739771c3a..030cb1c55 100644 --- a/src/app/commands.ts +++ b/src/app/commands.ts @@ -10,6 +10,8 @@ import { AUTH_JOIN, GROUP_JOIN, GROUP_LEAVE, + GROUP_CREATE, + GROUP_EDIT_META, GROUPS, COMMENT, isSignedEvent, @@ -53,7 +55,7 @@ import { clearStorage, dropSession, } from "@welshman/app" -import type {Relay} from "@welshman/app" +import type {Relay, Thunk} from "@welshman/app" import { tagRoom, userMembership, @@ -122,6 +124,15 @@ export const subscribePersistent = (request: SubscribeRequestWithHandlers) => { } } +export const getThunkError = async (thunk: Thunk) => { + const result = await thunk.result + const [{status, message}] = Object.values(result) as any + + if (status !== PublishStatus.Success) { + return message + } +} + // Log in export const loginWithNip46 = async ({ @@ -224,6 +235,18 @@ export const broadcastUserData = async (relays: string[]) => { export const nip29 = { isSupported: (relay?: Relay) => relay?.profile?.supported_nips?.map(String)?.includes("29"), + createRoom: (url: string, room: string) => { + const event = createEvent(GROUP_CREATE, {tags: [tagRoom(room, url)]}) + + return publishThunk({event, relays: [url]}) + }, + editMeta: (url: string, room: string, meta: Record) => { + const event = createEvent(GROUP_EDIT_META, { + tags: [tagRoom(room, url), ...Object.entries(meta)], + }) + + return publishThunk({event, relays: [url]}) + }, joinRoom: (url: string, room: string) => { const event = createEvent(GROUP_JOIN, {tags: [tagRoom(room, url)]}) diff --git a/src/app/components/RoomCreate.svelte b/src/app/components/RoomCreate.svelte index 078ca3daa..325ed57d6 100644 --- a/src/app/components/RoomCreate.svelte +++ b/src/app/components/RoomCreate.svelte @@ -2,22 +2,45 @@ import {goto} from "$app/navigation" import {randomId} from "@welshman/lib" import {displayRelayUrl} from "@welshman/util" + import {deriveRelay} from "@welshman/app" import Field from "@lib/components/Field.svelte" import Spinner from "@lib/components/Spinner.svelte" import Button from "@lib/components/Button.svelte" import Icon from "@lib/components/Icon.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" - import {addRoomMembership} from "@app/commands" + import {addRoomMembership, nip29, getThunkError} from "@app/commands" import {makeSpacePath} from "@app/routes" + import {pushToast} from "@app/toast" export let url const room = randomId() + const relay = deriveRelay(url) const back = () => history.back() const tryCreate = async () => { + if (nip29.isSupported($relay)) { + const createMessage = await getThunkError(nip29.createRoom(url, room)) + + if (createMessage && !createMessage.includes("already")) { + return pushToast({theme: "error", message: createMessage}) + } + + const editMessage = await getThunkError(nip29.editMeta(url, room, {name})) + + if (editMessage) { + return pushToast({theme: "error", message: editMessage}) + } + + const joinMessage = await getThunkError(nip29.joinRoom(url, room)) + + if (joinMessage && !joinMessage.includes("already")) { + return pushToast({theme: "error", message: joinMessage}) + } + } + addRoomMembership(url, room, name) goto(makeSpacePath(url, room)) } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index eebf8241e..7760e7c8c 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -150,15 +150,15 @@ setupAnalytics() ready = initStorage("flotilla", 4, { - relays: {keyPath: "url", store: throttled(1000, relays)}, - handles: {keyPath: "nip05", store: throttled(1000, handles)}, - checked: storageAdapters.fromObjectStore(checked, {throttle: 1000}), + relays: {keyPath: "url", store: throttled(3000, relays)}, + handles: {keyPath: "nip05", store: throttled(3000, handles)}, + checked: storageAdapters.fromObjectStore(checked, {throttle: 3000}), freshness: storageAdapters.fromObjectStore(freshness, { - throttle: 1000, + throttle: 3000, migrate: migrateFreshness, }), plaintext: storageAdapters.fromObjectStore(plaintext, { - throttle: 1000, + throttle: 3000, migrate: migratePlaintext, }), events: storageAdapters.fromRepositoryAndTracker(repository, tracker, { diff --git a/src/routes/spaces/[relay]/[room]/+page.svelte b/src/routes/spaces/[relay]/[room]/+page.svelte index d760ec167..e3e29c112 100644 --- a/src/routes/spaces/[relay]/[room]/+page.svelte +++ b/src/routes/spaces/[relay]/[room]/+page.svelte @@ -9,7 +9,6 @@ import type {TrustedEvent, EventContent} from "@welshman/util" import {throttled} from "@welshman/store" import {createEvent, DELETE, MESSAGE} from "@welshman/util" - import {PublishStatus} from "@welshman/net" import {formatTimestampAsDate, load, publishThunk, deriveRelay} from "@welshman/app" import {slide} from "@lib/transition" import {createScroller, type Scroller} from "@lib/html" @@ -35,7 +34,13 @@ displayChannel, } from "@app/state" import {setChecked} from "@app/notifications" - import {nip29, addRoomMembership, removeRoomMembership, subscribePersistent} from "@app/commands" + import { + nip29, + addRoomMembership, + removeRoomMembership, + getThunkError, + subscribePersistent, + } from "@app/commands" import {PROTECTED} from "@app/state" import {popKey} from "@app/implicit" import {pushToast} from "@app/toast" @@ -50,11 +55,9 @@ const joinRoom = async () => { if (nip29.isSupported($relay)) { - const thunk = nip29.joinRoom(url, room) - const result = await thunk.result - const {status, message} = result[url]! + const message = await getThunkError(nip29.joinRoom(url, room)) - if (status !== PublishStatus.Success) { + if (message && !message.includes("already")) { return pushToast({theme: "error", message}) } }