Filter content by your device's configured languages (#354)

This commit is contained in:
Paul Frazee 2023-03-22 13:23:12 -05:00 committed by GitHub
parent a369e07956
commit 449f9243f3
9 changed files with 648 additions and 23 deletions

View file

@ -341,7 +341,9 @@ export class FeedModel {
return [
FeedTuner.dedupReposts,
FeedTuner.likedRepliesOnly,
FeedTuner.englishOnly,
FeedTuner.preferredLangOnly(
this.rootStore.preferences.contentLanguages,
),
]
}
if (this.feedType === 'home') {

View file

@ -16,6 +16,7 @@ import {ProfilesViewModel} from './profiles-view'
import {LinkMetasCache} from './cache/link-metas'
import {NotificationsViewItemModel} from './notifications-view'
import {MeModel} from './me'
import {PreferencesModel} from './ui/preferences'
import {resetToTab} from '../../Navigation'
import {ImageSizesCache} from './cache/image-sizes'
@ -33,6 +34,7 @@ export class RootStoreModel {
log = new LogModel()
session = new SessionModel(this)
shell = new ShellUiModel(this)
preferences = new PreferencesModel()
me = new MeModel(this)
profiles = new ProfilesViewModel(this)
linkMetas = new LinkMetasCache(this)
@ -83,6 +85,7 @@ export class RootStoreModel {
session: this.session.serialize(),
me: this.me.serialize(),
shell: this.shell.serialize(),
preferences: this.preferences.serialize(),
}
}
@ -103,6 +106,9 @@ export class RootStoreModel {
if (hasProp(v, 'shell')) {
this.shell.hydrate(v.shell)
}
if (hasProp(v, 'preferences')) {
this.preferences.hydrate(v.preferences)
}
}
}

View file

@ -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
}
}
}
}