import { useState, useEffect, useCallback, memo } from '@wordpress/element'; import classNames from 'classnames'; import { Button as WordpressButton } from '@wordpress/components'; import { Icon } from '@components/ui/Icon'; type ButtonToggleProps = { children?: React.ReactNode; className?: string; value: string; defaultPressed: string; variant?: 'primary' | 'secondary'; size?: 'small' | 'default' | 'compact'; icon?: any; display?: 'icon' | 'label' | '' | null; onPressedChange: (value: string) => void; label?: string; }; type ButtonToggleGroupOptionProp = { value: string; label: string; icon?: any; children?: React.ReactNode; }; type ButtonToggleGroupProps = { className?: string; options: ButtonToggleGroupOptionProp[]; defaultPressed?: string; toggle?: boolean; size?: 'small' | 'default' | 'compact'; tabs?: boolean; display?: 'icon' | 'label' | '' | null; variant?: 'primary' | 'secondary'; stretch?: boolean; icon?: any; onPressedChange?: (value: string) => void; }; const ButtonToggle: React.FC = memo( ({ children, className, value, variant = 'secondary', defaultPressed, onPressedChange, icon, size = 'compact', display = 'auto', label, }) => { const [isPressed, setIsPressed] = useState(false); useEffect(() => { setIsPressed(defaultPressed == value ? true : false); }, [defaultPressed]); const handleClick = useCallback(() => { setIsPressed((prev) => !prev); onPressedChange(value); }, [isPressed, onPressedChange]); return ( {icon && } {display !== 'icon' ? children : null} ); } ); const ButtonToggleGroup: React.FC = memo( ({ className, defaultPressed = '', toggle = true, display = 'auto', options, size = 'compact', tabs = false, variant = 'secondary', stretch = false, onPressedChange, }) => { const [isPressed, setIsPressed] = useState(defaultPressed); useEffect(() => { setIsPressed(defaultPressed); }, [defaultPressed]); const handleButtonClick = useCallback( (value: string) => { const newValue = toggle && isPressed === value ? '' : value; setIsPressed(newValue); onPressedChange?.(newValue); }, [isPressed, onPressedChange, toggle] ); const renderContent = (option: ButtonToggleGroupOptionProp) => { if (display === 'icon' && option?.icon) { return ; } else if (display === 'label') { return {option.label}; } else { return ( {option.icon && } {option.label} ); } }; return (
{options.map((option, index) => ( handleButtonClick(option.value)} > {renderContent(option)} {option.children && option.children} ))}
); } ); export default ButtonToggleGroup; export { ButtonToggle, ButtonToggleGroup };