'use client'; import { Icon } from '../material-you-components'; import { toggleIconType } from './icon-button.types'; import { IRippleProps } from '../ripple/ripple.types'; import { ButtonLayout } from '../button-layout/button-layout'; import { IconButtonMainProps } from '../button-layout/button.types'; import { forwardRef, useCallback, useImperativeHandle, useRef, useState, } from 'react'; /** * Icon button-layout component ** description */ export const IconButton = forwardRef< HTMLButtonElement, IconButtonMainProps & IRippleProps >( ( { icon, variant, disabled, selected = false, toggled = false, centralRipple, ...props }, ref, ) => { const [toggleIcon, setToggleIcon] = useState<toggleIconType>({ state: selected == true ? 'selected' : 'unselected', icon: toggled ? toggled.unselected ?? 'add_circle' : 'add_circle', }); const toggle = (classes: string, icon: string) => { setToggleIcon(() => ({ state: classes, icon: icon, })); }; const buttonRef = useRef<HTMLButtonElement>(null); const callback = useCallback(() => { if (toggled) { if (toggleIcon.state === 'selected') { toggle('', toggled.unselected ?? 'add_circle'); } else { toggle('selected', toggled.selected ?? 'add_circle'); } } if (props.onClick) { props.onClick(); } }, [toggleIcon]); useImperativeHandle(ref, () => buttonRef.current); return ( <ButtonLayout {...props} centralRipple={centralRipple} className={`m3-icon-button ${toggleIcon.state} ${toggled ? 'toggled' : ''}`.trimEnd()} disabled={disabled} onClick={callback} ref={buttonRef} variant={variant ? variant : 'default'} > <Icon fill={toggleIcon.state === 'selected' ? 1 : 0} iconSize={28} svgSize={40} > {toggled ? toggleIcon.icon : icon ? icon : undefined} </Icon> </ButtonLayout> ); }, );