import React from 'react'; import Motion from 'react-motion/lib/Motion'; import spring from 'react-motion/lib/spring'; import PropTypes from 'prop-types'; class IconButton extends React.PureComponent { static propTypes = { className: PropTypes.string, title: PropTypes.string.isRequired, icon: PropTypes.string.isRequired, onClick: PropTypes.func, size: PropTypes.number, active: PropTypes.bool, style: PropTypes.object, activeStyle: PropTypes.object, disabled: PropTypes.bool, inverted: PropTypes.bool, animate: PropTypes.bool, overlay: PropTypes.bool, }; static defaultProps = { size: 18, active: false, disabled: false, animate: false, overlay: false, }; handleClick = (e) => { e.preventDefault(); if (!this.props.disabled) { this.props.onClick(e); } } render () { const style = { fontSize: `${this.props.size}px`, width: `${this.props.size * 1.28571429}px`, height: `${this.props.size * 1.28571429}px`, lineHeight: `${this.props.size}px`, ...this.props.style, ...(this.props.active ? this.props.activeStyle : {}), }; const classes = ['icon-button']; if (this.props.active) { classes.push('active'); } if (this.props.disabled) { classes.push('disabled'); } if (this.props.inverted) { classes.push('inverted'); } if (this.props.overlay) { classes.push('overlayed'); } if (this.props.className) { classes.push(this.props.className); } return ( <Motion defaultStyle={{ rotate: this.props.active ? -360 : 0 }} style={{ rotate: this.props.animate ? spring(this.props.active ? -360 : 0, { stiffness: 120, damping: 7 }) : 0 }}> {({ rotate }) => <button aria-label={this.props.title} title={this.props.title} className={classes.join(' ')} onClick={this.handleClick} style={style} > <i style={{ transform: `rotate(${rotate}deg)` }} className={`fa fa-fw fa-${this.props.icon}`} aria-hidden='true' /> </button> } </Motion> ); } } export default IconButton;