apeman-react-button
Version:
apeman react package for button component.
93 lines (78 loc) • 2.01 kB
JSX
/**
* Icon button component.
* @class ApIconButton
*/
import React, {PropTypes as types} from 'react'
import classnames from 'classnames'
import {ApIcon} from 'apeman-react-icon'
import ApButton from './ap_button'
import {shallowEqual, clone} from 'asobj'
/** @lends ApIconButton */
const ApIconButton = React.createClass({
// --------------------
// Specs
// --------------------
propTypes: {
icon: types.string,
text: types.string,
simple: types.bool
},
statics: {
/**
* Create a icon button.
* @param {string} text - Text
* @param {string} icon - Icon class
* @param {function} onTap - Tap callback
* @param {Object} props - Other props.
* @returns {Object} - React element.
*/
createButton (text, icon, onTap, props) {
return (
<ApIconButton text={ text }
icon={ icon }
onTap={ onTap }
{ ...props }
/>
)
}
},
mixins: [],
getInitialState () {
return {}
},
getDefaultProps () {
return {
icon: null,
text: null
}
},
render () {
const s = this
let { props } = s
let className = classnames('ap-icon-button', {
'ap-icon-button-simple': !!props.simple
}, props.className)
let buttonProps = clone(props, {
without: [ 'icon', 'text' ]
})
return (
<ApButton { ...buttonProps }
className={ className }
wide={ false }
>
<ApIcon className={ classnames('ap-icon-button-icon', props.icon, {}) }/>
{ props.text ? <span className='ap-icon-button-text'>{ props.text }</span> : null}
</ApButton>
)
},
// --------------------
// Lifecycle
// --------------------
shouldComponentUpdate (nextProps, nextState) {
const s = this
let { props, state } = s
return !shallowEqual(props, nextProps) || !shallowEqual(state, nextState)
}
})
export default ApIconButton