ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
38 lines • 1.78 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useStore = useStore;
const react_1 = require("react");
const isEqual_js_1 = __importDefault(require("lodash/isEqual.js"));
const util_1 = require("../util/index.cjs");
const useStoreContext_1 = require("./useStoreContext.cjs");
function useStore(key, defaultValue) {
const { getItem, setItem, subscribe } = (0, useStoreContext_1.useStoreContext)();
const [value, setValue] = (0, react_1.useState)(() => getItem(key, defaultValue));
// subscribe to changes on this key, and change the state when they happen
(0, react_1.useEffect)(() => {
const storedValue = getItem(key, defaultValue);
if (!(0, isEqual_js_1.default)(value, storedValue)) {
setValue(storedValue);
}
const unsubscribe = subscribe(key, newValue => {
setValue(typeof newValue === 'undefined' ? defaultValue : newValue);
});
return () => unsubscribe();
}, [key, subscribe, defaultValue, getItem, value]);
const set = (0, util_1.useEvent)((valueParam, runtimeDefaultValue) => {
const 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];
}
//# sourceMappingURL=useStore.js.map