about summary refs log tree commit diff
path: root/src/state/models/ui/preferences.ts
diff options
context:
space:
mode:
authorPaul Frazee <pfrazee@gmail.com>2023-03-22 13:23:12 -0500
committerGitHub <noreply@github.com>2023-03-22 13:23:12 -0500
commit449f9243f3e58f684826e7d5830fc23deaa5c901 (patch)
tree14c5f16902c7156378a894690aa867b034489961 /src/state/models/ui/preferences.ts
parenta369e079568fbe31e604235238169146e4495390 (diff)
downloadvoidsky-449f9243f3e58f684826e7d5830fc23deaa5c901.tar.zst
Filter content by your device's configured languages (#354)
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
+      }
+    }
+  }
+}