about summary refs log tree commit diff
path: root/src/state/models/ui/preferences.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/models/ui/preferences.ts')
-rw-r--r--src/state/models/ui/preferences.ts39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/state/models/ui/preferences.ts b/src/state/models/ui/preferences.ts
new file mode 100644
index 000000000..bffb2d89b
--- /dev/null
+++ b/src/state/models/ui/preferences.ts
@@ -0,0 +1,39 @@
+import {makeAutoObservable} from 'mobx'
+import {getLocales} from 'expo-localization'
+import {isObj, hasProp} from 'lib/type-guards'
+
+const deviceLocales = getLocales()
+
+export class PreferencesModel {
+  _contentLanguages: string[] | undefined
+
+  constructor() {
+    makeAutoObservable(this, {}, {autoBind: true})
+  }
+
+  // gives an array of BCP 47 language tags without region codes
+  get contentLanguages() {
+    if (this._contentLanguages) {
+      return this._contentLanguages
+    }
+    return deviceLocales.map(locale => locale.languageCode)
+  }
+
+  serialize() {
+    return {
+      contentLanguages: this._contentLanguages,
+    }
+  }
+
+  hydrate(v: unknown) {
+    if (isObj(v)) {
+      if (
+        hasProp(v, 'contentLanguages') &&
+        Array.isArray(v.contentLanguages) &&
+        typeof v.contentLanguages.every(item => typeof item === 'string')
+      ) {
+        this._contentLanguages = v.contentLanguages
+      }
+    }
+  }
+}