@liuyunjs/constate
Version:
Yet another React state management library that lets you work with local state and scale up to global state with ease
112 lines (83 loc) • 2.64 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
// ^^^^^^^^^^^^^^^^^^^^
var isDev = process.env.NODE_ENV !== 'production';
var NO_PROVIDER = {};
function createUseContext(context) {
return function () {
var value = React.useContext(context);
if (isDev && value === NO_PROVIDER) {
console.warn('Component must be wrapped with Provider.');
}
return value;
};
}
function constate(useValue) {
for (var _len = arguments.length, selectors = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
selectors[_key - 1] = arguments[_key];
}
var contexts = [];
var hooks = [];
var createContext = function createContext(displayName) {
var context = /*#__PURE__*/React.createContext(NO_PROVIDER);
if (isDev && displayName) {
context.displayName = displayName;
}
contexts.push(context);
hooks.push(createUseContext(context));
};
if (selectors.length) {
selectors.forEach(function (selector) {
return createContext(selector.name);
});
} else {
createContext(useValue.name);
}
var ConstateProviderBase = function ConstateProviderBase(_ref) {
var value = _ref.value,
children = _ref.children;
var element = children;
for (var i = 0; i < contexts.length; i += 1) {
var context = contexts[i];
var selector = selectors[i] || function (v) {
return v;
};
element = /*#__PURE__*/React.createElement(context.Provider, {
value: selector(value)
}, element);
}
return element;
};
var ConstateProvider = function ConstateProvider(_ref2) {
var children = _ref2.children,
props = _objectWithoutPropertiesLoose(_ref2, ["children"]);
return /*#__PURE__*/React.createElement(ConstateProviderBase, {
value: useValue(props)
}, children);
};
ConstateProvider.useProvider = function (props) {
var value = useValue(props);
var inject = function inject(element) {
return /*#__PURE__*/React.createElement(ConstateProviderBase, {
value: value
}, element);
};
return [inject, value];
};
return [ConstateProvider].concat(hooks);
}
exports.constate = constate;
exports.default = constate;