"use strict"; exports.__esModule = true; exports.default = void 0; var _propTypes = _interopRequireDefault(require("prop-types")); var _elementType = _interopRequireDefault(require("prop-types-extra/lib/elementType")); var _componentOrElement = _interopRequireDefault(require("prop-types-extra/lib/componentOrElement")); var _react = _interopRequireDefault(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _Portal = _interopRequireDefault(require("./Portal")); var _RootCloseWrapper = _interopRequireDefault(require("./RootCloseWrapper")); var _reactPopper = require("react-popper"); var _forwardRef = _interopRequireDefault(require("react-context-toolbox/forwardRef")); var _WaitForContainer = _interopRequireDefault(require("./WaitForContainer")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } /** * Built on top of `` and ``, the overlay component is * great for custom tooltip overlays. */ var Overlay = /*#__PURE__*/ function (_React$Component) { _inheritsLoose(Overlay, _React$Component); function Overlay(props, context) { var _this; _this = _React$Component.call(this, props, context) || this; _this.handleHidden = function () { _this.setState({ exited: true }); if (_this.props.onExited) { var _this$props; (_this$props = _this.props).onExited.apply(_this$props, arguments); } }; _this.state = { exited: !props.show }; _this.onHiddenListener = _this.handleHidden.bind(_assertThisInitialized(_assertThisInitialized(_this))); _this._lastTarget = null; return _this; } Overlay.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps) { if (nextProps.show) { return { exited: false }; } else if (!nextProps.transition) { // Otherwise let handleHidden take care of marking exited. return { exited: true }; } return null; }; var _proto = Overlay.prototype; _proto.componentDidMount = function componentDidMount() { this.setState({ target: this.getTarget() }); }; _proto.componentDidUpdate = function componentDidUpdate(prevProps) { if (this.props === prevProps) return; var target = this.getTarget(); if (target !== this.state.target) { this.setState({ target: target }); } }; _proto.getTarget = function getTarget() { var target = this.props.target; target = typeof target === 'function' ? target() : target; return target && _reactDom.default.findDOMNode(target) || null; }; _proto.render = function render() { var _this2 = this; var _this$props2 = this.props, _0 = _this$props2.target, container = _this$props2.container, containerPadding = _this$props2.containerPadding, placement = _this$props2.placement, rootClose = _this$props2.rootClose, children = _this$props2.children, flip = _this$props2.flip, _this$props2$popperCo = _this$props2.popperConfig, popperConfig = _this$props2$popperCo === void 0 ? {} : _this$props2$popperCo, Transition = _this$props2.transition, props = _objectWithoutPropertiesLoose(_this$props2, ["target", "container", "containerPadding", "placement", "rootClose", "children", "flip", "popperConfig", "transition"]); var target = this.state.target; // Don't un-render the overlay while it's transitioning out. var mountOverlay = props.show || Transition && !this.state.exited; if (!mountOverlay) { // Don't bother showing anything if we don't have to. return null; } var child = children; var _popperConfig$modifie = popperConfig.modifiers, modifiers = _popperConfig$modifie === void 0 ? {} : _popperConfig$modifie; var popperProps = _extends({}, popperConfig, { placement: placement, referenceElement: target, enableEvents: props.show, modifiers: _extends({}, modifiers, { preventOverflow: _extends({ padding: containerPadding || 5 }, modifiers.preventOverflow), flip: _extends({ enabled: !!flip }, modifiers.preventOverflow) }) }); child = _react.default.createElement(_reactPopper.Popper, popperProps, function (_ref) { var arrowProps = _ref.arrowProps, style = _ref.style, ref = _ref.ref, popper = _objectWithoutPropertiesLoose(_ref, ["arrowProps", "style", "ref"]); _this2.popper = popper; var innerChild = _this2.props.children(_extends({}, popper, { // popper doesn't set the initial placement placement: popper.placement || placement, show: props.show, arrowProps: arrowProps, props: { ref: ref, style: style } })); if (Transition) { var onExit = props.onExit, onExiting = props.onExiting, onEnter = props.onEnter, onEntering = props.onEntering, onEntered = props.onEntered; innerChild = _react.default.createElement(Transition, { in: props.show, appear: true, onExit: onExit, onExiting: onExiting, onExited: _this2.onHiddenListener, onEnter: onEnter, onEntering: onEntering, onEntered: onEntered }, innerChild); } return innerChild; }); if (rootClose) { child = _react.default.createElement(_RootCloseWrapper.default, { onRootClose: props.onHide, event: props.rootCloseEvent, disabled: props.rootCloseDisabled }, child); } return _react.default.createElement(_Portal.default, { container: container }, child); }; return Overlay; }(_react.default.Component); Overlay.propTypes = _extends({}, _Portal.default.propTypes, { /** * Set the visibility of the Overlay */ show: _propTypes.default.bool, /** Specify where the overlay element is positioned in relation to the target element */ placement: _propTypes.default.oneOf(_reactPopper.placements), /** * A Node, Component instance, or function that returns either. The `container` will have the Portal children * appended to it. */ container: _propTypes.default.oneOfType([_componentOrElement.default, _propTypes.default.func]), /** * Enables the Popper.js `flip` modifier, allowing the Overlay to * automatically adjust it's placement in case of overlap with the viewport or toggle. * Refer to the [flip docs](https://popper.js.org/popper-documentation.html#modifiers..flip.enabled) for more info */ flip: _propTypes.default.bool, /** * A render prop that returns an element to overlay and position. See * the [react-popper documentation](https://github.com/FezVrasta/react-popper#children) for more info. * * @type {Function ({ * show: boolean, * placement: Placement, * outOfBoundaries: ?boolean, * scheduleUpdate: () => void, * props: { * ref: (?HTMLElement) => void, * style: { [string]: string | number }, * aria-labelledby: ?string * }, * arrowProps: { * ref: (?HTMLElement) => void, * style: { [string]: string | number }, * }, * }) => React.Element} */ children: _propTypes.default.func.isRequired, /** * A set of popper options and props passed directly to react-popper's Popper component. */ popperConfig: _propTypes.default.object, /** * Specify whether the overlay should trigger `onHide` when the user clicks outside the overlay */ rootClose: _propTypes.default.bool, /** * Specify event for toggling overlay */ rootCloseEvent: _RootCloseWrapper.default.propTypes.event, /** * Specify disabled for disable RootCloseWrapper */ rootCloseDisabled: _RootCloseWrapper.default.propTypes.disabled, /** * A Callback fired by the Overlay when it wishes to be hidden. * * __required__ when `rootClose` is `true`. * * @type func */ onHide: function onHide(props) { var propType = _propTypes.default.func; if (props.rootClose) { propType = propType.isRequired; } for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return propType.apply(void 0, [props].concat(args)); }, /** * A `react-transition-group@2.0.0` `` component * used to animate the overlay as it changes visibility. */ transition: _elementType.default, /** * Callback fired before the Overlay transitions in */ onEnter: _propTypes.default.func, /** * Callback fired as the Overlay begins to transition in */ onEntering: _propTypes.default.func, /** * Callback fired after the Overlay finishes transitioning in */ onEntered: _propTypes.default.func, /** * Callback fired right before the Overlay transitions out */ onExit: _propTypes.default.func, /** * Callback fired as the Overlay begins to transition out */ onExiting: _propTypes.default.func, /** * Callback fired after the Overlay finishes transitioning out */ onExited: _propTypes.default.func }); var _default = (0, _forwardRef.default)(function (props, ref) { return (// eslint-disable-next-line react/prop-types _react.default.createElement(_WaitForContainer.default, { container: props.container }, function (container) { return _react.default.createElement(Overlay, _extends({}, props, { ref: ref, container: container })); }) ); }, { displayName: 'withContainer(Overlay)' }); exports.default = _default; module.exports = exports.default;