import React from 'react'
import PropTypes from 'prop-types'
import Component from '../utils/Component'
import classnames from 'classnames'
import Animate from '../animate/'
import Logger from '../utils/logger'
import '../style'
import 'phoenix-styles/less/modules/popup.less'
/**
* 弹层组件<br/>
* - 由于弹层的显示操作在组件以外, 所以需要在使用时自定义visible、onShow、closeCallback函数。
* - 通过align设置碳层弹出的位置, 可选top/bottom。
* - 可通过closeCallback配置点击弹层阴影部分来关闭弹层。
*
* 主要属性和接口:
* - visible:弹层是否显示标识, 默认false不可见
* - closeCallback:关闭弹层的功能函数
* - align:弹层的位置, 默认top
*
* 示例:
* ```code
* <Popup align='top' visible={this.state.visible} closeCallback={::this.closeCallback}>
* <ul className='ph-popup-list'>
* <li className='ph-popup-item'>未上线单店</li>
* <li className='ph-popup-item'>未上线连锁店</li>
* </ul>
* </Popup>
* ```
* ```code
* onShow(){
* this.setState({
* visible: true
* });
* }
* closeCallback(){
* this.setState({
* visible: false
* });
* }
* ```
*
* @class Popup
* @module 操作类组件
* @extends Component
* @constructor
* @since 0.4.0
* @demo popup|popup.js {展示}
* @show true
* */
export default class Popup extends Component{
static propTypes = {
/**
* 样式前缀
* @property classPrefix
* @type String
* @default 'popup'
* */
classPrefix: PropTypes.string,
/**
* 标签tagName
* @property componentTag
* @type String
* */
componentTag: PropTypes.string,
/**
* 是否可见标识
* @property visible
* @type Boolean
* */
visible: PropTypes.bool,
/**
* 弹层的位置,默认top
* @property align
* @type String
* */
align: PropTypes.string,
/**
* 关闭的执行函数
* @method closeCallback
* @type Function
* */
closeCallback: PropTypes.func
};
static defaultProps = {
visible: false,
align: 'top',
classPrefix:'popup',
componentTag:'div',
classMapping : {
'top': 'top',
'bottom': 'bottom'
}
};
constructor(props, context) {
super(props, context)
new Logger('Popup')
}
renderShadow(){
let {visible, closeCallback} = this.props;
if(visible){
return <div className={classnames(this.setPhPrefix('shadow'),'animated')} onClick={closeCallback}></div>;
}else{
return '';
}
}
renderContent(){
let {visible,children,className} = this.props;
if(visible){
return <div {...this.otherProps} className={classnames(this.setPhPrefix('content'), 'animated', className)}>{children}</div>;
}else{
return '';
}
}
renderPopup(){
let {componentTag:Component, className} = this.props;
return (
<Component {...this.otherProps} className={classnames(
this.getProperty(true),
className
)}>
<Animate>
{this.renderShadow()}
</Animate>
<Animate className={this.setPhPrefix('main')} transitionName={`slide-${this.props.align}`}>
{this.renderContent()}
</Animate>
</Component>
)
}
render(){
return this.renderPopup()
}
}