icon-button.tsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { forwardRef } from 'react'
  2. import classNames from 'classnames'
  3. import MaterialIcon from '@/shared/components/material-icon'
  4. import Button from './button'
  5. import type { IconButtonProps } from '@/shared/components/types/icon-button-props'
  6. const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
  7. (
  8. {
  9. accessibilityLabel,
  10. icon,
  11. isLoading = false,
  12. size,
  13. className,
  14. unfilled,
  15. ...props
  16. },
  17. ref
  18. ) => {
  19. const iconButtonClassName = classNames(className, {
  20. 'icon-button': !size,
  21. 'icon-button-small': size === 'sm',
  22. 'icon-button-large': size === 'lg',
  23. })
  24. const iconSizeClassName = size === 'lg' ? 'icon-large' : 'icon-small'
  25. const materialIconClassName = classNames(iconSizeClassName, {
  26. 'button-content-hidden': isLoading,
  27. unfilled,
  28. })
  29. return (
  30. <Button
  31. className={iconButtonClassName}
  32. isLoading={isLoading}
  33. aria-label={accessibilityLabel}
  34. {...props}
  35. ref={ref}
  36. >
  37. <MaterialIcon className={materialIconClassName} type={icon} />
  38. </Button>
  39. )
  40. }
  41. )
  42. IconButton.displayName = 'IconButton'
  43. export default IconButton