diff options
author | Paul Frazee <pfrazee@gmail.com> | 2023-03-22 13:23:12 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-22 13:23:12 -0500 |
commit | 449f9243f3e58f684826e7d5830fc23deaa5c901 (patch) | |
tree | 14c5f16902c7156378a894690aa867b034489961 /src/state/models/ui/preferences.ts | |
parent | a369e079568fbe31e604235238169146e4495390 (diff) | |
download | voidsky-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.ts | 39 |
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 + } + } + } +} |