diff options
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 + } + } + } +} |