import { Box, Chip } from '@mui/material'; import { type FormikValues, useFormikContext } from 'formik'; import { equals, includes, path, reject, split } from 'ramda'; import type { ChangeEvent } from 'react'; import { useTranslation } from 'react-i18next'; import { useMemoComponent } from '../..'; import { CheckboxGroup as CheckboxGroupComponent } from '../../Checkbox'; import { type ChangeArgs, type InputPropsWithoutGroup, InputType } from './models'; import Switch from './Switch'; const ExclusiveCheckboxGroup = ({ exclusiveCheckboxGroup, fieldName, getDisabled, dataTestId }: InputPropsWithoutGroup): JSX.Element => { const { t } = useTranslation(); const { values, setFieldValue } = useFormikContext(); const fieldNamePath = split('.', fieldName); const value = (path(fieldNamePath, values) as Array | null) ?? []; const exclusiveOption = exclusiveCheckboxGroup?.exclusiveOption as string; const options = reject( equals(exclusiveOption), exclusiveCheckboxGroup?.options ?? [] ); const isExclusive = includes(exclusiveOption, value); const disabled = getDisabled?.(values) || false; const changeToggle = ({ value: checked }: ChangeArgs): void => { setFieldValue(fieldName, checked ? [exclusiveOption] : []); }; const changeCheckbox = (event: ChangeEvent): void => { if (disabled || isExclusive) { return; } const option = event.target.id; setFieldValue( fieldName, includes(option, value) ? reject(equals(option), value) : [...value, option] ); }; const toggleChip = (option: string) => (): void => { setFieldValue( fieldName, includes(option, value) ? reject(equals(option), value) : [...value, option] ); }; const baseTestId = dataTestId || fieldName; const isChips = equals(exclusiveCheckboxGroup?.variant, 'chips'); const exclusiveToggle = ( disabled} label={exclusiveCheckboxGroup?.exclusiveLabel as string} switchInput={{ getChecked: (fieldValue) => includes(exclusiveOption, (fieldValue as Array) ?? []) }} type={InputType.Switch} /> ); return useMemoComponent({ Component: isChips ? (
{options.map((option) => { const isSelected = !isExclusive && includes(option, value); return ( ); })} {exclusiveToggle}
) : ( {exclusiveToggle} ), memoProps: [ value, disabled, options, exclusiveOption, exclusiveCheckboxGroup?.exclusiveLabel, exclusiveCheckboxGroup?.direction, exclusiveCheckboxGroup?.labelPlacement, exclusiveCheckboxGroup?.variant ] }); }; export default ExclusiveCheckboxGroup;