From 4401dce2b5545ce8117818812d8e3c8919f5f7fd Mon Sep 17 00:00:00 2001
From: Owen Jacobson <owen@grimoire.ca>
Date: Thu, 10 Oct 2024 21:05:48 -0400
Subject: Remove redundancy in `hi-ui` directory name.

---
 ui/src/routes/(app)/+layout.svelte | 89 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)
 create mode 100644 ui/src/routes/(app)/+layout.svelte

(limited to 'ui/src/routes/(app)/+layout.svelte')

diff --git a/ui/src/routes/(app)/+layout.svelte b/ui/src/routes/(app)/+layout.svelte
new file mode 100644
index 0000000..f8744c1
--- /dev/null
+++ b/ui/src/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>
-- 
cgit v1.2.3

