import * as React from 'react'; import RcCheckbox from 'rc-checkbox'; import classNames from 'classnames'; import RadioGroup from './group'; import RadioButton from './radioButton'; import { RadioProps, RadioChangeEvent } from './interface'; import { ConfigContext } from '../config-provider'; import RadioGroupContext from './context'; import { composeRef } from '../_util/ref'; interface CompoundedComponent extends React.ForwardRefExoticComponent> { Group: typeof RadioGroup; Button: typeof RadioButton; } const InternalRadio: React.ForwardRefRenderFunction = (props, ref) => { const context = React.useContext(RadioGroupContext); const { getPrefixCls, direction } = React.useContext(ConfigContext); const innerRef = React.useRef(); const mergedRef = composeRef(ref, innerRef); const onChange = (e: RadioChangeEvent) => { if (props.onChange) { props.onChange(e); } if (context?.onChange) { context.onChange(e); } }; const { prefixCls: customizePrefixCls, className, children, style, ...restProps } = props; const prefixCls = getPrefixCls('radio', customizePrefixCls); const radioProps: RadioProps = { ...restProps }; if (context) { radioProps.name = context.name; radioProps.onChange = onChange; radioProps.checked = props.value === context.value; radioProps.disabled = props.disabled || context.disabled; } const wrapperClassString = classNames(className, { [`${prefixCls}-wrapper`]: true, [`${prefixCls}-wrapper-checked`]: radioProps.checked, [`${prefixCls}-wrapper-disabled`]: radioProps.disabled, [`${prefixCls}-wrapper-rtl`]: direction === 'rtl', }); return ( // eslint-disable-next-line jsx-a11y/label-has-associated-control ); }; const Radio = React.forwardRef(InternalRadio) as CompoundedComponent; Radio.displayName = 'Radio'; Radio.Group = RadioGroup; Radio.Button = RadioButton; Radio.defaultProps = { type: 'radio', }; export default Radio;