respond-framework
Version:
create as fast you think
99 lines (98 loc) • 2.63 kB
JavaScript
;
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();
}