Add Checkbox and CheckboxGroup component

[MAILPOET-2773]
This commit is contained in:
Ján Mikláš
2020-05-18 16:08:57 +02:00
committed by Veljko V
parent 45f60b9cfc
commit 7286bcf49d
2 changed files with 93 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
import React, { InputHTMLAttributes, useState } from 'react';
import Checkbox from './checkbox';
type CheckboxValueType = string | string[] | number;
type CheckboxProps = InputHTMLAttributes<HTMLInputElement> & {
label: string,
}
type Props = {
name: string,
options: CheckboxProps[],
defaultValue?: CheckboxValueType[]
isFullWidth?: boolean,
onChange?: (values: CheckboxValueType[]) => void,
};
const CheckboxGroup = ({
name,
options,
defaultValue,
isFullWidth,
onChange,
}: Props) => {
const [values, setValues] = useState(defaultValue || []);
const handleChange = (value: CheckboxValueType, isChecked: boolean) => {
const index = values.indexOf(value);
let newValues;
if (isChecked && index === -1) {
newValues = values.concat([value]);
}
if (!isChecked && index !== -1) {
newValues = values.filter((val: CheckboxValueType) => val !== value);
}
setValues(newValues);
onChange(newValues);
};
return (
<div>
{options.map(({ label, value, ...attributes }: CheckboxProps) => (
<Checkbox
checked={values.indexOf(value) !== -1}
key={label}
name={name}
value={value}
onChange={(isChecked) => handleChange(value, isChecked)}
isFullWidth={isFullWidth}
{...attributes} // eslint-disable-line react/jsx-props-no-spreading
>
{label}
</Checkbox>
))}
</div>
);
};
export default CheckboxGroup;