import React from 'react'; import { cx } from '@leafygreen-ui/emotion'; import { useIdAllocator } from '@leafygreen-ui/hooks'; import { useDarkMode } from '@leafygreen-ui/leafygreen-provider'; import { isComponentType } from '@leafygreen-ui/lib'; import { Size } from '../types'; import { radioGroupStyles } from './RadioGroup.styles'; import { RadioGroupProps } from './RadioGroup.types'; /** * * RadioGroup component * * ``` execute callback onChange}> Radio 1 Radio 2 ``` * @param props.children Content to appear inside of RadioGroup component. * @param props.onChange Callback to be executed when a Radio is selected. * @param props.value Radio that should appear checked. If value passed, component will be controlled by consumer. * @param props.className className applied to RadioGroup container. * @param props.name Name passed to each Radio belonging to the RadioGroup. * @param props.darkMode Determines whether or not the RadioGroup will appear in dark mode. * @param props.size Determines the size of the Radio components Can be 'small' or 'default. */ function RadioGroup({ darkMode: darkModeProp, size = Size.Default, className, onChange, children, value: controlledValue, name: nameProp, bold = true, ...rest }: RadioGroupProps) { let isControlled = controlledValue != null ? true : false, defaultChecked = ''; const { darkMode } = useDarkMode(darkModeProp); React.Children.forEach(children, child => { if (isComponentType(child, 'Radio')) { if (child.props.checked != null) { isControlled = true; } if (child.props.default) { defaultChecked = child.props.value; } } }); const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultChecked); const name = useIdAllocator({ prefix: 'radio-group', id: nameProp }); const handleChange = (e: React.ChangeEvent) => { if (onChange) { onChange(e); } if (!isControlled) { setUncontrolledValue(e.target.value); } }; const renderedChildren = React.Children.map(children, (child, index) => { if (!isComponentType(child, 'Radio')) { return child; } const checked = isControlled ? child.props.value === controlledValue || child.props.checked : child.props.value === uncontrolledValue; return React.cloneElement(child, { onChange: handleChange, id: child.props.id || `${name}-${index}`, checked, darkMode, name, size, bold, }); }); return (
{renderedChildren}
); } RadioGroup.displayName = 'RadioGroup'; export default RadioGroup;