import _extends from 'babel-runtime/helpers/extends'; import _classCallCheck from 'babel-runtime/helpers/classCallCheck'; import _createClass from 'babel-runtime/helpers/createClass'; import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn'; import _inherits from 'babel-runtime/helpers/inherits'; import React, { Component } from 'react'; import PropTypes from 'prop-types'; import ReactDOM from 'react-dom'; import Align from 'rc-align'; import Animate from 'rc-animate'; import PopupInner from './PopupInner'; import LazyRenderBox from './LazyRenderBox'; import { saveRef } from './utils'; var Popup = function (_Component) { _inherits(Popup, _Component); function Popup(props) { _classCallCheck(this, Popup); var _this = _possibleConstructorReturn(this, (Popup.__proto__ || Object.getPrototypeOf(Popup)).call(this, props)); _initialiseProps.call(_this); _this.savePopupRef = saveRef.bind(_this, 'popupInstance'); _this.saveAlignRef = saveRef.bind(_this, 'alignInstance'); return _this; } _createClass(Popup, [{ key: 'componentDidMount', value: function componentDidMount() { this.rootNode = this.getPopupDomNode(); } }, { key: 'getPopupDomNode', value: function getPopupDomNode() { return ReactDOM.findDOMNode(this.popupInstance); } }, { key: 'getMaskTransitionName', value: function getMaskTransitionName() { var props = this.props; var transitionName = props.maskTransitionName; var animation = props.maskAnimation; if (!transitionName && animation) { transitionName = props.prefixCls + '-' + animation; } return transitionName; } }, { key: 'getTransitionName', value: function getTransitionName() { var props = this.props; var transitionName = props.transitionName; if (!transitionName && props.animation) { transitionName = props.prefixCls + '-' + props.animation; } return transitionName; } }, { key: 'getClassName', value: function getClassName(currentAlignClassName) { return this.props.prefixCls + ' ' + this.props.className + ' ' + currentAlignClassName; } }, { key: 'getPopupElement', value: function getPopupElement() { var savePopupRef = this.savePopupRef, props = this.props; var align = props.align, style = props.style, visible = props.visible, prefixCls = props.prefixCls, destroyPopupOnHide = props.destroyPopupOnHide; var className = this.getClassName(this.currentAlignClassName || props.getClassNameFromAlign(align)); var hiddenClassName = prefixCls + '-hidden'; if (!visible) { this.currentAlignClassName = null; } var newStyle = _extends({}, style, this.getZIndexStyle()); var popupInnerProps = { className: className, prefixCls: prefixCls, ref: savePopupRef, onMouseEnter: props.onMouseEnter, onMouseLeave: props.onMouseLeave, style: newStyle }; if (destroyPopupOnHide) { return React.createElement( Animate, { component: '', exclusive: true, transitionAppear: true, transitionName: this.getTransitionName() }, visible ? React.createElement( Align, { target: this.getTarget, key: 'popup', ref: this.saveAlignRef, monitorWindowResize: true, align: align, onAlign: this.onAlign }, React.createElement( PopupInner, _extends({ visible: true }, popupInnerProps), props.children ) ) : null ); } return React.createElement( Animate, { component: '', exclusive: true, transitionAppear: true, transitionName: this.getTransitionName(), showProp: 'xVisible' }, React.createElement( Align, { target: this.getTarget, key: 'popup', ref: this.saveAlignRef, monitorWindowResize: true, xVisible: visible, childrenProps: { visible: 'xVisible' }, disabled: !visible, align: align, onAlign: this.onAlign }, React.createElement( PopupInner, _extends({ hiddenClassName: hiddenClassName }, popupInnerProps), props.children ) ) ); } }, { key: 'getZIndexStyle', value: function getZIndexStyle() { var style = {}; var props = this.props; if (props.zIndex !== undefined) { style.zIndex = props.zIndex; } return style; } }, { key: 'getMaskElement', value: function getMaskElement() { var props = this.props; var maskElement = void 0; if (props.mask) { var maskTransition = this.getMaskTransitionName(); maskElement = React.createElement(LazyRenderBox, { style: this.getZIndexStyle(), key: 'mask', className: props.prefixCls + '-mask', hiddenClassName: props.prefixCls + '-mask-hidden', visible: props.visible }); if (maskTransition) { maskElement = React.createElement( Animate, { key: 'mask', showProp: 'visible', transitionAppear: true, component: '', transitionName: maskTransition }, maskElement ); } } return maskElement; } }, { key: 'render', value: function render() { return React.createElement( 'div', null, this.getMaskElement(), this.getPopupElement() ); } }]); return Popup; }(Component); Popup.propTypes = { visible: PropTypes.bool, style: PropTypes.object, getClassNameFromAlign: PropTypes.func, onAlign: PropTypes.func, getRootDomNode: PropTypes.func, onMouseEnter: PropTypes.func, align: PropTypes.any, destroyPopupOnHide: PropTypes.bool, className: PropTypes.string, prefixCls: PropTypes.string, onMouseLeave: PropTypes.func }; var _initialiseProps = function _initialiseProps() { var _this2 = this; this.onAlign = function (popupDomNode, align) { var props = _this2.props; var currentAlignClassName = props.getClassNameFromAlign(align); // FIX: https://github.com/react-component/trigger/issues/56 // FIX: https://github.com/react-component/tooltip/issues/79 if (_this2.currentAlignClassName !== currentAlignClassName) { _this2.currentAlignClassName = currentAlignClassName; popupDomNode.className = _this2.getClassName(currentAlignClassName); } props.onAlign(popupDomNode, align); }; this.getTarget = function () { return _this2.props.getRootDomNode(); }; }; export default Popup;