diff options
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); + } +} |
