import React,{Component} from 'react'
import PropTypes from 'prop-types'
import classnames from 'classnames'
import {CSSTransitionGroup} from 'react-transition-group'
import Logger from '../utils/logger'

import '../style'
import 'phoenix-styles/less/modules/animation.less'

/**
 * 动画外层组件<br/>
 * - 使用时需要在子元素增加animated类名实现动画效果, animated定义的是过渡的duration和fill-mode, 默认300ms, 完全可以自定义。
 * - 可通过transitionName设置动画名称, 可选fade、slide-top、slide-bottom(还将补充), 默认fade。
 * - 可通过transitionEnterTimeout设置进入延迟时间。
 * - 可通过transitionLeaveTimeout设置离开延迟时间。
 *
 * 示例:
 * ```code
 *     <Animate className='popup-content' transitionName='slide-top'>
 *         {this.renderPopup()}
 *     </Animate>
 * ```
 * ```code
 *     renderPopup(){
 *         let {visible,children,className} = this.props;
 *         if(visible){
 *             return <div {...this.props} className={'popup-main', 'animated', className)}>{children}</div>;
 *         }else{
 *             return '';
 *         }
 *     }
 * ```
 *
 * @class Animate
 * @module 辅助组件
 * @extends Component
 * @constructor
 * @since 1.0.0
 * @demo animate|animate.js {展示}
 * @show true
 * */

export default class Animate extends Component{

    static propTypes = {
        /**
         * 动画名称,默认fade
         * @property transitionName
         * @type String
         * @default 'fade'
         * */
        transitionName: PropTypes.string,
        /**
         * 动画进入延迟时间
         * @property transitionEnterTimeout
         * @type Number
         * */
        transitionEnterTimeout: PropTypes.number,
        /**
         * 动画退出延迟时间
         * @property transitionLeaveTimeout
         * @type Number
         * */
        transitionLeaveTimeout: PropTypes.number
    };

    static defaultProps = {
        transitionName: 'fade',
        transitionEnterTimeout: 100,
        transitionLeaveTimeout: 300
    }

    constructor(props, context) {
        super(props, context);
        new Logger('Animate');
    }

    renderAnimate(){
        let {transitionName, transitionEnterTimeout, transitionLeaveTimeout, children} = this.props

        return (
            <CSSTransitionGroup {...this.props}
                transitionName={transitionName}
                transitionEnterTimeout={transitionEnterTimeout}
                transitionLeaveTimeout={transitionLeaveTimeout}
            >
                {children}
            </CSSTransitionGroup>
        )
    }

    render(){
        return this.renderAnimate()
    }
}