UNPKG

semantic-ui-react

Version:
375 lines (276 loc) 11.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _includes2 = require('lodash/includes'); var _includes3 = _interopRequireDefault(_includes2); var _get2 = require('lodash/get'); var _get3 = _interopRequireDefault(_get2); var _invoke2 = require('lodash/invoke'); var _invoke3 = _interopRequireDefault(_invoke2); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _react = require('react'); var _lib = require('../../lib'); var _TransitionGroup = require('./TransitionGroup'); var _TransitionGroup2 = _interopRequireDefault(_TransitionGroup); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var TRANSITION_TYPE = { ENTERING: 'show', EXITING: 'hide' /** * A transition is an animation usually used to move content in or out of view. */ }; var Transition = function (_Component) { (0, _inherits3.default)(Transition, _Component); function Transition() { var _ref; (0, _classCallCheck3.default)(this, Transition); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var _this = (0, _possibleConstructorReturn3.default)(this, (_ref = Transition.__proto__ || Object.getPrototypeOf(Transition)).call.apply(_ref, [this].concat(args))); _initialiseProps.call(_this); var _this$computeInitialS = _this.computeInitialStatuses(), status = _this$computeInitialS.initial, next = _this$computeInitialS.next; _this.nextStatus = next; _this.state = { status: status }; return _this; } // ---------------------------------------- // Lifecycle // ---------------------------------------- (0, _createClass3.default)(Transition, [{ key: 'componentDidMount', value: function componentDidMount() { this.mounted = true; this.updateStatus(); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(nextProps) { var _computeStatuses = this.computeStatuses(nextProps), status = _computeStatuses.current, next = _computeStatuses.next; this.nextStatus = next; if (status) this.setSafeState({ status: status }); } }, { key: 'componentDidUpdate', value: function componentDidUpdate() { this.updateStatus(); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.mounted = false; } // ---------------------------------------- // Callback handling // ---------------------------------------- // ---------------------------------------- // Helpers // ---------------------------------------- }, { key: 'render', // ---------------------------------------- // Render // ---------------------------------------- value: function render() { var children = this.props.children; var status = this.state.status; if (status === Transition.UNMOUNTED) return null; return (0, _react.cloneElement)(children, { className: this.computeClasses(), style: this.computeStyle() }); } }]); return Transition; }(_react.Component); Transition.defaultProps = { animation: 'fade', duration: 500, visible: true, mountOnShow: true, transitionOnMount: false, unmountOnHide: false }; Transition._meta = { name: 'Transition', type: _lib.META.TYPES.MODULE }; Transition.ENTERED = 'ENTERED'; Transition.ENTERING = 'ENTERING'; Transition.EXITED = 'EXITED'; Transition.EXITING = 'EXITING'; Transition.UNMOUNTED = 'UNMOUNTED'; Transition.Group = _TransitionGroup2.default; Transition.handledProps = ['animation', 'children', 'duration', 'mountOnShow', 'onComplete', 'onHide', 'onShow', 'onStart', 'reactKey', 'transitionOnMount', 'unmountOnHide', 'visible']; var _initialiseProps = function _initialiseProps() { var _this2 = this; this.handleStart = function () { var duration = _this2.props.duration; var status = _this2.nextStatus; _this2.nextStatus = null; _this2.setSafeState({ status: status, animating: true }, function () { (0, _invoke3.default)(_this2.props, 'onStart', null, (0, _extends3.default)({}, _this2.props, { status: status })); setTimeout(_this2.handleComplete, (0, _lib.normalizeTransitionDuration)(duration, 'show')); }); }; this.handleComplete = function () { var current = _this2.state.status; (0, _invoke3.default)(_this2.props, 'onComplete', null, (0, _extends3.default)({}, _this2.props, { status: current })); if (_this2.nextStatus) { _this2.handleStart(); return; } var status = _this2.computeCompletedStatus(); var callback = current === Transition.ENTERING ? 'onShow' : 'onHide'; _this2.setSafeState({ status: status, animating: false }, function () { (0, _invoke3.default)(_this2.props, callback, null, (0, _extends3.default)({}, _this2.props, { status: status })); }); }; this.updateStatus = function () { var animating = _this2.state.animating; if (_this2.nextStatus) { _this2.nextStatus = _this2.computeNextStatus(); if (!animating) _this2.handleStart(); } }; this.computeClasses = function () { var _props = _this2.props, animation = _props.animation, children = _props.children; var _state = _this2.state, animating = _state.animating, status = _state.status; var childClasses = (0, _get3.default)(children, 'props.className'); var directional = (0, _includes3.default)(_lib.SUI.DIRECTIONAL_TRANSITIONS, animation); if (directional) { return (0, _classnames2.default)(animation, childClasses, (0, _lib.useKeyOnly)(animating, 'animating'), (0, _lib.useKeyOnly)(status === Transition.ENTERING, 'in'), (0, _lib.useKeyOnly)(status === Transition.EXITING, 'out'), (0, _lib.useKeyOnly)(status === Transition.EXITED, 'hidden'), (0, _lib.useKeyOnly)(status !== Transition.EXITED, 'visible'), 'transition'); } return (0, _classnames2.default)(animation, childClasses, (0, _lib.useKeyOnly)(animating, 'animating transition')); }; this.computeCompletedStatus = function () { var unmountOnHide = _this2.props.unmountOnHide; var status = _this2.state.status; if (status === Transition.ENTERING) return Transition.ENTERED; return unmountOnHide ? Transition.UNMOUNTED : Transition.EXITED; }; this.computeInitialStatuses = function () { var _props2 = _this2.props, visible = _props2.visible, mountOnShow = _props2.mountOnShow, transitionOnMount = _props2.transitionOnMount, unmountOnHide = _props2.unmountOnHide; if (visible) { if (transitionOnMount) { return { initial: Transition.EXITED, next: Transition.ENTERING }; } return { initial: Transition.ENTERED }; } if (mountOnShow || unmountOnHide) return { initial: Transition.UNMOUNTED }; return { initial: Transition.EXITED }; }; this.computeNextStatus = function () { var _state2 = _this2.state, animating = _state2.animating, status = _state2.status; if (animating) return status === Transition.ENTERING ? Transition.EXITING : Transition.ENTERING; return status === Transition.ENTERED ? Transition.EXITING : Transition.ENTERING; }; this.computeStatuses = function (props) { var status = _this2.state.status; var visible = props.visible; if (visible) { return { current: status === Transition.UNMOUNTED && Transition.EXITED, next: status !== Transition.ENTERING && status !== Transition.ENTERED && Transition.ENTERING }; } return { next: (status === Transition.ENTERING || status === Transition.ENTERED) && Transition.EXITING }; }; this.computeStyle = function () { var _props3 = _this2.props, children = _props3.children, duration = _props3.duration; var status = _this2.state.status; var childStyle = (0, _get3.default)(children, 'props.style'); var type = TRANSITION_TYPE[status]; var animationDuration = type && (0, _lib.normalizeTransitionDuration)(duration, type) + 'ms'; return (0, _extends3.default)({}, childStyle, { animationDuration: animationDuration }); }; this.setSafeState = function () { return _this2.mounted && _this2.setState.apply(_this2, arguments); }; }; exports.default = Transition; Transition.propTypes = process.env.NODE_ENV !== "production" ? { /** Named animation event to used. Must be defined in CSS. */ animation: _propTypes2.default.oneOf(_lib.SUI.TRANSITIONS), /** Primary content. */ children: _propTypes2.default.element.isRequired, /** Duration of the CSS transition animation in milliseconds. */ duration: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.shape({ hide: _propTypes2.default.number, show: _propTypes2.default.number }), _propTypes2.default.string]), /** Show the component; triggers the enter or exit animation. */ visible: _propTypes2.default.bool, /** Wait until the first "enter" transition to mount the component (add it to the DOM). */ mountOnShow: _propTypes2.default.bool, /** * Callback on each transition that changes visibility to shown. * * @param {null} * @param {object} data - All props with status. */ onComplete: _propTypes2.default.func, /** * Callback on each transition that changes visibility to hidden. * * @param {null} * @param {object} data - All props with status. */ onHide: _propTypes2.default.func, /** * Callback on each transition that changes visibility to shown. * * @param {null} * @param {object} data - All props with status. */ onShow: _propTypes2.default.func, /** * Callback on animation start. * * @param {null} * @param {object} data - All props with status. */ onStart: _propTypes2.default.func, /** React's key of the element. */ reactKey: _propTypes2.default.string, /** Run the enter animation when the component mounts, if it is initially shown. */ transitionOnMount: _propTypes2.default.bool, /** Unmount the component (remove it from the DOM) when it is not shown. */ unmountOnHide: _propTypes2.default.bool } : {};