ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
33 lines • 1.54 kB
JavaScript
import { useState, useEffect } from 'react';
import isEqual from 'lodash/isEqual';
import { useEvent } from '../util';
import { useStoreContext } from './useStoreContext';
function useStore(key, defaultValue) {
var _a = useStoreContext(), getItem = _a.getItem, setItem = _a.setItem, subscribe = _a.subscribe;
var _b = useState(function () { return getItem(key, defaultValue); }), value = _b[0], setValue = _b[1];
// subscribe to changes on this key, and change the state when they happen
useEffect(function () {
var storedValue = getItem(key, defaultValue);
if (!isEqual(value, storedValue)) {
setValue(storedValue);
}
var unsubscribe = subscribe(key, function (newValue) {
setValue(typeof newValue === 'undefined' ? defaultValue : newValue);
});
return function () { return unsubscribe(); };
}, [key, subscribe, defaultValue, getItem, value]);
var set = useEvent(function (valueParam, runtimeDefaultValue) {
var newValue = typeof valueParam === 'function' ? valueParam(value) : valueParam;
// we only set the value in the Store;
// the value in the local state will be updated
// by the useEffect during the next render
setItem(key, typeof newValue === 'undefined'
? typeof runtimeDefaultValue === 'undefined'
? defaultValue
: runtimeDefaultValue
: newValue);
});
return [value, set];
}
export { useStore };
//# sourceMappingURL=useStore.js.map