// @flow import * as React from 'react'; import Icon from 'component/common/icon'; import classnames from 'classnames'; type Props = { onClick: ?(any) => any, href: ?string, title: ?string, label: ?string, icon: ?string, iconRight: ?string, disabled: ?boolean, children: ?React.Node, navigate: ?string, // TODO: these (nav) should be a reusable type doNavigate: (string, ?any) => void, navigateParams: any, className: ?string, description: ?string, type: string, button: ?string, // primary, secondary, alt, link noPadding: ?boolean, // to remove padding and allow circular buttons uppercase: ?boolean, }; class Button extends React.PureComponent { static defaultProps = { type: 'button', }; render() { const { onClick, href, title, label, icon, iconRight, disabled, children, navigate, navigateParams, doNavigate, className, description, button, type, noPadding, uppercase, ...otherProps } = this.props; const combinedClassName = classnames( 'btn', { 'btn--no-padding': noPadding, }, button ? { 'btn--primary': button === 'primary', 'btn--secondary': button === 'secondary', 'btn--alt': button === 'alt', 'btn--danger': button === 'danger', 'btn--inverse': button === 'inverse', 'btn--disabled': disabled, 'btn--link': button === 'link', 'btn--external-link': button === 'link' && href, 'btn--uppercase': uppercase, } : 'btn--no-style', className ); const extendedOnClick = !onClick && navigate ? event => { event.stopPropagation(); doNavigate(navigate, navigateParams || {}); } : onClick; const content = ( {icon && } {label && {label}} {children && children} {iconRight && } ); return href ? ( {content} ) : ( ); } } export default Button;