Files
bsky-social-app/src/state/models/root-store.ts
T
2022-09-02 11:51:46 -05:00

58 lines
1.5 KiB
TypeScript

/**
* The root store is the base of all modeled state.
*/
import {makeAutoObservable} from 'mobx'
import {adx, AdxClient} from '@adxp/mock-api'
import {createContext, useContext} from 'react'
import {isObj, hasProp} from '../lib/type-guards'
import {SessionModel} from './session'
import {NavigationModel} from './navigation'
import {ShellModel} from './shell'
import {MeModel} from './me'
export class RootStoreModel {
session = new SessionModel()
nav = new NavigationModel()
shell = new ShellModel()
me = new MeModel(this)
constructor(public api: AdxClient) {
makeAutoObservable(this, {
api: false,
resolveName: false,
serialize: false,
hydrate: false,
})
}
async resolveName(didOrName: string) {
const userDb = this.api.mockDb.getUser(didOrName)
if (!userDb) throw new Error(`User not found: ${didOrName}`)
return userDb.did
}
serialize(): unknown {
return {
session: this.session.serialize(),
nav: this.nav.serialize(),
}
}
hydrate(v: unknown) {
if (isObj(v)) {
if (hasProp(v, 'session')) {
this.session.hydrate(v.session)
}
if (hasProp(v, 'nav')) {
this.nav.hydrate(v.nav)
}
}
}
}
const throwawayInst = new RootStoreModel(adx) // this will be replaced by the loader
const RootStoreContext = createContext<RootStoreModel>(throwawayInst)
export const RootStoreProvider = RootStoreContext.Provider
export const useStores = () => useContext(RootStoreContext)