'use client' import { Children, forwardRef, isValidElement, useMemo } from 'react' import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group' import classNames from 'classnames' import { type ToggleButtonProps } from '~/src/components/AlphaToggleButton/ToggleButton.types' import { ToggleButtonProvider } from '~/src/components/AlphaToggleButton/ToggleButtonContext' import { type ToggleButtonMultipleGroupProps, type ToggleButtonSingleGroupProps, } from '~/src/components/AlphaToggleButtonGroup/ToggleButtonGroup.types' import styles from './ToggleButtonGroup.module.scss' /** * `ToggleButtonGroup` is a group of two-state buttons that can be toggled. * Notice that it keeps at least one button selected. * @example * * ```tsx * * * * * * ``` */ export const ToggleButtonGroup = forwardRef< HTMLDivElement, ToggleButtonMultipleGroupProps | ToggleButtonSingleGroupProps >(function ToggleButtonGroup(props, forwardedRef) { const { children, shape, className, fullWidth, onValueChange, ...rest } = props const handleValueChange = (value: string | string[]) => { if (!props.onValueChange || !value.length) { return } if (props.type === 'single' && typeof value === 'string') { props.onValueChange(value) } else if (props.type === 'multiple' && Array.isArray(value)) { props.onValueChange(value) } } const ToggleButtons = Children.map(children, (toggleButton) => { if (!isValidElement(toggleButton)) { return null } return ( {toggleButton} ) }) return ( ({ shape }), [shape])}> {ToggleButtons} ) })