UNPKG

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
"use strict"; 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;