From c5401af6b91b79d8cfa0c6192093a867f4cb7a14 Mon Sep 17 00:00:00 2001 From: mplorentz Date: Mon, 2 Mar 2026 17:48:06 -0500 Subject: [PATCH] Allow user to configure room for voice, text, or both. --- src/app/components/RoomForm.svelte | 40 +++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/app/components/RoomForm.svelte b/src/app/components/RoomForm.svelte index 358d5ffc..615dd4cc 100644 --- a/src/app/components/RoomForm.svelte +++ b/src/app/components/RoomForm.svelte @@ -16,6 +16,24 @@ import {pushToast} from "@app/util/toast" import {uploadFile} from "@app/core/commands" + type RoomMode = "text" | "voice" | "both" + + const getRoomModeFromEvent = (event?: {tags?: string[][]}): RoomMode => { + const tags = event?.tags ?? [] + const hasLivekit = tags.some(t => t[0] === "livekit") + const hasNoText = tags.some(t => t[0] === "no-text") + if (hasLivekit && hasNoText) return "voice" + if (hasLivekit) return "both" + return "text" + } + + const buildTagsWithRoomMode = (existingTags: string[][], roomMode: RoomMode): string[][] => { + const filtered = existingTags.filter(t => t[0] !== "livekit" && t[0] !== "no-text") + if (roomMode === "both") return [...filtered, ["livekit"]] + if (roomMode === "voice") return [...filtered, ["livekit"], ["no-text"]] + return filtered + } + type Props = { url: string header: Snippet @@ -27,12 +45,16 @@ const {url, header, footer, onsubmit, initialValues = makeRoomMeta()}: Props = $props() const values = $state(initialValues) + let roomMode = $state(getRoomModeFromEvent(initialValues.event)) const submit = async () => { const room = $state.snapshot(values) if (imageFile) { - const {error, result} = await uploadFile(imageFile, {maxWidth: 256, maxHeight: 256}) + const {error, result} = await uploadFile(imageFile, { + maxWidth: 256, + maxHeight: 256, + }) if (error) { return pushToast({theme: "error", message: error}) @@ -42,6 +64,10 @@ room.pictureMeta = result.tags } + const existingTags = room.event?.tags ?? [] + const tags = buildTagsWithRoomMode(existingTags, roomMode) + room.event = room.event ? {...room.event, tags} : ({tags} as RoomMeta["event"]) + const createMessage = await waitForThunkError(createRoom(url, room)) if (createMessage && !createMessage.includes("already")) { @@ -178,6 +204,18 @@ Ignore requests to join + + {#snippet label()} +

Room type

+ {/snippet} + {#snippet input()} + + {/snippet} +
{@render footer({loading})}