about summary refs log tree commit diff
path: root/src/state/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/index.ts')
-rw-r--r--src/state/index.ts30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/state/index.ts b/src/state/index.ts
new file mode 100644
index 000000000..7c97ce294
--- /dev/null
+++ b/src/state/index.ts
@@ -0,0 +1,30 @@
+import {onSnapshot} from 'mobx-state-tree'
+import {RootStoreModel, RootStore} from './models/root-store'
+import {Environment} from './env'
+import * as storage from './storage'
+
+const ROOT_STATE_STORAGE_KEY = 'root'
+
+export async function setupState() {
+  let rootStore: RootStore
+  let data: any
+
+  const env = new Environment()
+  try {
+    data = (await storage.load(ROOT_STATE_STORAGE_KEY)) || {}
+    rootStore = RootStoreModel.create(data, env)
+  } catch (e) {
+    console.error('Failed to load state from storage', e)
+    rootStore = RootStoreModel.create({}, env)
+  }
+
+  // track changes & save to storage
+  onSnapshot(rootStore, snapshot =>
+    storage.save(ROOT_STATE_STORAGE_KEY, snapshot),
+  )
+
+  return rootStore
+}
+
+export {useStores, RootStoreModel, RootStoreProvider} from './models/root-store'
+export type {RootStore} from './models/root-store'