UNPKG

react-clientside-effect

Version:

Create components whose prop changes map to a global side effect

80 lines (61 loc) 2.36 kB
import _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose'; import _defineProperty from '@babel/runtime/helpers/esm/defineProperty'; import React, { PureComponent } from '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.createElement(WrappedComponent, this.props); }; return SideEffect; }(PureComponent); _defineProperty(SideEffect, "displayName", "SideEffect(" + getDisplayName(WrappedComponent) + ")"); return SideEffect; }; } export default withSideEffect;