react-bootstrap
Version:
Bootstrap 3 components build with React
213 lines (163 loc) • 6.18 kB
JavaScript
/* 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'];