import { IconButton as MuiIconButton, type IconButtonProps as MuiIconButtonProps } from '@mui/material'; import { forwardRef, type ReactElement, type ReactNode } from 'react'; import type { AriaLabelingAttributes } from '../../../@types/aria-attributes'; import type { DataTestAttributes } from '../../../@types/data-attributes'; import { useStyles } from './IconButton.styles'; const muiColorMap: Record< Required['variant'], 'primary' | 'secondary' | 'default' > = { ghost: 'default', primary: 'primary', secondary: 'secondary' }; type IconButtonProps = { disabled?: boolean; icon?: string | ReactNode; onClick?: (e: React.MouseEvent) => void; size?: 'small' | 'medium' | 'large'; variant?: 'primary' | 'secondary' | 'ghost'; } & AriaLabelingAttributes & DataTestAttributes & MuiIconButtonProps; /** * @todo re-factor as `iconVariant: 'icon-only'` Button variant, and remove IconButton component (reason: code duplication) */ const IconButton = forwardRef( ( { variant = 'primary', size = 'medium', icon, disabled = false, onClick, ...attr }, ref ): ReactElement => { const { classes } = useStyles(); return ( onClick?.(e)} ref={ref} size={size} {...attr} // Mui overrides color={muiColorMap[variant]} > {icon} ); } ); export { IconButton };