UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

213 lines (163 loc) 6.18 kB
/* eslint react/prop-types: [2, {ignore: ["container", "containerPadding", "target", "placement", "children"] }] */ /* These properties are validated in 'Portal' and 'Position' components */ 'use strict'; var _inherits = require('babel-runtime/helpers/inherits')['default']; var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default']; var _extends = require('babel-runtime/helpers/extends')['default']; var _objectWithoutProperties = require('babel-runtime/helpers/object-without-properties')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; exports.__esModule = true; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _Portal = require('./Portal'); var _Portal2 = _interopRequireDefault(_Portal); var _Position = require('./Position'); var _Position2 = _interopRequireDefault(_Position); var _RootCloseWrapper = require('./RootCloseWrapper'); var _RootCloseWrapper2 = _interopRequireDefault(_RootCloseWrapper); var _utilsCustomPropTypes = require('./utils/CustomPropTypes'); var _utilsCustomPropTypes2 = _interopRequireDefault(_utilsCustomPropTypes); var _Fade = require('./Fade'); var _Fade2 = _interopRequireDefault(_Fade); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var Overlay = (function (_React$Component) { _inherits(Overlay, _React$Component); function Overlay(props, context) { _classCallCheck(this, Overlay); _React$Component.call(this, props, context); this.state = { exited: !props.show }; this.onHiddenListener = this.handleHidden.bind(this); } Overlay.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { if (nextProps.show) { this.setState({ exited: false }); } else if (!nextProps.animation) { // Otherwise let handleHidden take care of marking exited. this.setState({ exited: true }); } }; Overlay.prototype.render = function render() { var _props = this.props; var container = _props.container; var containerPadding = _props.containerPadding; var target = _props.target; var placement = _props.placement; var rootClose = _props.rootClose; var children = _props.children; var Transition = _props.animation; var props = _objectWithoutProperties(_props, ['container', 'containerPadding', 'target', 'placement', 'rootClose', 'children', 'animation']); if (Transition === true) { Transition = _Fade2['default']; } // 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; // Position is be inner-most because it adds inline styles into the child, // which the other wrappers don't forward correctly. child = _react2['default'].createElement( _Position2['default'], { container: container, containerPadding: containerPadding, target: target, placement: placement }, child ); if (Transition) { var onExit = props.onExit; // This animates the child node by injecting props, so it must precede // anything that adds a wrapping div. var onExiting = props.onExiting; var onEnter = props.onEnter; var onEntering = props.onEntering; var onEntered = props.onEntered; child = _react2['default'].createElement( Transition, { 'in': props.show, transitionAppear: true, onExit: onExit, onExiting: onExiting, onExited: this.onHiddenListener, onEnter: onEnter, onEntering: onEntering, onEntered: onEntered }, child ); } else { child = _react.cloneElement(child, { className: _classnames2['default']('in', child.props.className) }); } // This goes after everything else because it adds a wrapping div. if (rootClose) { child = _react2['default'].createElement( _RootCloseWrapper2['default'], { onRootClose: props.onHide }, child ); } return _react2['default'].createElement( _Portal2['default'], { container: container }, child ); }; Overlay.prototype.handleHidden = function handleHidden() { this.setState({ exited: true }); if (this.props.onExited) { var _props2; (_props2 = this.props).onExited.apply(_props2, arguments); } }; return Overlay; })(_react2['default'].Component); Overlay.propTypes = _extends({}, _Portal2['default'].propTypes, _Position2['default'].propTypes, { /** * Set the visibility of the Overlay */ show: _react2['default'].PropTypes.bool, /** * Specify whether the overlay should trigger onHide when the user clicks outside the overlay */ rootClose: _react2['default'].PropTypes.bool, /** * A Callback fired by the Overlay when it wishes to be hidden. */ onHide: _react2['default'].PropTypes.func, /** * Use animation */ animation: _react2['default'].PropTypes.oneOfType([_react2['default'].PropTypes.bool, _utilsCustomPropTypes2['default'].elementType]), /** * Callback fired before the Overlay transitions in */ onEnter: _react2['default'].PropTypes.func, /** * Callback fired as the Overlay begins to transition in */ onEntering: _react2['default'].PropTypes.func, /** * Callback fired after the Overlay finishes transitioning in */ onEntered: _react2['default'].PropTypes.func, /** * Callback fired right before the Overlay transitions out */ onExit: _react2['default'].PropTypes.func, /** * Callback fired as the Overlay begins to transition out */ onExiting: _react2['default'].PropTypes.func, /** * Callback fired after the Overlay finishes transitioning out */ onExited: _react2['default'].PropTypes.func }); Overlay.defaultProps = { animation: _Fade2['default'] }; exports['default'] = Overlay; module.exports = exports['default'];