import React, { useEffect, useRef, type InputHTMLAttributes } from 'react' import classnames from 'classnames' import { Icon } from '~components/Icon' import { type OverrideClassName } from '~components/types/OverrideClassName' import styles from './Checkbox.module.scss' export type CheckedStatus = 'checked' | 'unchecked' | 'indeterminate' type ReadOnly = { readOnly: true onChange?: never } type Controlled = { readOnly?: false onChange: Required['onChange']> } export type CheckboxProps = { checkedStatus: CheckedStatus } & (ReadOnly | Controlled) & OverrideClassName< // `checked` is omitted as it conflicts with controlled checkboxes Omit, 'type' | 'checked'> > const renderIcon = (status: CheckedStatus): JSX.Element | null => { if (status === 'unchecked') return null return ( ) } export const Checkbox = ({ checkedStatus, classNameOverride, ...restProps }: CheckboxProps): JSX.Element => { const checkboxRef = useRef(null) useEffect(() => { if (checkboxRef.current) { if (checkedStatus === 'checked') { checkboxRef.current.checked = true checkboxRef.current.indeterminate = false } else if (checkedStatus === 'unchecked') { checkboxRef.current.checked = false checkboxRef.current.indeterminate = false } else if (checkedStatus === 'indeterminate') { checkboxRef.current.checked = false checkboxRef.current.indeterminate = true } } }, [checkedStatus]) return ( {renderIcon(checkedStatus)} ) } Checkbox.displayName = 'Checkbox'