summaryrefslogtreecommitdiff
path: root/ui/lib
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
parent70525c018dfd31a27805bb1fb666501b73d43e21 (diff)
Split "set up the event source" and "apply events to state" from one another.
Diffstat (limited to 'ui/lib')
-rw-r--r--ui/lib/apiServer.js70
-rw-r--r--ui/lib/store.js61
2 files changed, 62 insertions, 69 deletions
diff --git a/ui/lib/apiServer.js b/ui/lib/apiServer.js
index e541d43..bb0a587 100644
--- a/ui/lib/apiServer.js
+++ b/ui/lib/apiServer.js
@@ -61,73 +61,5 @@ export function subscribeToEvents(resumePoint) {
resume_point: resumePoint
}
});
- const evtSource = new EventSource(eventsUrl);
- // 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;
- }
- };
-
- return evtSource;
-}
-
-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':
- 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, {
- at: data.at,
- sender: data.sender,
- body: data.body
- })
- );
- break;
- case 'deleted':
- messages.update((value) => value.deleteMessage(data.id));
- break;
- }
+ return new EventSource(eventsUrl);
}
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;
+ }
+}