import cn from 'classnames' import React, { forwardRef, ButtonHTMLAttributes, JSXElementConstructor, useRef, } from 'react' import mergeRefs from 'react-merge-refs' import { useButton } from 'react-aria' import s from './Button.module.css' import { LoadingDots } from '@components/ui' export interface ButtonProps extends ButtonHTMLAttributes { href?: string className?: string variant?: 'flat' | 'slim' active?: boolean type?: 'submit' | 'reset' | 'button' Component?: string | JSXElementConstructor width?: string | number loading?: boolean disabled?: boolean } const Button: React.FC = forwardRef((props, buttonRef) => { const { className, variant = 'flat', children, active, onClick, width, Component = 'button', loading = false, disabled = false, style = {}, ...rest } = props const ref = useRef(null) const { buttonProps, isPressed } = useButton( { ...rest, // @ts-ignore onClick === onPress for our purposes onPress: onClick, isDisabled: disabled, elementType: Component, }, ref ) const rootClassName = cn( s.root, { [s.slim]: variant === 'slim', [s.loading]: loading, [s.disabled]: disabled, }, className ) return ( {children} {loading && ( )} ) }) export default Button