Skip to content

Instantly share code, notes, and snippets.

@vuongngo
Created January 9, 2020 07:32
Show Gist options
  • Save vuongngo/bea2d87dbd4eef023b4a9dfda231db0f to your computer and use it in GitHub Desktop.
Save vuongngo/bea2d87dbd4eef023b4a9dfda231db0f to your computer and use it in GitHub Desktop.
const config = {
key: '@session',
transform: {
in: ({ name }) => ({ name }),
out: ({ name }) => ({ name, avatarUrl: '' })
}
}
const useStorage = (state, setState) => {
const [rehydrated, setRehydrated] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
localforage.getItem(config.key, (err, value) => {
if (err) {
setRehydrated(true);
return setError(err);
}
// transform data to persist
let restoredValue = rehydrated(value);
if (typeof config.transform?.out === 'function') {
restoredValue = config.transform.out(restoredValue);
}
setState(restoredValue);
setRehydrated(true);
});
}, []);
useEffect(() => {
if (isNil(state) || isEmpty(state)) {
localforage.removeItem(config.key);
}
// transform persisted data to state
let data;
if (typeof config.transform?.in === 'function') {
data = config.transform.in(state);
}
localforage.setItem(config.key, hydrate(data));
}, [state]);
return {
rehydrated,
error,
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment