diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2025-03-23 14:33:07 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2025-03-23 14:33:07 -0400 |
| commit | 876472299d67f8fe3a789b7777b9d8ee44297b23 (patch) | |
| tree | db62f5d1e15d871f8a73ce20b40cd53053d12f85 /ui/lib/state/remote/state.svelte.js | |
| parent | fa0f653f141efee3f5a01e1fa696d29140ec12c2 (diff) | |
| parent | f788ea84e25a4f7216ca0604aeb216346403b6ef (diff) | |
Merge branch 'prop/restartable-state'
Diffstat (limited to 'ui/lib/state/remote/state.svelte.js')
| -rw-r--r-- | ui/lib/state/remote/state.svelte.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/ui/lib/state/remote/state.svelte.js b/ui/lib/state/remote/state.svelte.js new file mode 100644 index 0000000..c4daf17 --- /dev/null +++ b/ui/lib/state/remote/state.svelte.js @@ -0,0 +1,89 @@ +import { Logins } from './logins.svelte.js'; +import { Channels } from './channels.svelte.js'; +import { Messages } from './messages.svelte.js'; + +export class State { + currentUser = $state(); + logins = $state(); + channels = $state(); + messages = $state(); + + static boot({ currentUser, logins, channels, messages, resumePoint }) { + return new State({ + currentUser, + logins: Logins.boot(logins), + channels: Channels.boot(channels), + messages: Messages.boot(messages), + resumePoint + }); + } + + constructor({ currentUser, logins, channels, messages, resumePoint }) { + this.currentUser = currentUser; + this.logins = logins; + this.channels = channels; + this.messages = messages; + this.resumePoint = resumePoint; + } + + onEvent(event) { + switch (event.type) { + case 'channel': + return this.onChannelEvent(event); + case 'login': + return this.onLoginEvent(event); + case 'message': + return this.onMessageEvent(event); + } + } + + onChannelEvent(event) { + switch (event.event) { + case 'created': + return this.onChannelCreated(event); + case 'deleted': + return this.onChannelDeleted(event); + } + } + + onChannelCreated(event) { + const { id, name } = event; + this.channels.add({ id, name }); + } + + onChannelDeleted(event) { + const { id } = event; + this.channels.remove(id); + } + + onLoginEvent(event) { + switch (event.event) { + case 'created': + return this.onLoginCreated(event); + } + } + + onLoginCreated(event) { + const { id, name } = event; + this.logins.add({ id, name }); + } + + onMessageEvent(event) { + switch (event.event) { + case 'sent': + return this.onMessageSent(event); + case 'deleted': + return this.onMessageDeleted(event); + } + } + + onMessageSent(event) { + const { id, at, channel, sender, body } = event; + this.messages.add({ id, at, channel, sender, body }); + } + + onMessageDeleted(event) { + const { id } = event; + this.messages.remove(id); + } +} |
