@utahdts/utah-design-system
Version:
Utah Design System React Library
62 lines (57 loc) • 1.69 kB
JSX
import { useEffect } from 'react';
import { useImmer } from 'use-immer';
import { RadioButtonGroupContext } from './RadioButtonGroupContext';
/** @typedef { import('@utahdts/utah-design-system').RadioButtonGroupContextValue} RadioButtonGroupContextValue */
/**
* @param {object} props
* @param {import('react').ReactNode} props.children
* @param {string} [props.defaultValue]
* @param {string} props.name
* @param {((newValue: string) => void)} [props.onChange]
* @param {string} [props.value]
* @returns {import('react').JSX.Element}
*/
export function RadioButtonGroupContextProvider({
children,
defaultValue,
name,
onChange,
value,
}) {
const radioButtonGroupImmer = /** @type {typeof useImmer<RadioButtonGroupContextValue | undefined>} */ (useImmer)({
name,
onChange: (newValue) => {
if (onChange) {
// parent controls the component
onChange(newValue);
} else {
// controlled by self
radioButtonGroupImmer[1]((draftState) => {
if (draftState) {
draftState.value = newValue;
}
});
}
},
value: defaultValue ?? null,
});
const setRadioButtonGroupState = radioButtonGroupImmer[1];
// handle a controlled component changing its value
useEffect(
() => {
if (value !== undefined && value !== radioButtonGroupImmer[0]?.value) {
setRadioButtonGroupState((draftState) => {
if (draftState) {
draftState.value = value;
}
});
}
},
[value]
);
return (
<RadioButtonGroupContext.Provider value={radioButtonGroupImmer}>
{children}
</RadioButtonGroupContext.Provider>
);
}