/* eslint-disable react/button-has-type */ import * as React from 'react'; import classNames from 'classnames'; import omit from 'lodash/omit'; import LoadingIndicator from '../loading-indicator'; import RadarAnimation from '../radar'; import { SVGProps } from '../accessible-svg/AccessibleSVG'; export enum ButtonType { BUTTON = 'button', RESET = 'reset', SUBMIT = 'submit', } export interface ButtonProps { /** Child components for the button, generally localized text */ children?: React.ReactNode; /** Custom class for the button */ className: string; /** icon component, can be paired with children (text) or on its own */ icon?: React.ReactElement; /** whether the button is disabled or not */ isDisabled?: boolean; /** whether the button is loading or not */ isLoading: boolean; /** whether the button is selected or not */ isSelected?: boolean; /** onClick handler for the button */ onClick?: Function; /** to set buttons inner ref */ setRef?: Function; /** size of the button */ size?: 'large'; /** whether to show a radar */ showRadar: boolean; /** type for the button */ type: ButtonType; } class Button extends React.Component { btnElement: HTMLButtonElement | null = null; static defaultProps = { className: '', isLoading: false, showRadar: false, type: ButtonType.SUBMIT, }; handleClick = (event: React.SyntheticEvent) => { const { isDisabled, onClick } = this.props; if (isDisabled || (this.btnElement && this.btnElement.classList.contains('is-disabled'))) { event.preventDefault(); event.stopPropagation(); return; } if (onClick) { onClick(event); } }; render() { const { children, className, icon, isDisabled, isLoading, isSelected, setRef, size, type, showRadar, ...rest } = this.props; const buttonProps: Record = omit(rest, ['onClick']); if (isDisabled) { buttonProps['aria-disabled'] = true; } const styleClassName = classNames( 'btn', { 'is-disabled': isDisabled, 'is-loading': isLoading, 'is-selected': isSelected, 'bdl-is-disabled': isDisabled, 'bdl-btn--large': size === 'large', 'bdl-has-icon': !!icon, }, className, ); let button = ( ); if (showRadar) { button = {button}; } return button; } } export default Button;