UNPKG

react-clientside-effect

Version:

Create components whose prop changes map to a global side effect

85 lines (64 loc) 2.57 kB
'use strict'; function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var _inheritsLoose = _interopDefault(require('@babel/runtime/helpers/inheritsLoose')); var _defineProperty = _interopDefault(require('@babel/runtime/helpers/defineProperty')); var React = require('react'); var React__default = _interopDefault(React); function withSideEffect(reducePropsToState, handleStateChangeOnClient) { if (process.env.NODE_ENV !== "production") { if (typeof reducePropsToState !== 'function') { throw new Error('Expected reducePropsToState to be a function.'); } if (typeof handleStateChangeOnClient !== 'function') { throw new Error('Expected handleStateChangeOnClient to be a function.'); } } function getDisplayName(WrappedComponent) { return WrappedComponent.displayName || WrappedComponent.name || 'Component'; } return function wrap(WrappedComponent) { if (process.env.NODE_ENV !== "production") { if (typeof WrappedComponent !== 'function') { throw new Error('Expected WrappedComponent to be a React component.'); } } var mountedInstances = []; var state; function emitChange() { state = reducePropsToState(mountedInstances.map(function (instance) { return instance.props; })); handleStateChangeOnClient(state); } var SideEffect = /*#__PURE__*/function (_PureComponent) { _inheritsLoose(SideEffect, _PureComponent); function SideEffect() { return _PureComponent.apply(this, arguments) || this; } // Try to use displayName of wrapped component SideEffect.peek = function peek() { return state; }; var _proto = SideEffect.prototype; _proto.componentDidMount = function componentDidMount() { mountedInstances.push(this); emitChange(); }; _proto.componentDidUpdate = function componentDidUpdate() { emitChange(); }; _proto.componentWillUnmount = function componentWillUnmount() { var index = mountedInstances.indexOf(this); mountedInstances.splice(index, 1); emitChange(); }; _proto.render = function render() { return /*#__PURE__*/React__default.createElement(WrappedComponent, this.props); }; return SideEffect; }(React.PureComponent); _defineProperty(SideEffect, "displayName", "SideEffect(" + getDisplayName(WrappedComponent) + ")"); return SideEffect; }; } module.exports = withSideEffect;