import classNames from 'classnames'; import React, { SyntheticEvent, useCallback, useEffect, useRef } from 'react'; import Icon from 'Components/Icon'; import { icons } from 'Helpers/Props'; import { Kind } from 'Helpers/Props/kinds'; import { CheckInputChanged } from 'typings/inputs'; import FormInputHelpText from './FormInputHelpText'; import styles from './CheckInput.css'; interface ChangeEvent extends SyntheticEvent { target: EventTarget & T; } export interface CheckInputProps { className?: string; containerClassName?: string; name: string; checkedValue?: boolean; uncheckedValue?: boolean; value?: string | boolean | null; helpText?: string; helpTextWarning?: string; isDisabled?: boolean; kind?: Extract; onChange: (changes: CheckInputChanged) => void; } function CheckInput(props: CheckInputProps) { const { className = styles.input, containerClassName = styles.container, name, value, checkedValue = true, uncheckedValue = false, helpText, helpTextWarning, isDisabled, kind = 'primary', onChange, } = props; const inputRef = useRef(null); const isChecked = value === checkedValue; const isUnchecked = value === uncheckedValue; const isIndeterminate = !isChecked && !isUnchecked; const toggleChecked = useCallback( (checked: boolean, shiftKey: boolean) => { const newValue = checked ? checkedValue : uncheckedValue; if (value !== newValue) { onChange({ name, value: newValue, shiftKey, }); } }, [name, value, checkedValue, uncheckedValue, onChange] ); const handleClick = useCallback( (event: SyntheticEvent) => { if (isDisabled) { return; } const shiftKey = event.nativeEvent.shiftKey; const checked = !(inputRef.current?.checked ?? false); event.preventDefault(); toggleChecked(checked, shiftKey); }, [isDisabled, toggleChecked] ); const handleChange = useCallback( (event: ChangeEvent) => { const checked = event.target.checked; const shiftKey = event.nativeEvent.shiftKey; toggleChecked(checked, shiftKey); }, [toggleChecked] ); useEffect(() => { if (!inputRef.current) { return; } inputRef.current.indeterminate = value !== uncheckedValue && value !== checkedValue; }, [value, uncheckedValue, checkedValue]); return (
); } export default CheckInput;