react-hooks-simple-global-state
Version:
Simple global state for React with Hooks, which just depends on React's useEffect and useState.
57 lines (56 loc) • 2.18 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.useAsyncGlobalState = exports.useGlobalState = void 0;
const react_1 = require("react");
const globalState = {};
const rerender = (v) => (v % 999) + 1;
const useGlobalState = (stateName, initValue, listening = true) => {
const [, setCurrentState] = (0, react_1.useState)(0);
let state = globalState[stateName];
if (!state) {
state = {
value: initValue,
statesListening: new Set(),
set(newValue) {
const oldValue = state.value;
state.value = newValue instanceof Function ? newValue(oldValue) : newValue;
if (state.value !== oldValue) {
state.statesListening.forEach((setState) => setState(rerender));
}
},
};
globalState[stateName] = state;
}
(0, react_1.useEffect)(() => {
if (listening)
state.statesListening.add(setCurrentState);
return () => {
state.statesListening.delete(setCurrentState);
};
}, [state.statesListening, listening]);
return [state.value, state.set];
};
exports.useGlobalState = useGlobalState;
exports.default = exports.useGlobalState;
const getInitAsyncData = () => ({
loading: true,
refetch: () => { },
});
const useAsyncGlobalState = (stateName, funcLoadAsyncData) => {
const [asyncData, setAsyncData] = (0, exports.useGlobalState)(`async_${stateName}`, getInitAsyncData());
(0, react_1.useEffect)(() => {
if (asyncData.initialized || !funcLoadAsyncData)
return;
asyncData.initialized = true;
const newAsyncData = {
loading: false,
initialized: true,
refetch: () => setAsyncData(getInitAsyncData()),
};
funcLoadAsyncData()
.then((data) => setAsyncData(Object.assign(Object.assign({}, newAsyncData), { data })))
.catch((error) => setAsyncData(Object.assign(Object.assign({}, newAsyncData), { error })));
}, [asyncData.initialized]);
return asyncData;
};
exports.useAsyncGlobalState = useAsyncGlobalState;
;