64 lines
1.3 KiB
TypeScript
64 lines
1.3 KiB
TypeScript
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 = false
|
|
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
|
|
this.stage = OnboardStageOrder[0] // in case they make a new account
|
|
} else {
|
|
this.stage = OnboardStageOrder[i]
|
|
}
|
|
}
|
|
}
|