UNPKG

respond-framework

Version:
99 lines (98 loc) 2.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = require("react"); var _sliceBranch = require("../createModule/helpers/sliceBranch.js"); var _useSnapshot = require("../proxy/useSnapshot.js"); var _context = require("./context.js"); const createUseRespond = (id = createUniqueModuleId()) => { const useStore = () => { const { respond } = (0, _react.useContext)(_context.default); const { branchLocatorsById, branches } = respond; const branch = branchLocatorsById[id]; return branches[branch]; }; const useRespond = () => { const { respond } = (0, _react.useContext)(_context.default); const { branchLocatorsById, branches } = respond; const branch = branchLocatorsById[id]; const mod = branches[branch]; const { branchDep, branchDiff } = mod.respond; if (branchDep === undefined) return (0, _useSnapshot.default)(mod); const depMod = branches[branchDep]; const snap = (0, _useSnapshot.default)(depMod); return (0, _sliceBranch.default)(snap, branchDiff); }; const respond = (Component, name = Component.name) => { const { length } = Component; if (length <= 1) return Component; if (length === 3) { const { [name]: ComponentWithName } = { [name]: /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) { return Component(props, useRespond(), ref); }) }; return ComponentWithName; } const { [name]: ComponentWithName } = { [name]: function (props) { return Component(props, useRespond()); } }; return ComponentWithName; }; const useSubscribe = (subscriber, deps = [], allReductions) => { const state = useStore(); const { respond } = state; (0, _react.useEffect)(() => { subscriber(state); return respond.subscribe(subscriber, allReductions); }, [...deps, respond]); // trigger re-render on hmr }; const useListen = (listener, deps = []) => { const state = useStore(); const { respond } = state; (0, _react.useEffect)(() => { listener(state); return respond.listen(() => listener(state)); }, [...deps, respond]); }; return { id, useStore, useRespond, useSubscribe, useListen, respond: (...args) => /*#__PURE__*/(0, _react.memo)(respond(...args)) }; }; var _default = exports.default = createUseRespond; let idCounter = 0; function createUniqueModuleId() { return (idCounter++).toString(); }