import clsx from 'clsx'; import { forwardRef, useRef, useEffect, MutableRefObject, ChangeEventHandler, HTMLProps, } from 'react'; interface Props extends HTMLProps { checked?: boolean; indeterminate?: boolean; title?: string; label?: string; id?: string; className?: string; role?: string; onChange?: ChangeEventHandler; bold?: boolean; 'data-cy': string; } export const Checkbox = forwardRef( ( { indeterminate, title, label, id, checked, onChange, bold = true, 'data-cy': dataCy, ...props }: Props, ref ) => { const defaultRef = useRef(null); let resolvedRef = ref as MutableRefObject; if (!ref) { resolvedRef = defaultRef; } // Need to check this on every render as the browser will always set the element's // indeterminate state to false when the checkbox is clicked, even if the indeterminate prop hasn't changed useEffect(() => { if (resolvedRef === null || resolvedRef.current === null) { return; } if (typeof indeterminate !== 'undefined') { resolvedRef.current.indeterminate = indeterminate; } }); return (
); } );