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'