You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							257 lines
						
					
					
						
							6.9 KiB
						
					
					
				
			
		
		
	
	
							257 lines
						
					
					
						
							6.9 KiB
						
					
					
				import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose";
 | 
						|
 | 
						|
var _leaveRenders, _enterRenders;
 | 
						|
 | 
						|
import React from 'react';
 | 
						|
import PropTypes from 'prop-types';
 | 
						|
import { ENTERED, ENTERING, EXITING } from './Transition';
 | 
						|
import TransitionGroupContext from './TransitionGroupContext';
 | 
						|
 | 
						|
function areChildrenDifferent(oldChildren, newChildren) {
 | 
						|
  if (oldChildren === newChildren) return false;
 | 
						|
 | 
						|
  if (React.isValidElement(oldChildren) && React.isValidElement(newChildren) && oldChildren.key != null && oldChildren.key === newChildren.key) {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  return true;
 | 
						|
}
 | 
						|
/**
 | 
						|
 * Enum of modes for SwitchTransition component
 | 
						|
 * @enum { string }
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
export var modes = {
 | 
						|
  out: 'out-in',
 | 
						|
  in: 'in-out'
 | 
						|
};
 | 
						|
 | 
						|
var callHook = function callHook(element, name, cb) {
 | 
						|
  return function () {
 | 
						|
    var _element$props;
 | 
						|
 | 
						|
    element.props[name] && (_element$props = element.props)[name].apply(_element$props, arguments);
 | 
						|
    cb();
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
var leaveRenders = (_leaveRenders = {}, _leaveRenders[modes.out] = function (_ref) {
 | 
						|
  var current = _ref.current,
 | 
						|
      changeState = _ref.changeState;
 | 
						|
  return React.cloneElement(current, {
 | 
						|
    in: false,
 | 
						|
    onExited: callHook(current, 'onExited', function () {
 | 
						|
      changeState(ENTERING, null);
 | 
						|
    })
 | 
						|
  });
 | 
						|
}, _leaveRenders[modes.in] = function (_ref2) {
 | 
						|
  var current = _ref2.current,
 | 
						|
      changeState = _ref2.changeState,
 | 
						|
      children = _ref2.children;
 | 
						|
  return [current, React.cloneElement(children, {
 | 
						|
    in: true,
 | 
						|
    onEntered: callHook(children, 'onEntered', function () {
 | 
						|
      changeState(ENTERING);
 | 
						|
    })
 | 
						|
  })];
 | 
						|
}, _leaveRenders);
 | 
						|
var enterRenders = (_enterRenders = {}, _enterRenders[modes.out] = function (_ref3) {
 | 
						|
  var children = _ref3.children,
 | 
						|
      changeState = _ref3.changeState;
 | 
						|
  return React.cloneElement(children, {
 | 
						|
    in: true,
 | 
						|
    onEntered: callHook(children, 'onEntered', function () {
 | 
						|
      changeState(ENTERED, React.cloneElement(children, {
 | 
						|
        in: true
 | 
						|
      }));
 | 
						|
    })
 | 
						|
  });
 | 
						|
}, _enterRenders[modes.in] = function (_ref4) {
 | 
						|
  var current = _ref4.current,
 | 
						|
      children = _ref4.children,
 | 
						|
      changeState = _ref4.changeState;
 | 
						|
  return [React.cloneElement(current, {
 | 
						|
    in: false,
 | 
						|
    onExited: callHook(current, 'onExited', function () {
 | 
						|
      changeState(ENTERED, React.cloneElement(children, {
 | 
						|
        in: true
 | 
						|
      }));
 | 
						|
    })
 | 
						|
  }), React.cloneElement(children, {
 | 
						|
    in: true
 | 
						|
  })];
 | 
						|
}, _enterRenders);
 | 
						|
/**
 | 
						|
 * A transition component inspired by the [vue transition modes](https://vuejs.org/v2/guide/transitions.html#Transition-Modes).
 | 
						|
 * You can use it when you want to control the render between state transitions.
 | 
						|
 * Based on the selected mode and the child's key which is the `Transition` or `CSSTransition` component, the `SwitchTransition` makes a consistent transition between them.
 | 
						|
 *
 | 
						|
 * If the `out-in` mode is selected, the `SwitchTransition` waits until the old child leaves and then inserts a new child.
 | 
						|
 * If the `in-out` mode is selected, the `SwitchTransition` inserts a new child first, waits for the new child to enter and then removes the old child.
 | 
						|
 *
 | 
						|
 * **Note**: If you want the animation to happen simultaneously
 | 
						|
 * (that is, to have the old child removed and a new child inserted **at the same time**),
 | 
						|
 * you should use
 | 
						|
 * [`TransitionGroup`](https://reactcommunity.org/react-transition-group/transition-group)
 | 
						|
 * instead.
 | 
						|
 *
 | 
						|
 * ```jsx
 | 
						|
 * function App() {
 | 
						|
 *  const [state, setState] = useState(false);
 | 
						|
 *  return (
 | 
						|
 *    <SwitchTransition>
 | 
						|
 *      <CSSTransition
 | 
						|
 *        key={state ? "Goodbye, world!" : "Hello, world!"}
 | 
						|
 *        addEndListener={(node, done) => node.addEventListener("transitionend", done, false)}
 | 
						|
 *        classNames='fade'
 | 
						|
 *      >
 | 
						|
 *        <button onClick={() => setState(state => !state)}>
 | 
						|
 *          {state ? "Goodbye, world!" : "Hello, world!"}
 | 
						|
 *        </button>
 | 
						|
 *      </CSSTransition>
 | 
						|
 *    </SwitchTransition>
 | 
						|
 *  );
 | 
						|
 * }
 | 
						|
 * ```
 | 
						|
 *
 | 
						|
 * ```css
 | 
						|
 * .fade-enter{
 | 
						|
 *    opacity: 0;
 | 
						|
 * }
 | 
						|
 * .fade-exit{
 | 
						|
 *    opacity: 1;
 | 
						|
 * }
 | 
						|
 * .fade-enter-active{
 | 
						|
 *    opacity: 1;
 | 
						|
 * }
 | 
						|
 * .fade-exit-active{
 | 
						|
 *    opacity: 0;
 | 
						|
 * }
 | 
						|
 * .fade-enter-active,
 | 
						|
 * .fade-exit-active{
 | 
						|
 *    transition: opacity 500ms;
 | 
						|
 * }
 | 
						|
 * ```
 | 
						|
 */
 | 
						|
 | 
						|
var SwitchTransition = /*#__PURE__*/function (_React$Component) {
 | 
						|
  _inheritsLoose(SwitchTransition, _React$Component);
 | 
						|
 | 
						|
  function SwitchTransition() {
 | 
						|
    var _this;
 | 
						|
 | 
						|
    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
 | 
						|
      args[_key] = arguments[_key];
 | 
						|
    }
 | 
						|
 | 
						|
    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
 | 
						|
    _this.state = {
 | 
						|
      status: ENTERED,
 | 
						|
      current: null
 | 
						|
    };
 | 
						|
    _this.appeared = false;
 | 
						|
 | 
						|
    _this.changeState = function (status, current) {
 | 
						|
      if (current === void 0) {
 | 
						|
        current = _this.state.current;
 | 
						|
      }
 | 
						|
 | 
						|
      _this.setState({
 | 
						|
        status: status,
 | 
						|
        current: current
 | 
						|
      });
 | 
						|
    };
 | 
						|
 | 
						|
    return _this;
 | 
						|
  }
 | 
						|
 | 
						|
  var _proto = SwitchTransition.prototype;
 | 
						|
 | 
						|
  _proto.componentDidMount = function componentDidMount() {
 | 
						|
    this.appeared = true;
 | 
						|
  };
 | 
						|
 | 
						|
  SwitchTransition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {
 | 
						|
    if (props.children == null) {
 | 
						|
      return {
 | 
						|
        current: null
 | 
						|
      };
 | 
						|
    }
 | 
						|
 | 
						|
    if (state.status === ENTERING && props.mode === modes.in) {
 | 
						|
      return {
 | 
						|
        status: ENTERING
 | 
						|
      };
 | 
						|
    }
 | 
						|
 | 
						|
    if (state.current && areChildrenDifferent(state.current, props.children)) {
 | 
						|
      return {
 | 
						|
        status: EXITING
 | 
						|
      };
 | 
						|
    }
 | 
						|
 | 
						|
    return {
 | 
						|
      current: React.cloneElement(props.children, {
 | 
						|
        in: true
 | 
						|
      })
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  _proto.render = function render() {
 | 
						|
    var _this$props = this.props,
 | 
						|
        children = _this$props.children,
 | 
						|
        mode = _this$props.mode,
 | 
						|
        _this$state = this.state,
 | 
						|
        status = _this$state.status,
 | 
						|
        current = _this$state.current;
 | 
						|
    var data = {
 | 
						|
      children: children,
 | 
						|
      current: current,
 | 
						|
      changeState: this.changeState,
 | 
						|
      status: status
 | 
						|
    };
 | 
						|
    var component;
 | 
						|
 | 
						|
    switch (status) {
 | 
						|
      case ENTERING:
 | 
						|
        component = enterRenders[mode](data);
 | 
						|
        break;
 | 
						|
 | 
						|
      case EXITING:
 | 
						|
        component = leaveRenders[mode](data);
 | 
						|
        break;
 | 
						|
 | 
						|
      case ENTERED:
 | 
						|
        component = current;
 | 
						|
    }
 | 
						|
 | 
						|
    return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {
 | 
						|
      value: {
 | 
						|
        isMounting: !this.appeared
 | 
						|
      }
 | 
						|
    }, component);
 | 
						|
  };
 | 
						|
 | 
						|
  return SwitchTransition;
 | 
						|
}(React.Component);
 | 
						|
 | 
						|
SwitchTransition.propTypes = process.env.NODE_ENV !== "production" ? {
 | 
						|
  /**
 | 
						|
   * Transition modes.
 | 
						|
   * `out-in`: Current element transitions out first, then when complete, the new element transitions in.
 | 
						|
   * `in-out`: New element transitions in first, then when complete, the current element transitions out.
 | 
						|
   *
 | 
						|
   * @type {'out-in'|'in-out'}
 | 
						|
   */
 | 
						|
  mode: PropTypes.oneOf([modes.in, modes.out]),
 | 
						|
 | 
						|
  /**
 | 
						|
   * Any `Transition` or `CSSTransition` component.
 | 
						|
   */
 | 
						|
  children: PropTypes.oneOfType([PropTypes.element.isRequired])
 | 
						|
} : {};
 | 
						|
SwitchTransition.defaultProps = {
 | 
						|
  mode: modes.out
 | 
						|
};
 | 
						|
export default SwitchTransition; |