import React, { useEffect, useState } from 'react'; import { resolveWidgetFieldValue } from '@/_helpers/utils'; import Loader from '@/ToolJetUI/Loader/Loader'; import OverflowTooltip from '@/_components/OverflowTooltip'; export const Checkbox = ({ height, properties, styles, fireEvent, setExposedVariable, setExposedVariables, dataCy, component, validate, width, }) => { const defaultValueFromProperties = properties.defaultValue ?? false; const [defaultValue, setDefaultValue] = useState(defaultValueFromProperties); const [checked, setChecked] = useState(defaultValueFromProperties); const [value, setValue] = React.useState(defaultValueFromProperties); const [userInteracted, setUserInteracted] = useState(false); const { label } = properties; const textColor = styles.textColor === '#1B1F24' ? 'var(--text-primary)' : styles.textColor; const { loadingState, disabledState } = properties; const { checkboxColor, boxShadow, alignment, uncheckedColor, borderColor, handleColor } = styles; const [loading, setLoading] = useState(properties?.loadingState); const [disable, setDisable] = useState(disabledState || loadingState); const [visibility, setVisibility] = useState(properties.visibility); const { isValid, validationError } = validate(checked); const isMandatory = resolveWidgetFieldValue(component?.definition?.validation?.mandatory?.value); const toggleValue = (e) => { const isChecked = e.target.checked; setChecked(isChecked); setValue(isChecked); setExposedVariable('value', isChecked); if (isChecked) { fireEvent('onCheck'); } else { fireEvent('onUnCheck'); } setUserInteracted(true); }; useEffect(() => { const setCheckedAndNotify = async (status) => { await setExposedVariable('value', status); if (status) { fireEvent('onCheck'); } else { fireEvent('onUnCheck'); } setChecked(status); setValue(status); }; const exposedVariables = { value: defaultValueFromProperties, setChecked: setCheckedAndNotify, setValue: setCheckedAndNotify, }; setDefaultValue(defaultValueFromProperties); setChecked(defaultValueFromProperties); setValue(defaultValueFromProperties); setExposedVariables(exposedVariables); // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultValueFromProperties]); useEffect(() => { if (disable !== disabledState) setDisable(properties.disabledState); // eslint-disable-next-line react-hooks/exhaustive-deps }, [properties.disabledState]); useEffect(() => { if (visibility !== properties.visibility) setVisibility(properties.visibility); // eslint-disable-next-line react-hooks/exhaustive-deps }, [properties.visibility]); useEffect(() => { if (loading !== loadingState) setLoading(loadingState); // eslint-disable-next-line react-hooks/exhaustive-deps }, [loadingState]); useEffect(() => { setExposedVariable('label', label); // eslint-disable-next-line react-hooks/exhaustive-deps }, [label]); useEffect(() => { setExposedVariable('isMandatory', isMandatory); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isMandatory]); useEffect(() => { setExposedVariable('isLoading', loading); // eslint-disable-next-line react-hooks/exhaustive-deps }, [loading]); useEffect(() => { setExposedVariable('isVisible', visibility); // eslint-disable-next-line react-hooks/exhaustive-deps }, [visibility]); useEffect(() => { setExposedVariable('isDisabled', disable); // eslint-disable-next-line react-hooks/exhaustive-deps }, [disable]); useEffect(() => { setExposedVariable('isValid', isValid); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isValid]); useEffect(() => { setExposedVariable('setLoading', async function (loading) { setLoading(loading); setExposedVariable('isLoading', loading); }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [properties.loadingState]); useEffect(() => { setExposedVariable('setVisibility', async function (state) { setVisibility(state); setExposedVariable('isVisible', state); }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [properties.visibility]); useEffect(() => { setExposedVariable('setDisable', async function (disable) { setDisable(disable); setExposedVariable('isDisabled', disable); }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [disable]); useEffect(() => { setExposedVariable('toggle', async function () { setExposedVariable('value', !checked); fireEvent('onChange'); setChecked(!checked); setValue(!checked); setUserInteracted(true); }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [checked, value]); const handleToggleChange = () => { const newCheckedState = !checked; setChecked(newCheckedState); setValue(newCheckedState); setExposedVariable('value', newCheckedState).then(() => { fireEvent('onChange'); if (newCheckedState) { fireEvent('onCheck'); } else { fireEvent('onUnCheck'); } }); setUserInteracted(true); }; const renderCheckBox = () => ( <>