about summary refs log tree commit diff
path: root/src/state/models/onboard.ts
diff options
context:
space:
mode:
authorPaul Frazee <pfrazee@gmail.com>2022-11-07 15:35:51 -0600
committerPaul Frazee <pfrazee@gmail.com>2022-11-07 15:35:51 -0600
commitd228a5f4f5d118f30129f3bafd676bfe0e80bf38 (patch)
treee292e9d3b1f7a027298308ef583a7d3b90b59157 /src/state/models/onboard.ts
parentb4097e25d67739c0ab6bc5b5f6ce8ee062796458 (diff)
downloadvoidsky-d228a5f4f5d118f30129f3bafd676bfe0e80bf38.tar.zst
Add onboarding (WIP)
Diffstat (limited to 'src/state/models/onboard.ts')
-rw-r--r--src/state/models/onboard.ts62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/state/models/onboard.ts b/src/state/models/onboard.ts
new file mode 100644
index 000000000..77a066332
--- /dev/null
+++ b/src/state/models/onboard.ts
@@ -0,0 +1,62 @@
+import {makeAutoObservable} from 'mobx'
+import {isObj, hasProp} from '../lib/type-guards'
+
+export const OnboardStage = {
+  Explainers: 'explainers',
+  Follows: 'follows',
+}
+
+export const OnboardStageOrder = [OnboardStage.Explainers, OnboardStage.Follows]
+
+export class OnboardModel {
+  isOnboarding: boolean = true
+  stage: string = OnboardStageOrder[0]
+
+  constructor() {
+    makeAutoObservable(this, {
+      serialize: false,
+      hydrate: false,
+    })
+  }
+
+  serialize(): unknown {
+    return {
+      isOnboarding: this.isOnboarding,
+      stage: this.stage,
+    }
+  }
+
+  hydrate(v: unknown) {
+    if (isObj(v)) {
+      if (hasProp(v, 'isOnboarding') && typeof v.isOnboarding === 'boolean') {
+        this.isOnboarding = v.isOnboarding
+      }
+      if (
+        hasProp(v, 'stage') &&
+        typeof v.stage === 'string' &&
+        OnboardStageOrder.includes(v.stage)
+      ) {
+        this.stage = v.stage
+      }
+    }
+  }
+
+  start() {
+    this.isOnboarding = true
+  }
+
+  stop() {
+    this.isOnboarding = false
+  }
+
+  next() {
+    if (!this.isOnboarding) return
+    let i = OnboardStageOrder.indexOf(this.stage)
+    i++
+    if (i >= OnboardStageOrder.length) {
+      this.isOnboarding = false
+    } else {
+      this.stage = OnboardStageOrder[i]
+    }
+  }
+}