icon-button.tsx 1013 B

123456789101112131415161718192021222324252627282930313233
  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 = 'default', ...props },
  9. ref
  10. ) => {
  11. const iconButtonClassName = `icon-button-${size}`
  12. const iconSizeClassName = size === 'large' ? 'icon-large' : 'icon-small'
  13. const materialIconClassName = classNames(iconSizeClassName, {
  14. 'button-content-hidden': isLoading,
  15. })
  16. return (
  17. <Button
  18. className={iconButtonClassName}
  19. isLoading={isLoading}
  20. aria-label={accessibilityLabel}
  21. {...props}
  22. ref={ref}
  23. >
  24. <MaterialIcon className={materialIconClassName} type={icon} />
  25. </Button>
  26. )
  27. }
  28. )
  29. IconButton.displayName = 'IconButton'
  30. export default IconButton