From 945a9649e662b3a7086754e26c15574f7b10860b Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 25 Sep 2026 16:28:34 -0700 Subject: [PATCH] Split RoomChat into RoomTranscript, RoomMembershipButton and RoomCallPane so each owns its own state --- src/app/components/RoomCallPane.svelte | 27 + src/app/components/RoomChat.svelte | 487 +----------------- .../components/RoomMembershipButton.svelte | 75 +++ src/app/components/RoomTranscript.svelte | 413 +++++++++++++++ 4 files changed, 539 insertions(+), 463 deletions(-) create mode 100644 src/app/components/RoomCallPane.svelte create mode 100644 src/app/components/RoomMembershipButton.svelte create mode 100644 src/app/components/RoomTranscript.svelte diff --git a/src/app/components/RoomCallPane.svelte b/src/app/components/RoomCallPane.svelte new file mode 100644 index 00000000..48bb09fe --- /dev/null +++ b/src/app/components/RoomCallPane.svelte @@ -0,0 +1,27 @@ + + + +
+ +
+ +
+
diff --git a/src/app/components/RoomChat.svelte b/src/app/components/RoomChat.svelte index fc75ad9a..b5688d78 100644 --- a/src/app/components/RoomChat.svelte +++ b/src/app/components/RoomChat.svelte @@ -1,52 +1,35 @@ -{#snippet membershipButton(label: string)} - {#if $membershipStatus === MembershipStatus.Pending} - - {:else} - - {/if} -{/snippet} -
{#if h && voiceConnectedHere} - -
- -
- -
-
+ {/if} - {:else if $room?.meta?.isRestricted() && $membershipStatus !== MembershipStatus.Granted} + {:else if h && $room?.meta?.isRestricted() && $membershipStatus !== MembershipStatus.Granted}

Only members are allowed to post to this room.

- {@render membershipButton("Ask to Join")} +
{:else} + import {page} from "$app/stores" + import {MembershipStatus} from "@welshman/app" + import ClockCircle from "@assets/icons/clock-circle.svg?dataurl" + import Login2 from "@assets/icons/login-3.svg?dataurl" + import Button from "@lib/components/Button.svelte" + import Icon from "@lib/components/Icon.svelte" + import Spinner from "@lib/components/Spinner.svelte" + import {joinRoom, leaveRoom} from "@app/access" + import {deriveUserRoomMembershipStatus} from "@app/rooms" + import {pushToast} from "@app/toast" + + type Props = { + url: string + h: string + label: string + onJoin: () => void + } + + const {url, h, label, onJoin}: Props = $props() + + const membershipStatus = deriveUserRoomMembershipStatus(url, h) + const inviteCode = $derived($page.url.searchParams.get("code") || "") + + const join = async () => { + joining = true + + try { + const message = await joinRoom(url, h, inviteCode) + + if (message) { + pushToast({theme: "error", message}) + } else { + onJoin() + } + } finally { + joining = false + } + } + + const leave = async () => { + leaving = true + + try { + const message = await leaveRoom(url, h) + + if (message) { + pushToast({theme: "error", message}) + } else { + pushToast({message: "You have left the room."}) + } + } finally { + leaving = false + } + } + + let joining = $state(false) + let leaving = $state(false) + + +{#if $membershipStatus === MembershipStatus.Pending} + +{:else} + +{/if} diff --git a/src/app/components/RoomTranscript.svelte b/src/app/components/RoomTranscript.svelte new file mode 100644 index 00000000..d8447e00 --- /dev/null +++ b/src/app/components/RoomTranscript.svelte @@ -0,0 +1,413 @@ + + +
+
+ {#if h && $room?.meta?.isPrivate() && $membershipStatus !== MembershipStatus.Granted} +
+
+

You aren't currently a member of this room.

+ +
+
+ {:else} + + {#snippet row(item)} + {#if item.type === "new-messages"} +
+
+

+ New Messages +

+
+
+ {:else if item.type === "date"} + {item.value} + {:else if item.value.kind === addMemberKind} + + {:else} + + {/if} + {/snippet} +
+

+ {#if reachedStartOfHistory} + End of message history + {:else} + Looking for messages... + {/if} +

+ {/if} +
+
+ + {#if showScrollButton} +
+ +
+ {/if} + + {#if showFixedNewMessages} +
+ +
+ {/if} +