UNPKG

react-principal

Version:

A state management with react context for apps which using hooks.

74 lines 2.87 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useContextWithObserve = exports.calculateChangedBits = void 0; const react_1 = __importDefault(require("react")); //@ts-ignore const invariant_1 = __importDefault(require("invariant")); const utils_1 = require("./utils"); function useContextWithObserve(context, initialState, nextObserveState) { const stateKeys = getKeys(initialState); // default observe to whole state let observeKeys = stateKeys; if (nextObserveState) { if (utils_1.__DEV__) { invariant_1.default(Array.isArray(nextObserveState), `useState: nextObserveState expected to be an Array of string but ${typeof nextObserveState} was received`); nextObserveState.forEach((observeKey) => { invariant_1.default(stateKeys.includes(observeKey), `useState: nextObserveState expected to be an Array of state keys but ${observeKey} is not one of the state`); }); } observeKeys = nextObserveState.sort(); } const observeBit = getBits(stateKeys, observeKeys); return readContext(context, observeBit); } exports.useContextWithObserve = useContextWithObserve; function getKeys(obj) { return Object.keys(obj).sort(); } function calculateChangedBits(prev, next) { let changed = {}; const keys = getKeys(next); if (utils_1.__DEV__) { invariant_1.default(keys.length < 32, `expected return state have property least than 32 but has ${keys.length} property`); } keys.forEach((key) => { if (prev[key] !== next[key]) { changed[key] = next[key]; } }); const changedKeys = getKeys(changed); const result = getBits(keys, changedKeys); return result; } exports.calculateChangedBits = calculateChangedBits; function getBits(keys, usage) { let result = 0; /** * @param {string} key * @param {number} index */ keys.forEach((key, index) => { if (usage.includes(key)) { // eslint-disable-next-line no-bitwise result |= 1 << index % 31; } }); return result; } const ReactCurrentDispatcher = // @ts-ignore react_1.default.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED .ReactCurrentDispatcher; function readContext(Context, observedBits) { const dispatcher = ReactCurrentDispatcher.current; if (dispatcher === null) { throw new Error("react-principal: useState and useDispatch may only be called from within a " + "component's render. They are not supported in event handlers or " + "lifecycle methods."); } return dispatcher.readContext(Context, observedBits); } //# sourceMappingURL=observe.js.map