// @flow import {AsyncStorage} from "react-native"; /** * Static class used to manage preferences. * Preferences are fetched at the start of the app and saved in an instance object. * This allows for a synchronous access to saved data. */ export default class AsyncStorageManager { static instance: AsyncStorageManager | null = null; /** * Get this class instance or create one if none is found * @returns {ThemeManager} */ static getInstance(): AsyncStorageManager { return AsyncStorageManager.instance === null ? AsyncStorageManager.instance = new AsyncStorageManager() : AsyncStorageManager.instance; } // Object storing preferences keys, default and current values for use in the app preferences = { showIntro: { key: 'showIntro', default: '1', current: '', }, proxiwashNotifications: { key: 'proxiwashNotifications', default: '5', current: '', }, proxiwashWatchedMachines: { key: 'proxiwashWatchedMachines', default: '[]', current: '', }, nightMode: { key: 'nightMode', default: '0', current: '', }, expoToken: { key: 'expoToken', default: '', current: '', }, debugUnlocked: { key: 'debugUnlocked', default: '0', current: '', }, defaultStartScreen: { key: 'defaultStartScreen', default: 'Home', current: '', } }; /** * Set preferences object current values from AsyncStorage. * This function should be called at the app's start. * * @return {Promise} */ async loadPreferences() { let prefKeys = []; // Get all available keys for (let [key, value] of Object.entries(this.preferences)) { prefKeys.push(value.key); } // Get corresponding values let resultArray: Array> = await AsyncStorage.multiGet(prefKeys); // Save those values for later use for (let i = 0; i < resultArray.length; i++) { let key: string = resultArray[i][0]; let val: string | null = resultArray[i][1]; if (val === null) val = this.preferences[key].default; this.preferences[key].current = val; } } /** * Save the value associated to the given key to preferences. * This updates the preferences object and saves it to AsynStorage. * * @param key * @param val */ savePref(key: string, val: string) { this.preferences[key].current = val; AsyncStorage.setItem(key, val); } }