UNPKG

@utahdts/utah-design-system

Version:
62 lines (57 loc) 1.69 kB
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> ); }