From 215b0c5cb2ff0ef0b2c7b5549704e23d651a4df9 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Thu, 10 Oct 2024 21:51:10 -0400 Subject: Hoist the UI one step up further --- ui/src/lib/apiServer.js | 101 ------------------------- ui/src/lib/components/ActiveChannel.svelte | 27 ------- ui/src/lib/components/Channel.svelte | 21 ----- ui/src/lib/components/ChannelList.svelte | 18 ----- ui/src/lib/components/CreateChannelForm.svelte | 23 ------ ui/src/lib/components/LogIn.svelte | 35 --------- ui/src/lib/components/LogOut.svelte | 22 ------ ui/src/lib/components/Message.svelte | 33 -------- ui/src/lib/components/MessageInput.svelte | 30 -------- ui/src/lib/index.js | 1 - ui/src/lib/store.js | 10 --- ui/src/lib/store/channels.js | 71 ----------------- ui/src/lib/store/logins.js | 22 ------ ui/src/lib/store/messages.js | 44 ----------- 14 files changed, 458 deletions(-) delete mode 100644 ui/src/lib/apiServer.js delete mode 100644 ui/src/lib/components/ActiveChannel.svelte delete mode 100644 ui/src/lib/components/Channel.svelte delete mode 100644 ui/src/lib/components/ChannelList.svelte delete mode 100644 ui/src/lib/components/CreateChannelForm.svelte delete mode 100644 ui/src/lib/components/LogIn.svelte delete mode 100644 ui/src/lib/components/LogOut.svelte delete mode 100644 ui/src/lib/components/Message.svelte delete mode 100644 ui/src/lib/components/MessageInput.svelte delete mode 100644 ui/src/lib/index.js delete mode 100644 ui/src/lib/store.js delete mode 100644 ui/src/lib/store/channels.js delete mode 100644 ui/src/lib/store/logins.js delete mode 100644 ui/src/lib/store/messages.js (limited to 'ui/src/lib') diff --git a/ui/src/lib/apiServer.js b/ui/src/lib/apiServer.js deleted file mode 100644 index f6d6148..0000000 --- a/ui/src/lib/apiServer.js +++ /dev/null @@ -1,101 +0,0 @@ -import axios from 'axios'; -import { activeChannel, channelsList, logins, messages } from '$lib/store'; - -export const apiServer = axios.create({ - baseURL: '/api/', -}); - -export async function boot() { - return apiServer.get('/boot'); -} - -export async function logIn(username, password) { - const data = { - name: username, - password, - }; - return apiServer.post('/auth/login', data); -} - -export async function logOut() { - return apiServer.post('/auth/logout', {}); -} - -export async function createChannel(name) { - return apiServer.post('/channels', { name }); -} - -export async function postToChannel(channelId, body) { - return apiServer.post(`/channels/${channelId}`, { body }); -} - -export async function deleteMessage(messageId) { - // TODO -} - -export function subscribeToEvents(resume_point) { - const eventsUrl = new URL('/api/events', window.location); - eventsUrl.searchParams.append('resume_point', resume_point); - const evtSource = new EventSource(eventsUrl.toString()); - // TODO: this should process all incoming events and store them. - // TODO: eventually we'll need to handle expiring old info, so as not to use - // infinite browser memory. - /* - * Known message types as of now: - * - created: a channel is created. - * - action: ignore. - * - message: a message is created. - * - action: display message in channel. - * - message_deleted: a message is deleted. - * - action: replace message with <...>. - * - deleted: a channel is deleted. - * - action: remove channel from sidebar. - */ - evtSource.onmessage = (evt) => { - const data = JSON.parse(evt.data); - - switch (data.type) { - case 'login': - onLoginEvent(data); - break; - case 'channel': - onChannelEvent(data); - break; - case 'message': - onMessageEvent(data); - break; - } - } -} - -function onLoginEvent(data) { - switch (data.event) { - case 'created': - logins.update((value) => value.addLogin(data.id, data.name)) - break; - } -} - -function onChannelEvent(data) { - switch (data.event) { - case 'created': - channelsList.update((value) => value.addChannel(data.id, data.name)) - break; - case 'deleted': - activeChannel.update((value) => value.deleteChannel(data.id)); - channelsList.update((value) => value.deleteChannel(data.id)); - messages.update((value) => value.deleteChannel(data.id)); - break; - } -} - -function onMessageEvent(data) { - switch (data.event) { - case 'sent': - messages.update((value) => value.addMessage(data.channel, data.id, data.at, data.sender, data.body)); - break; - case 'deleted': - messages.update((value) => value.deleteMessage(data.id)); - break; - } -} diff --git a/ui/src/lib/components/ActiveChannel.svelte b/ui/src/lib/components/ActiveChannel.svelte deleted file mode 100644 index 978e952..0000000 --- a/ui/src/lib/components/ActiveChannel.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - -
- {#each messageList as message} -
- -
- {/each} -
- - diff --git a/ui/src/lib/components/Channel.svelte b/ui/src/lib/components/Channel.svelte deleted file mode 100644 index 97fea1f..0000000 --- a/ui/src/lib/components/Channel.svelte +++ /dev/null @@ -1,21 +0,0 @@ - - -
  • - - # - {name} - -
  • diff --git a/ui/src/lib/components/ChannelList.svelte b/ui/src/lib/components/ChannelList.svelte deleted file mode 100644 index e0e5f06..0000000 --- a/ui/src/lib/components/ChannelList.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/ui/src/lib/components/CreateChannelForm.svelte b/ui/src/lib/components/CreateChannelForm.svelte deleted file mode 100644 index ddcf486..0000000 --- a/ui/src/lib/components/CreateChannelForm.svelte +++ /dev/null @@ -1,23 +0,0 @@ - - -
    - - -
    - - diff --git a/ui/src/lib/components/LogIn.svelte b/ui/src/lib/components/LogIn.svelte deleted file mode 100644 index 2836e6d..0000000 --- a/ui/src/lib/components/LogIn.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - -
    -
    - - - -
    -
    diff --git a/ui/src/lib/components/LogOut.svelte b/ui/src/lib/components/LogOut.svelte deleted file mode 100644 index 01bef1b..0000000 --- a/ui/src/lib/components/LogOut.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - -
    - @{$currentUser.username} - -
    - - diff --git a/ui/src/lib/components/Message.svelte b/ui/src/lib/components/Message.svelte deleted file mode 100644 index d040433..0000000 --- a/ui/src/lib/components/Message.svelte +++ /dev/null @@ -1,33 +0,0 @@ - - -
    - - - @{name}: - - {at} -
    - -
    -
    - - diff --git a/ui/src/lib/components/MessageInput.svelte b/ui/src/lib/components/MessageInput.svelte deleted file mode 100644 index b33574b..0000000 --- a/ui/src/lib/components/MessageInput.svelte +++ /dev/null @@ -1,30 +0,0 @@ - - -
    - - -
    diff --git a/ui/src/lib/index.js b/ui/src/lib/index.js deleted file mode 100644 index 856f2b6..0000000 --- a/ui/src/lib/index.js +++ /dev/null @@ -1 +0,0 @@ -// place files you want to import through the `$lib` alias in this folder. diff --git a/ui/src/lib/store.js b/ui/src/lib/store.js deleted file mode 100644 index b964b4b..0000000 --- a/ui/src/lib/store.js +++ /dev/null @@ -1,10 +0,0 @@ -import { writable } from 'svelte/store'; -import { ActiveChannel, Channels } from '$lib/store/channels'; -import { Messages } from '$lib/store/messages'; -import { Logins } from '$lib/store/logins'; - -export const currentUser = writable(null); -export const activeChannel = writable(new ActiveChannel()); -export const logins = writable(new Logins()); -export const channelsList = writable(new Channels()); -export const messages = writable(new Messages()); diff --git a/ui/src/lib/store/channels.js b/ui/src/lib/store/channels.js deleted file mode 100644 index bb6c86c..0000000 --- a/ui/src/lib/store/channels.js +++ /dev/null @@ -1,71 +0,0 @@ -export class Channels { - constructor() { - this.channels = []; - } - - setChannels(channels) { - this.channels = [...channels]; - this.sort(); - return this; - } - - addChannel(id, name) { - this.channels = [...this.channels, { id, name }]; - this.sort(); - return this; - } - - deleteChannel(id) { - const channelIndex = this.channels.map((e) => e.id).indexOf(id); - if (channelIndex !== -1) { - this.channels.splice(channelIndex, 1); - } - return this; - } - - sort() { - this.channels.sort((a, b) => { - if (a.name < b.name) { - return -1; - } else if (a.name > b.name) { - return 1; - } - return 0; - }); - } -} - -export class ActiveChannel { - constructor() { - this.channel = null; - } - - isSet() { - return this.channel !== null; - } - - get() { - return this.channel; - } - - is(id) { - return this.channel === id; - } - - set(id) { - this.channel = id; - return this; - } - - deleteChannel(id) { - if (this.is(id)) { - return this.clear(); - } - return this; - } - - clear() { - this.channel = null; - return this; - } -} diff --git a/ui/src/lib/store/logins.js b/ui/src/lib/store/logins.js deleted file mode 100644 index 5b45206..0000000 --- a/ui/src/lib/store/logins.js +++ /dev/null @@ -1,22 +0,0 @@ -export class Logins { - constructor() { - this.logins = {}; - } - - addLogin(id, name) { - this.logins[id] = name; - return this; - } - - setLogins(logins) { - this.logins = {}; - for (let { id, name } of logins) { - this.addLogin(id, name); - } - return this; - } - - get(id) { - return this.logins[id]; - } -} diff --git a/ui/src/lib/store/messages.js b/ui/src/lib/store/messages.js deleted file mode 100644 index 931b8fb..0000000 --- a/ui/src/lib/store/messages.js +++ /dev/null @@ -1,44 +0,0 @@ -export class Messages { - constructor() { - this.channels = {}; - } - - inChannel(channel) { - return this.channels[channel] = (this.channels[channel] || []); - } - - addMessage(channel, id, at, sender, body) { - this.updateChannel(channel, (messages) => [...messages, { id, at, sender, body }]); - return this; - } - - setMessages(messages) { - this.channels = {}; - for (let { channel, id, at, sender, body } of messages) { - this.inChannel(channel).push({ id, at, sender, body, }); - } - for (let channel in this.channels) { - this.channels[channel].sort((a, b) => a.at - b.at); - } - return this; - } - - - deleteMessage(message) { - for (let channel in this.channels) { - this.updateChannel(channel, (messages) => messages.filter((msg) => msg.id != message)); - } - return this; - } - - deleteChannel(id) { - delete this.channels[id]; - return this; - } - - updateChannel(channel, callback) { - let messages = callback(this.inChannel(channel)); - messages.sort((a, b) => a.at - b.at); - this.channels[channel] = messages; - } -} -- cgit v1.2.3