summaryrefslogtreecommitdiff
path: root/ui/lib/store.js
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2025-02-21 13:08:14 -0500
committerOwen Jacobson <owen@grimoire.ca>2025-02-21 13:21:11 -0500
commit5cff84a375f64537c44f6418496f1dc1b24a1de8 (patch)
tree3100d41f54c9c517067b80b6e6a8167521af168e /ui/lib/store.js
parent70525c018dfd31a27805bb1fb666501b73d43e21 (diff)
Split "set up the event source" and "apply events to state" from one another.
Diffstat (limited to 'ui/lib/store.js')
-rw-r--r--ui/lib/store.js61
1 files changed, 61 insertions, 0 deletions
diff --git a/ui/lib/store.js b/ui/lib/store.js
index 47ebbc2..c179dac 100644
--- a/ui/lib/store.js
+++ b/ui/lib/store.js
@@ -7,3 +7,64 @@ export const currentUser = writable(null);
export const logins = writable(new Logins());
export const channelsList = writable(new Channels());
export const messages = writable(new Messages());
+
+export function onEvent(event) {
+ switch (event.type) {
+ case 'login':
+ onLoginEvent(event);
+ break;
+ case 'channel':
+ onChannelEvent(event);
+ break;
+ case 'message':
+ onMessageEvent(event);
+ break;
+ }
+}
+
+onEvent.fromJson = (event) => {
+ const parsed = JSON.parse(event);
+ return onEvent(parsed);
+};
+
+onEvent.fromMessage = (message) => {
+ const data = message.data;
+ return onEvent.fromJson(data);
+};
+
+function onLoginEvent(event) {
+ switch (event.event) {
+ case 'created':
+ logins.update((value) => value.addLogin(event.id, event.name));
+ break;
+ }
+}
+
+function onChannelEvent(event) {
+ switch (event.event) {
+ case 'created':
+ channelsList.update((value) => value.addChannel(event.id, event.name));
+ break;
+ case 'deleted':
+ channelsList.update((value) => value.deleteChannel(event.id));
+ messages.update((value) => value.deleteChannel(event.id));
+ break;
+ }
+}
+
+function onMessageEvent(event) {
+ switch (event.event) {
+ case 'sent':
+ messages.update((value) =>
+ value.addMessage(event.channel, event.id, {
+ at: event.at,
+ sender: event.sender,
+ body: event.body
+ })
+ );
+ break;
+ case 'deleted':
+ messages.update((value) => value.deleteMessage(event.id));
+ break;
+ }
+}