summaryrefslogtreecommitdiff
path: root/app/models/root-store/setup-root-store.ts
diff options
context:
space:
mode:
authorThomas F. K. Jorna <[email protected]>2021-07-14 15:10:31 +0200
committerThomas F. K. Jorna <[email protected]>2021-07-14 15:10:31 +0200
commite5021187e96b78b53203bd95d08d6818aea47d17 (patch)
tree37ec45d00eb963db53cd4bb4f04a770414b351cc /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.ts55
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
+}