add button to reset preferences in dev mode

zio/stable
Ansh Nanda 2023-05-23 14:18:35 -07:00
parent 52a8879754
commit b561a51ed9
2 changed files with 47 additions and 0 deletions

View File

@ -63,6 +63,11 @@ export class PreferencesModel {
} }
} }
/**
* The function hydrates an object with properties related to content languages, labels, saved feeds,
* and pinned feeds that it gets from the parameter `v` (probably local storage)
* @param {unknown} v - the data object to hydrate from
*/
hydrate(v: unknown) { hydrate(v: unknown) {
if (isObj(v)) { if (isObj(v)) {
if ( if (
@ -95,6 +100,9 @@ export class PreferencesModel {
} }
} }
/**
* This function fetches preferences and sets defaults for missing items.
*/
async sync() { async sync() {
// fetch preferences // fetch preferences
let hasSavedFeedsPref = false let hasSavedFeedsPref = false
@ -153,6 +161,15 @@ export class PreferencesModel {
} }
} }
/**
* This function updates the preferences of a user and allows for a callback function to be executed
* before the update.
* @param cb - cb is a callback function that takes in a single parameter of type
* AppBskyActorDefs.Preferences and returns either a boolean or void. This callback function is used to
* update the preferences of the user. The function is called with the current preferences as an
* argument and if the callback returns false, the preferences are not updated.
* @returns void
*/
async update(cb: (prefs: AppBskyActorDefs.Preferences) => boolean | void) { async update(cb: (prefs: AppBskyActorDefs.Preferences) => boolean | void) {
const res = await this.rootStore.agent.app.bsky.actor.getPreferences({}) const res = await this.rootStore.agent.app.bsky.actor.getPreferences({})
if (cb(res.data.preferences) === false) { if (cb(res.data.preferences) === false) {
@ -163,6 +180,21 @@ export class PreferencesModel {
}) })
} }
/**
* This function resets the preferences to an empty array of no preferences.
*/
async reset() {
runInAction(() => {
this.contentLabels = new LabelPreferencesModel()
this.contentLanguages = deviceLocales.map(locale => locale.languageCode)
this.savedFeeds = []
this.pinnedFeeds = []
})
await this.rootStore.agent.app.bsky.actor.putPreferences({
preferences: [],
})
}
hasContentLanguage(code2: string) { hasContentLanguage(code2: string) {
return this.contentLanguages.includes(code2) return this.contentLanguages.includes(code2)
} }

View File

@ -141,6 +141,11 @@ export const SettingsScreen = withAuthRequired(
store.shell.openModal({name: 'delete-account'}) store.shell.openModal({name: 'delete-account'})
}, [store]) }, [store])
const onPressResetPreferences = React.useCallback(async () => {
await store.preferences.reset()
Toast.show('Preferences reset')
}, [store])
return ( return (
<View style={[s.hContentRegion]} testID="settingsScreen"> <View style={[s.hContentRegion]} testID="settingsScreen">
<ViewHeader title="Settings" /> <ViewHeader title="Settings" />
@ -393,6 +398,16 @@ export const SettingsScreen = withAuthRequired(
Storybook Storybook
</Text> </Text>
</Link> </Link>
{__DEV__ ? (
<Link
style={[pal.view, styles.linkCardNoIcon]}
onPress={onPressResetPreferences}
title="Debug tools">
<Text type="lg" style={pal.text}>
Reset preferences state
</Text>
</Link>
) : null}
<Text type="sm" style={[styles.buildInfo, pal.textLight]}> <Text type="sm" style={[styles.buildInfo, pal.textLight]}>
Build version {AppInfo.appVersion} ({AppInfo.buildVersion}) Build version {AppInfo.appVersion} ({AppInfo.buildVersion})
</Text> </Text>