summaryrefslogtreecommitdiff
path: root/hi-ui/src/store
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-05 23:00:58 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-05 23:00:58 -0400
commit05de3c7b211727039b3912311aa4bab6787a7457 (patch)
tree08a3860b68391514390f42872ccc1cb4c6e6afd2 /hi-ui/src/store
parentbc514e0ea5f0a553f15ab8275961907877181520 (diff)
parent6a10fcaf64938da52b326ea80013d9f30ed62a6c (diff)
Merge branch 'wip/boot'
Diffstat (limited to 'hi-ui/src/store')
-rw-r--r--hi-ui/src/store/channels.js71
-rw-r--r--hi-ui/src/store/messages.js41
2 files changed, 112 insertions, 0 deletions
diff --git a/hi-ui/src/store/channels.js b/hi-ui/src/store/channels.js
new file mode 100644
index 0000000..20702cc
--- /dev/null
+++ b/hi-ui/src/store/channels.js
@@ -0,0 +1,71 @@
+export class Channels {
+ constructor() {
+ this.channels = [];
+ }
+
+ setChannels(channels) {
+ this.channels = [...channels];
+ this.sort();
+ return this;
+ }
+
+ addChannel(channel) {
+ this.channels = [...this.channels, channel];
+ 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/hi-ui/src/store/messages.js b/hi-ui/src/store/messages.js
new file mode 100644
index 0000000..560b9e1
--- /dev/null
+++ b/hi-ui/src/store/messages.js
@@ -0,0 +1,41 @@
+export class Messages {
+ constructor() {
+ this.channels = {};
+ }
+
+ inChannel(channel) {
+ return this.channels[channel] || [];
+ }
+
+ addMessage(message) {
+ let {
+ channel,
+ ...payload
+ } = message;
+ let channel_id = channel.id;
+ this.updateChannel(channel_id, (messages) => [...messages, payload]);
+ return this;
+ }
+
+ addMessages(channel, payloads) {
+ this.updateChannel(channel, (messages) => [...messages, ...payloads]);
+ return this;
+ }
+
+
+ deleteMessage(channel, message) {
+ let messages = this.messages(channel).filter((msg) => msg.message.id != message);
+ this.channels[channel] = messages;
+ }
+
+ 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;
+ }
+}