summaryrefslogtreecommitdiff
path: root/ui/routes/(app)
diff options
context:
space:
mode:
Diffstat (limited to 'ui/routes/(app)')
-rw-r--r--ui/routes/(app)/+layout.svelte89
-rw-r--r--ui/routes/(app)/+page.svelte0
-rw-r--r--ui/routes/(app)/ch/[channel]/+page.svelte17
3 files changed, 106 insertions, 0 deletions
diff --git a/ui/routes/(app)/+layout.svelte b/ui/routes/(app)/+layout.svelte
new file mode 100644
index 0000000..f8744c1
--- /dev/null
+++ b/ui/routes/(app)/+layout.svelte
@@ -0,0 +1,89 @@
+<script>
+ import { onMount } from 'svelte';
+
+ import { boot, subscribeToEvents } from '$lib/apiServer';
+ import { currentUser, logins, channelsList, messages } from '$lib/store';
+
+ import ChannelList from '$lib/components/ChannelList.svelte';
+ import CreateChannelForm from '$lib/components/CreateChannelForm.svelte';
+ import LogIn from '$lib/components/LogIn.svelte';
+ import MessageInput from '$lib/components/MessageInput.svelte';
+
+ let user;
+ let loading = true;
+
+ currentUser.subscribe((value) => {
+ user = value;
+ });
+
+ function onBooted(boot) {
+ currentUser.update(() => ({
+ id: boot.login.id,
+ username: boot.login.name,
+ }));
+ logins.update((value) => value.setLogins(boot.logins));
+ channelsList.update((value) => value.setChannels(boot.channels));
+ messages.update((value) => value.setMessages(boot.messages));
+ }
+
+ onMount(async () => {
+ try {
+ let response = await boot();
+ switch (response.status) {
+ case 200:
+ onBooted(response.data);
+ subscribeToEvents(response.data.resume_point);
+ break;
+ case 401:
+ currentUser.update(() => null);
+ break;
+ default:
+ // TODO: display error.
+ break;
+ }
+ } catch (_) {
+ // I don't want exceptions on non-200 series responses, dammit.
+ }
+ loading = false;
+ });
+</script>
+
+{#if loading}
+ <h2>Loading&hellip;</h2>
+{:else if user != null}
+ <div id="interface">
+ <div class="channel-list">
+ <ChannelList />
+ </div>
+ <div class="active-channel">
+ <slot />
+ </div>
+ <div class="create-channel">
+ <CreateChannelForm />
+ </div>
+ <div class="create-message">
+ <MessageInput />
+ </div>
+ </div>
+{:else}
+ <LogIn />
+{/if}
+
+<style>
+ #interface {
+ height: 88vh;
+ margin: 1rem;
+ display: grid;
+ grid-template-columns: 18rem auto;
+ grid-template-rows: auto 2rem;
+ grid-gap: 0.25rem;
+ }
+ #interface div {
+ max-height: 100%;
+ overflow: scroll;
+ }
+ #interface .active-channel {
+ border: 1px solid grey;
+ border-radius: 1.25rem;
+ }
+</style>
diff --git a/ui/routes/(app)/+page.svelte b/ui/routes/(app)/+page.svelte
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ui/routes/(app)/+page.svelte
diff --git a/ui/routes/(app)/ch/[channel]/+page.svelte b/ui/routes/(app)/ch/[channel]/+page.svelte
new file mode 100644
index 0000000..ef439d0
--- /dev/null
+++ b/ui/routes/(app)/ch/[channel]/+page.svelte
@@ -0,0 +1,17 @@
+<script>
+ import { afterNavigate } from '$app/navigation';
+ import { page } from '$app/stores';
+
+ import { activeChannel } from '$lib/store';
+ import ActiveChannel from '$lib/components/ActiveChannel.svelte';
+
+ afterNavigate(async () => {
+ let { channel } = $page.params;
+ activeChannel.update((value) => {
+ value.set(channel)
+ return value;
+ });
+ });
+</script>
+
+<ActiveChannel />