import {Children, cloneElement, forwardRef, isValidElement, useId, useRef} from 'react'; import {RadioGroupProps} from '../radio-group/radio-group'; import {SegmentedRadioProps} from './segmented-radio'; import {ActiveIndicator} from './active-indicator'; import {useControlledState} from '@react-stately/utils'; import clsx from 'clsx'; export interface SegmentedRadioGroupProps extends Omit { value?: string; onChange?: (value: string) => void; defaultValue?: string; } export const SegmentedRadioGroup = forwardRef< HTMLFieldSetElement, SegmentedRadioGroupProps >((props, ref) => { const {children, size, className} = props; const id = useId(); const name = props.name || id; const labelsRef = useRef>({}); const [selectedValue, setSelectedValue] = useControlledState( props.value, props.defaultValue, props.onChange ); return (
{Children.map(children, (child, index) => { if (isValidElement(child)) { return cloneElement(child, { isFirst: index === 0, name, size, onChange: e => { setSelectedValue(e.target.value); child.props.onChange?.(e); }, labelRef: el => { if (el) { labelsRef.current[child.props.value] = el; } }, isSelected: selectedValue === child.props.value, }); } })}
); });