'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({ 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(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 ( {toggled ? toggleIcon.icon : icon ? icon : undefined} ); }, );