UNPKG

@tdb/web

Version:

Common condiguration for serving a web-site and testing web-based UI components.

135 lines (106 loc) 4.86 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = withSideEffect; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf")); var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray")); var _set = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/set")); var _react = _interopRequireWildcard(require("react")); var _utils = require("./utils"); function withSideEffect(reduceComponentsToState, handleStateChangeOnClient, mapStateOnServer) { if (typeof reduceComponentsToState !== 'function') { throw new Error('Expected reduceComponentsToState to be a function.'); } if (typeof handleStateChangeOnClient !== 'function') { throw new Error('Expected handleStateChangeOnClient to be a function.'); } if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') { throw new Error('Expected mapStateOnServer to either be undefined or a function.'); } return function wrap(WrappedComponent) { if (typeof WrappedComponent !== 'function') { throw new Error('Expected WrappedComponent to be a React component.'); } var mountedInstances = new _set.default(); var state; function emitChange(component) { state = reduceComponentsToState((0, _toConsumableArray2.default)(mountedInstances)); if (SideEffect.canUseDOM) { handleStateChangeOnClient.call(component, state); } else if (mapStateOnServer) { state = mapStateOnServer(state); } } var SideEffect = /*#__PURE__*/ function (_Component) { (0, _inherits2.default)(SideEffect, _Component); (0, _createClass2.default)(SideEffect, null, [{ key: "peek", // Expose canUseDOM so tests can monkeypatch it // Try to use displayName of wrapped component value: function peek() { return state; } }, { key: "rewind", value: function rewind() { if (SideEffect.canUseDOM) { throw new Error('You may only call rewind() on the server. Call peek() to read the current state.'); } var recordedState = state; state = undefined; mountedInstances.clear(); return recordedState; } }]); function SideEffect(props) { var _this; (0, _classCallCheck2.default)(this, SideEffect); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(SideEffect).call(this, props)); if (!SideEffect.canUseDOM) { mountedInstances.add((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); emitChange((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); } return _this; } (0, _createClass2.default)(SideEffect, [{ key: "componentDidMount", value: function componentDidMount() { mountedInstances.add(this); emitChange(this); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { emitChange(this); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { mountedInstances.delete(this); emitChange(this); } }, { key: "render", value: function render() { return _react.default.createElement(WrappedComponent, null, this.props.children); } }]); return SideEffect; }(_react.Component); (0, _defineProperty2.default)(SideEffect, "canUseDOM", typeof window !== 'undefined'); (0, _defineProperty2.default)(SideEffect, "contextTypes", WrappedComponent.contextTypes); (0, _defineProperty2.default)(SideEffect, "displayName", "SideEffect(".concat((0, _utils.getDisplayName)(WrappedComponent), ")")); return SideEffect; }; }