UNPKG

react-singleton-hook

Version:
96 lines (93 loc) 4.95 kB
"use strict"; exports.__esModule = true; exports.resetLocalStateForTests = exports.addHook = exports.SingletonHooksContainer = void 0; var _react = _interopRequireWildcard(require("react")); var _SingleItemContainer = require("./SingleItemContainer"); var _env = require("../utils/env"); var _warning = require("../utils/warning"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var nextKey = 1; var automaticRender = false; var manualRender = false; var workingSet = []; var renderedContainers = []; var notifyContainersAsync = function notifyContainersAsync() { renderedContainers.forEach(function (updateRenderedHooks) { return updateRenderedHooks(); }); }; var SingletonHooksContainer = function SingletonHooksContainer(_ref) { var automaticContainerInternalUseOnly = _ref.automaticContainerInternalUseOnly; var _useState = (0, _react.useState)([]), hooks = _useState[0], setHooks = _useState[1]; var currentHooksRef = (0, _react.useRef)(); currentHooksRef.current = hooks; // if there was no automaticRender, and this one is not automatic as well if (!automaticContainerInternalUseOnly && automaticRender === false) { manualRender = true; } (0, _react.useEffect)(function () { var mounted = true; function updateRenderedHooks() { if (!mounted) return; if (renderedContainers[0] !== updateRenderedHooks) { if (!automaticContainerInternalUseOnly && automaticRender === true) { (0, _warning.warning)('SingletonHooksContainer is mounted after some singleton hook has been used.' + 'Your SingletonHooksContainer will not be used in favor of internal one.'); } setHooks(function (_) { return []; }); return; } setHooks([].concat(workingSet)); } renderedContainers.push(updateRenderedHooks); notifyContainersAsync(); return function () { mounted = false; if (currentHooksRef.current.length > 0) { (0, _warning.warning)('SingletonHooksContainer is unmounted, but it has active singleton hooks. ' + 'They will be reevaluated once SingletonHooksContainer is mounted again'); } renderedContainers.splice(renderedContainers.indexOf(updateRenderedHooks), 1); notifyContainersAsync(); }; }, [automaticContainerInternalUseOnly]); return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, hooks.map(function (_ref2) { var hook = _ref2.hook, key = _ref2.key; return /*#__PURE__*/_react["default"].createElement(_SingleItemContainer.SingleItemContainer, _extends({}, hook, { key: key })); })); }; exports.SingletonHooksContainer = SingletonHooksContainer; var addHook = function addHook(hook) { var key = nextKey++; workingSet.push({ hook: hook, key: key }); // no container and no previous manually rendered containers if (renderedContainers.length === 0 && manualRender === false) { automaticRender = true; (0, _env.mount)(SingletonHooksContainer); } notifyContainersAsync(); return function () { workingSet.splice(workingSet.findIndex(function (h) { return h.key === key; }), 1); notifyContainersAsync(); }; }; exports.addHook = addHook; var resetLocalStateForTests = function resetLocalStateForTests() { automaticRender = false; manualRender = false; workingSet.splice(0, workingSet.length); renderedContainers.splice(0, renderedContainers.length); }; exports.resetLocalStateForTests = resetLocalStateForTests;