Add context async storage logic
This isn't implemented yet, but the necessary files are here
This commit is contained in:
parent
d55c692bd3
commit
1d2ec83619
6 changed files with 268 additions and 6 deletions
8
package-lock.json
generated
8
package-lock.json
generated
|
@ -1998,10 +1998,10 @@
|
|||
"fastq": "^1.6.0"
|
||||
}
|
||||
},
|
||||
"@react-native-community/async-storage": {
|
||||
"version": "1.12.1",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.12.1.tgz",
|
||||
"integrity": "sha512-70WGaH3PKYASi4BThuEEKMkyAgE9k7VytBqmgPRx3MzJx9/MkspwqJGmn3QLCgHLIFUgF1pit2mWICbRJ3T3lg==",
|
||||
"@react-native-async-storage/async-storage": {
|
||||
"version": "1.15.4",
|
||||
"resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.15.4.tgz",
|
||||
"integrity": "sha512-pC0MS6UBuv/YiVAxtzi7CgUed8oCQNYMtGt0yb/I9fI/BWTiJK5cj4YtW2XtL95K5IuvPX/6uGWaouZ8KqXwdg==",
|
||||
"requires": {
|
||||
"deep-assign": "^3.0.0"
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@nartc/react-native-barcode-mask": "1.2.0",
|
||||
"@react-native-community/async-storage": "1.12.1",
|
||||
"@react-native-async-storage/async-storage": "^1.15.4",
|
||||
"@react-native-community/masked-view": "0.1.11",
|
||||
"@react-native-community/push-notification-ios": "1.8.0",
|
||||
"@react-native-community/slider": "3.0.3",
|
||||
|
|
67
src/components/providers/PreferencesProvider.tsx
Normal file
67
src/components/providers/PreferencesProvider.tsx
Normal file
|
@ -0,0 +1,67 @@
|
|||
import React, { useState } from 'react';
|
||||
import {
|
||||
defaultPreferences,
|
||||
PreferenceKeys,
|
||||
PreferencesType,
|
||||
setPreference,
|
||||
} from '../../utils/asyncStorage';
|
||||
import {
|
||||
PreferencesContext,
|
||||
PreferencesContextType,
|
||||
} from '../../utils/preferencesContext';
|
||||
|
||||
type Props = {
|
||||
children: React.ReactChild;
|
||||
initialPreferences: PreferencesType;
|
||||
};
|
||||
|
||||
export default function PreferencesProvider(props: Props) {
|
||||
const updatePreferences = (
|
||||
key: PreferenceKeys,
|
||||
value: number | string | boolean | object | Array<any>
|
||||
) => {
|
||||
setPreferencesState((prevState) => {
|
||||
const prevPreferences = { ...prevState.preferences };
|
||||
const newPrefs = setPreference(key, value, prevPreferences);
|
||||
const newSate = {
|
||||
...prevState,
|
||||
preferences: { ...newPrefs },
|
||||
};
|
||||
return newSate;
|
||||
});
|
||||
};
|
||||
|
||||
const resetPreferences = () => {
|
||||
setPreferencesState((prevState) => {
|
||||
const prevPreferences = { ...prevState.preferences };
|
||||
let newPreferences = { ...prevPreferences };
|
||||
Object.values(PreferenceKeys).forEach((key) => {
|
||||
newPreferences = setPreference(
|
||||
key,
|
||||
defaultPreferences[key],
|
||||
prevPreferences
|
||||
);
|
||||
});
|
||||
const newSate = {
|
||||
...prevState,
|
||||
preferences: { ...newPreferences },
|
||||
};
|
||||
return newSate;
|
||||
});
|
||||
};
|
||||
|
||||
const [
|
||||
preferencesState,
|
||||
setPreferencesState,
|
||||
] = useState<PreferencesContextType>({
|
||||
preferences: { ...props.initialPreferences },
|
||||
updatePreferences: updatePreferences,
|
||||
resetPreferences: resetPreferences,
|
||||
});
|
||||
|
||||
return (
|
||||
<PreferencesContext.Provider value={preferencesState}>
|
||||
{props.children}
|
||||
</PreferencesContext.Provider>
|
||||
);
|
||||
}
|
|
@ -17,7 +17,7 @@
|
|||
* along with Campus INSAT. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import AsyncStorage from '@react-native-community/async-storage';
|
||||
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||
import { SERVICES_KEY } from './ServicesManager';
|
||||
|
||||
/**
|
||||
|
|
170
src/utils/asyncStorage.ts
Normal file
170
src/utils/asyncStorage.ts
Normal file
|
@ -0,0 +1,170 @@
|
|||
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||
import { SERVICES_KEY } from '../managers/ServicesManager';
|
||||
|
||||
export enum PreferenceKeys {
|
||||
debugUnlocked = 'debugUnlocked',
|
||||
showIntro = 'showIntro',
|
||||
updateNumber = 'updateNumber',
|
||||
proxiwashNotifications = 'proxiwashNotifications',
|
||||
nightModeFollowSystem = 'nightModeFollowSystem',
|
||||
nightMode = 'nightMode',
|
||||
defaultStartScreen = 'defaultStartScreen',
|
||||
servicesShowMascot = 'servicesShowMascot',
|
||||
proxiwashShowMascot = 'proxiwashShowMascot',
|
||||
homeShowMascot = 'homeShowMascot',
|
||||
eventsShowMascot = 'eventsShowMascot',
|
||||
planexShowMascot = 'planexShowMascot',
|
||||
loginShowMascot = 'loginShowMascot',
|
||||
voteShowMascot = 'voteShowMascot',
|
||||
equipmentShowMascot = 'equipmentShowMascot',
|
||||
gameStartMascot = 'gameStartMascot',
|
||||
proxiwashWatchedMachines = 'proxiwashWatchedMachines',
|
||||
showAprilFoolsStart = 'showAprilFoolsStart',
|
||||
planexCurrentGroup = 'planexCurrentGroup',
|
||||
planexFavoriteGroups = 'planexFavoriteGroups',
|
||||
dashboardItems = 'dashboardItems',
|
||||
gameScores = 'gameScores',
|
||||
selectedWash = 'selectedWash',
|
||||
}
|
||||
|
||||
export type PreferencesType = { [key in PreferenceKeys]: string };
|
||||
|
||||
export const defaultPreferences: { [key in PreferenceKeys]: string } = {
|
||||
[PreferenceKeys.debugUnlocked]: '0',
|
||||
[PreferenceKeys.showIntro]: '1',
|
||||
[PreferenceKeys.updateNumber]: '0',
|
||||
[PreferenceKeys.proxiwashNotifications]: '5',
|
||||
[PreferenceKeys.nightModeFollowSystem]: '1',
|
||||
[PreferenceKeys.nightMode]: '1',
|
||||
[PreferenceKeys.defaultStartScreen]: 'home',
|
||||
[PreferenceKeys.servicesShowMascot]: '1',
|
||||
[PreferenceKeys.proxiwashShowMascot]: '1',
|
||||
[PreferenceKeys.homeShowMascot]: '1',
|
||||
[PreferenceKeys.eventsShowMascot]: '1',
|
||||
[PreferenceKeys.planexShowMascot]: '1',
|
||||
[PreferenceKeys.loginShowMascot]: '1',
|
||||
[PreferenceKeys.voteShowMascot]: '1',
|
||||
[PreferenceKeys.equipmentShowMascot]: '1',
|
||||
[PreferenceKeys.gameStartMascot]: '1',
|
||||
[PreferenceKeys.proxiwashWatchedMachines]: '[]',
|
||||
[PreferenceKeys.showAprilFoolsStart]: '1',
|
||||
[PreferenceKeys.planexCurrentGroup]: '',
|
||||
[PreferenceKeys.planexFavoriteGroups]: '[]',
|
||||
[PreferenceKeys.dashboardItems]: JSON.stringify([
|
||||
SERVICES_KEY.EMAIL,
|
||||
SERVICES_KEY.WASHERS,
|
||||
SERVICES_KEY.PROXIMO,
|
||||
SERVICES_KEY.TUTOR_INSA,
|
||||
SERVICES_KEY.RU,
|
||||
]),
|
||||
[PreferenceKeys.gameScores]: '[]',
|
||||
[PreferenceKeys.selectedWash]: 'washinsa',
|
||||
};
|
||||
|
||||
/**
|
||||
* Set preferences object current values from AsyncStorage.
|
||||
* This function should be called once on start.
|
||||
*
|
||||
* @return {Promise<PreferencesType>}
|
||||
*/
|
||||
export function retrievePreferences(
|
||||
keys: Array<PreferenceKeys>,
|
||||
defaults: PreferencesType
|
||||
): Promise<PreferencesType> {
|
||||
return new Promise((resolve: (preferences: PreferencesType) => void) => {
|
||||
AsyncStorage.multiGet(Object.values(keys))
|
||||
.then((result) => {
|
||||
const preferences = { ...defaults };
|
||||
result.forEach((item) => {
|
||||
let [key, value] = item;
|
||||
if (value !== null) {
|
||||
preferences[key as PreferenceKeys] = value;
|
||||
}
|
||||
});
|
||||
resolve(preferences);
|
||||
})
|
||||
.catch(() => resolve(defaults));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the value associated to the given key to preferences.
|
||||
* This updates the preferences object and saves it to AsyncStorage.
|
||||
*
|
||||
* @param key
|
||||
* @param value
|
||||
*/
|
||||
export function setPreference(
|
||||
key: PreferenceKeys,
|
||||
value: number | string | boolean | object | Array<any>,
|
||||
prevPreferences: PreferencesType
|
||||
): PreferencesType {
|
||||
let convertedValue: string;
|
||||
if (typeof value === 'string') {
|
||||
convertedValue = value;
|
||||
} else if (typeof value === 'boolean' || typeof value === 'number') {
|
||||
convertedValue = value.toString();
|
||||
} else {
|
||||
convertedValue = JSON.stringify(value);
|
||||
}
|
||||
prevPreferences[key] = convertedValue;
|
||||
AsyncStorage.setItem(key, convertedValue)
|
||||
.then(undefined)
|
||||
.catch(() => console.debug('save error: ' + convertedValue));
|
||||
return prevPreferences;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the boolean value of the given preference
|
||||
*
|
||||
* @param key
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function getPreferenceString(
|
||||
key: PreferenceKeys,
|
||||
preferences: PreferencesType
|
||||
): string | undefined {
|
||||
return preferences[key];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the boolean value of the given preference
|
||||
*
|
||||
* @param key
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function getPreferenceBool(
|
||||
key: PreferenceKeys,
|
||||
preferences: PreferencesType
|
||||
): boolean | undefined {
|
||||
const value = preferences[key];
|
||||
return value ? value === '1' || value === 'true' : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number value of the given preference
|
||||
*
|
||||
* @param key
|
||||
* @returns {number}
|
||||
*/
|
||||
export function getPreferenceNumber(
|
||||
key: PreferenceKeys,
|
||||
preferences: PreferencesType
|
||||
): number | undefined {
|
||||
const value = preferences[key];
|
||||
return value !== undefined ? parseFloat(value) : undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the object value of the given preference
|
||||
*
|
||||
* @param key
|
||||
* @returns {{...}}
|
||||
*/
|
||||
export function getPreferenceObject(
|
||||
key: PreferenceKeys,
|
||||
preferences: PreferencesType
|
||||
): object | Array<any> | undefined {
|
||||
const value = preferences[key];
|
||||
return value ? JSON.parse(value) : undefined;
|
||||
}
|
25
src/utils/preferencesContext.ts
Normal file
25
src/utils/preferencesContext.ts
Normal file
|
@ -0,0 +1,25 @@
|
|||
import React, { useContext } from 'react';
|
||||
import {
|
||||
defaultPreferences,
|
||||
PreferenceKeys,
|
||||
PreferencesType,
|
||||
} from './asyncStorage';
|
||||
|
||||
export type PreferencesContextType = {
|
||||
preferences: PreferencesType;
|
||||
updatePreferences: (
|
||||
key: PreferenceKeys,
|
||||
value: number | string | boolean | object | Array<any>
|
||||
) => void;
|
||||
resetPreferences: () => void;
|
||||
};
|
||||
|
||||
export const PreferencesContext = React.createContext<PreferencesContextType>({
|
||||
preferences: defaultPreferences,
|
||||
updatePreferences: () => undefined,
|
||||
resetPreferences: () => undefined,
|
||||
});
|
||||
|
||||
export function usePreferences() {
|
||||
return useContext(PreferencesContext);
|
||||
}
|
Loading…
Reference in a new issue