@tdb/web
Version:
Common condiguration for serving a web-site and testing web-based UI components.
135 lines (106 loc) • 4.86 kB
JavaScript
;
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;
};
}