import { cloneElement, ReactElement, ReactNode, Ref } from 'react'; import classNames from 'classnames'; import { Button as ReakitButton } from 'reakit/Button'; import { forwardRefWithAs, PropsWithAs } from '../../utils'; import { ButtonProps as BaseButtonProps, buttonClasses } from '../base'; interface ButtonProps extends BaseButtonProps { startIcon?: ReactNode; endIcon?: ReactNode; } function ButtonComponent( { as: Type = 'button', children, className, rounded, primary = false, danger = false, variant = 'contained', size = 'medium', startIcon, endIcon, ...props }: PropsWithAs, ref: Ref ) { const small = size === 'small'; const medium = size === 'medium'; const large = size === 'large'; const iconClassNames = classNames({ 'w-4 h-4': small, 'w-5 h-5': medium, 'w-6 h-6': large, }); const prefixIcon = startIcon ? cloneElement(startIcon as ReactElement, { className: classNames( { 'mr-2': small, 'mr-3': medium || large, }, iconClassNames ), }) : null; const suffixIcon = endIcon ? cloneElement(endIcon as ReactElement, { className: classNames( { 'ml-2': small, 'ml-3': medium || large, }, iconClassNames ), }) : null; return ( {prefixIcon} {children} {suffixIcon} ); } export const Button = forwardRefWithAs(ButtonComponent);