diff options
author | Thomas F. K. Jorna <[email protected]> | 2021-07-14 15:10:31 +0200 |
---|---|---|
committer | Thomas F. K. Jorna <[email protected]> | 2021-07-14 15:10:31 +0200 |
commit | e5021187e96b78b53203bd95d08d6818aea47d17 (patch) | |
tree | 37ec45d00eb963db53cd4bb4f04a770414b351cc /app/models/root-store/setup-root-store.ts |
New Ignite 7.0.6 app
Diffstat (limited to 'app/models/root-store/setup-root-store.ts')
-rw-r--r-- | app/models/root-store/setup-root-store.ts | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/app/models/root-store/setup-root-store.ts b/app/models/root-store/setup-root-store.ts new file mode 100644 index 0000000..4a6d0c5 --- /dev/null +++ b/app/models/root-store/setup-root-store.ts @@ -0,0 +1,55 @@ +import { onSnapshot } from "mobx-state-tree" +import { RootStoreModel, RootStore } from "./root-store" +import { Environment } from "../environment" +import * as storage from "../../utils/storage" + +/** + * The key we'll be saving our state as within async storage. + */ +const ROOT_STATE_STORAGE_KEY = "root" + +/** + * Setup the environment that all the models will be sharing. + * + * The environment includes other functions that will be picked from some + * of the models that get created later. This is how we loosly couple things + * like events between models. + */ +export async function createEnvironment() { + const env = new Environment() + await env.setup() + return env +} + +/** + * Setup the root state. + */ +export async function setupRootStore() { + let rootStore: RootStore + let data: any + + // prepare the environment that will be associated with the RootStore. + const env = await createEnvironment() + try { + // load data from storage + data = (await storage.load(ROOT_STATE_STORAGE_KEY)) || {} + rootStore = RootStoreModel.create(data, env) + } catch (e) { + // if there's any problems loading, then let's at least fallback to an empty state + // instead of crashing. + rootStore = RootStoreModel.create({}, env) + + // but please inform us what happened + __DEV__ && console.tron.error(e.message, null) + } + + // reactotron logging + if (__DEV__) { + env.reactotron.setRootStore(rootStore, data) + } + + // track changes & save to storage + onSnapshot(rootStore, (snapshot) => storage.save(ROOT_STATE_STORAGE_KEY, snapshot)) + + return rootStore +} |