icon-button.tsx 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  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 '@/features/ui/components/types/icon-button-props'
  6. const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
  7. (
  8. { accessibilityLabel, icon, isLoading = false, size, className, ...props },
  9. ref
  10. ) => {
  11. const iconButtonClassName = classNames(className, {
  12. 'icon-button': !size,
  13. 'icon-button-small': size === 'sm',
  14. 'icon-button-large': size === 'lg',
  15. })
  16. const iconSizeClassName = size === 'lg' ? 'icon-large' : 'icon-small'
  17. const materialIconClassName = classNames(iconSizeClassName, {
  18. 'button-content-hidden': isLoading,
  19. })
  20. return (
  21. <Button
  22. className={iconButtonClassName}
  23. isLoading={isLoading}
  24. aria-label={accessibilityLabel}
  25. {...props}
  26. ref={ref}
  27. >
  28. <MaterialIcon className={materialIconClassName} type={icon} />
  29. </Button>
  30. )
  31. }
  32. )
  33. IconButton.displayName = 'IconButton'
  34. export default IconButton