@availity/form
Version:
Form Wrapper around formik using reactstrap components
81 lines (72 loc) • 2.51 kB
JavaScript
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import { Input } from 'reactstrap';
import { v4 as uuid } from 'uuid';
import classNames from 'classnames';
import { useCheckboxGroup } from './CheckboxGroup';
import FormGroup from './FormGroup';
import Label from './Label';
const Checkbox = ({
className,
groupClassName,
groupName,
helpId,
id,
inline = true,
label,
value: checkValue,
isHelpVideoType,
...attributes
}) => {
const { value, toggle, metadata } = useCheckboxGroup(checkValue);
const [inputId] = useState(id || uuid());
const classes = classNames(
className,
metadata.touched ? 'is-touched' : 'is-untouched',
metadata.touched && metadata.error && 'is-invalid'
);
// should only reference feedback id when feedback is in the DOM
const errorIndicated = !!metadata.touched && !!metadata.error;
const groupFeedbackId = errorIndicated && groupName ? `${groupName}-feedback`.toLowerCase() : '';
const labelId = `${inputId}-label`.toLowerCase();
return (
<FormGroup for={inputId} className={groupClassName} check inline={inline} disabled={attributes.disabled}>
<Input
id={inputId}
name={inputId}
className={classes}
type="checkbox"
invalid={errorIndicated}
aria-describedby={groupFeedbackId}
{...attributes}
value={checkValue}
checked={value}
onChange={toggle}
/>
<Label check id={labelId} for={inputId} helpId={helpId} isHelpVideoType={isHelpVideoType}>
{label}
</Label>
</FormGroup>
);
};
Checkbox.propTypes = {
className: PropTypes.string,
/** Disables the checkbox. */
disabled: PropTypes.bool,
groupClassName: PropTypes.string,
/** Should match <CheckboxGroup /> name to accessibly link input to form feedback. */
groupName: PropTypes.string,
/** Help topic id, adds <FieldHelpIcon/> next to the label (should not be within label for accessibility). */
helpId: PropTypes.string,
/** Id and name for the checkbox. */
id: PropTypes.string,
/** Will render the checkbox inline with other checkboxes. Default: true. */
inline: PropTypes.bool,
/** Label for the checkbox. */
label: PropTypes.node,
/** Value of the checkbox. */
value: PropTypes.oneOfType([PropTypes.string, PropTypes.bool, PropTypes.object]),
/** Allows the type of `<FieldHelpIcon/>` to be changed between help-icon and video-help */
isHelpVideoType: PropTypes.bool,
};
export default Checkbox;