plotly-icons
Version:
set of plotly icons
143 lines (106 loc) • 4.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _set = require('babel-runtime/core-js/set');
var _set2 = _interopRequireDefault(_set);
exports.default = withSideEffect;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _utils = require('./utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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 _set2.default();
var state = void 0;
function emitChange(component) {
state = reduceComponentsToState([].concat((0, _toConsumableArray3.default)(mountedInstances)));
if (SideEffect.canUseDOM) {
handleStateChangeOnClient.call(component, state);
} else if (mapStateOnServer) {
state = mapStateOnServer(state);
}
}
var SideEffect = function (_Component) {
(0, _inherits3.default)(SideEffect, _Component);
function SideEffect() {
(0, _classCallCheck3.default)(this, SideEffect);
return (0, _possibleConstructorReturn3.default)(this, (SideEffect.__proto__ || (0, _getPrototypeOf2.default)(SideEffect)).apply(this, arguments));
}
(0, _createClass3.default)(SideEffect, [{
key: 'componentWillMount',
value: function componentWillMount() {
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 _react2.default.createElement(
WrappedComponent,
null,
this.props.children
);
}
}], [{
key: 'peek',
value: function peek() {
return state;
}
// Expose canUseDOM so tests can monkeypatch it
// Try to use displayName of wrapped component
}, {
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;
}
}]);
return SideEffect;
}(_react.Component);
SideEffect.displayName = 'SideEffect(' + (0, _utils.getDisplayName)(WrappedComponent) + ')';
SideEffect.contextTypes = WrappedComponent.contextTypes;
SideEffect.canUseDOM = typeof window !== 'undefined';
return SideEffect;
};
}