From 994ad1bec193b2d1a6e0d38d6ef3f3d2bd66c3ea Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Mon, 30 May 2022 19:44:37 +0200 Subject: chore: add a RadioGroup component --- src/components/molecules/forms/radio-group.tsx | 89 ++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/components/molecules/forms/radio-group.tsx (limited to 'src/components/molecules/forms/radio-group.tsx') diff --git a/src/components/molecules/forms/radio-group.tsx b/src/components/molecules/forms/radio-group.tsx new file mode 100644 index 0000000..68a8adf --- /dev/null +++ b/src/components/molecules/forms/radio-group.tsx @@ -0,0 +1,89 @@ +import Fieldset, { type FieldsetProps } from '@components/atoms/forms/fieldset'; +import { ChangeEvent, FC, useState } from 'react'; +import LabelledBooleanField, { + type LabelledBooleanFieldProps, +} from './labelled-boolean-field'; +import styles from './radio-group.module.scss'; + +export type RadioGroupOption = Pick< + LabelledBooleanFieldProps, + 'id' | 'label' | 'name' | 'value' +>; + +export type RadioGroupProps = Pick< + FieldsetProps, + 'className' | 'legend' | 'legendClassName' +> & + Pick & { + /** + * The default option value. + */ + initialChoice: string; + /** + * The legend position. Default: inline. + */ + legendPosition?: FieldsetProps['legendPosition']; + /** + * The options. + */ + options: RadioGroupOption[]; + }; + +/** + * RadioGroup component + * + * Render a group of labelled radio buttons. + */ +const RadioGroup: FC = ({ + className, + initialChoice, + labelPosition, + labelSize, + legendPosition = 'inline', + options, + ...props +}) => { + const [selectedChoice, setSelectedChoice] = useState(initialChoice); + const wrapperModifier = `wrapper--${legendPosition}`; + + /** + * Update the selected choice based on the change event target. + * + * @param {ChangeEvent} e - The change event. + */ + const updateChoice = (e: ChangeEvent) => { + setSelectedChoice(e.target.value); + }; + + /** + * Retrieve an array of radio buttons. + * + * @returns {JSX.Element[]} The radio buttons. + */ + const getOptions = (): JSX.Element[] => { + return options.map((option) => ( + + )); + }; + + return ( +
+ {getOptions()} +
+ ); +}; + +export default RadioGroup; -- cgit v1.2.3