summaryrefslogtreecommitdiff
path: root/ui/lib
diff options
context:
space:
mode:
Diffstat (limited to 'ui/lib')
-rw-r--r--ui/lib/outbox.svelte.js46
1 files changed, 41 insertions, 5 deletions
diff --git a/ui/lib/outbox.svelte.js b/ui/lib/outbox.svelte.js
index 0681f29..de7f80e 100644
--- a/ui/lib/outbox.svelte.js
+++ b/ui/lib/outbox.svelte.js
@@ -1,12 +1,36 @@
import * as api from './apiServer.js';
import * as md from './markdown.js';
-class Message {
+class PostToChannel {
constructor(channel, body) {
this.channel = channel;
this.body = body;
this.renderedBody = md.render(body);
}
+
+ async send() {
+ return await api.retry(() => api.postToChannel(this.channel, this.body));
+ }
+}
+
+class DeleteMessage {
+ constructor(messageId) {
+ this.messageId = messageId;
+ }
+
+ async send() {
+ return await api.retry(() => api.deleteMessage(this.messageId));
+ }
+}
+
+class CreateChannel {
+ constructor(name) {
+ this.name = name;
+ }
+
+ async send() {
+ return await api.retry(() => api.createChannel(this.name));
+ }
}
export class Outbox {
@@ -20,11 +44,23 @@ export class Outbox {
this.pending = pending;
}
- send(channel, body) {
- this.pending.push(new Message(channel, body));
+ enqueue(operation) {
+ this.pending.push(operation);
this.start();
}
+ createChannel(name) {
+ this.enqueue(new CreateChannel(name));
+ }
+
+ postToChannel(channel, body) {
+ this.enqueue(new PostToChannel(channel, body));
+ }
+
+ deleteMessage(messageId) {
+ this.enqueue(new DeleteMessage(messageId));
+ }
+
start() {
if (this.sending) {
return;
@@ -38,9 +74,9 @@ export class Outbox {
async drain() {
while (this.pending.length > 0) {
- const { channel, body } = this.pending[0];
+ const operation = this.pending[0];
- await api.retry(() => api.postToChannel(channel, body));
+ await operation.send();
this.pending.shift();
}
}