create onboarding model

zio/stable
Ansh Nanda 2023-08-25 14:36:10 -07:00
parent 37a70f0a67
commit 08fe7fb084
2 changed files with 69 additions and 0 deletions

View File

@ -0,0 +1,63 @@
import {makeAutoObservable} from 'mobx'
import {RootStoreModel} from '../root-store'
import {NavigationProp} from 'lib/routes/types'
import {hasProp} from 'lib/type-guards'
enum OnboardingStep {
WELCOME = 'WELCOME',
BROWSE_FEEDS = 'BROWSE_FEEDS',
COMPLETE = 'COMPLETE',
}
export class OnboardingModel {
// state
step: OnboardingStep
constructor(public rootStore: RootStoreModel) {
makeAutoObservable(this, {rootStore: false})
this.step = OnboardingStep.WELCOME
}
serialize() {
return {
step: this.step,
}
}
hydrate(v: unknown) {
if (typeof v === 'object' && v !== null) {
if (hasProp(v, 'step') && typeof v.step === 'string') {
this.step = v.step as OnboardingStep
}
}
}
nextStep(navigation?: NavigationProp) {
switch (this.step) {
case OnboardingStep.WELCOME:
this.step = OnboardingStep.COMPLETE
break
case OnboardingStep.BROWSE_FEEDS:
this.step = OnboardingStep.COMPLETE
break
case OnboardingStep.COMPLETE:
if (!navigation) {
throw new Error('Navigation prop required to complete onboarding')
}
this.complete(navigation)
break
}
}
complete(navigation: NavigationProp) {
navigation.navigate('Home')
}
reset() {
this.step = OnboardingStep.WELCOME
}
get isComplete() {
return this.step === OnboardingStep.COMPLETE
}
}

View File

@ -27,6 +27,7 @@ import {reset as resetNavigation} from '../../Navigation'
// remove after backend testing finishes
// -prf
import {applyDebugHeader} from 'lib/api/debug-appview-proxy-header'
import {OnboardingModel} from './discovery/onboarding'
export const appInfo = z.object({
build: z.string(),
@ -44,6 +45,7 @@ export class RootStoreModel {
shell = new ShellUiModel(this)
preferences = new PreferencesModel(this)
me = new MeModel(this)
onboarding = new OnboardingModel(this)
invitedUsers = new InvitedUsers(this)
handleResolutions = new HandleResolutionsCache()
profiles = new ProfilesCache(this)
@ -70,6 +72,7 @@ export class RootStoreModel {
appInfo: this.appInfo,
session: this.session.serialize(),
me: this.me.serialize(),
onboarding: this.onboarding.serialize(),
shell: this.shell.serialize(),
preferences: this.preferences.serialize(),
invitedUsers: this.invitedUsers.serialize(),
@ -88,6 +91,9 @@ export class RootStoreModel {
if (hasProp(v, 'me')) {
this.me.hydrate(v.me)
}
if (hasProp(v, 'onboarding')) {
this.onboarding.hydrate(v.onboarding)
}
if (hasProp(v, 'session')) {
this.session.hydrate(v.session)
}