UNPKG

@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
'use strict'; 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;