UNPKG

apeman-react-button

Version:
93 lines (78 loc) 2.01 kB
/** * Icon button component. * @class ApIconButton */ 'use strict' 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