import React, { useEffect, useState } from 'react';
import { resolveWidgetFieldValue } from '@/_helpers/utils';
import Loader from '@/ToolJetUI/Loader/Loader';
import OverflowTooltip from '@/_components/OverflowTooltip';
const Switch = ({
on,
onClick,
onChange,
disabledState,
color,
alignment,
borderColor,
setOn,
styles,
setExposedVariable,
fireEvent,
setUserInteracted,
}) => {
const handleToggleChange = () => {
setOn(!on);
setExposedVariable('value', !on);
fireEvent('onChange');
setUserInteracted(true);
};
const switchStyle = {
position: 'relative',
display: 'inline-block',
width: '28px',
height: '18px',
marginRight: '0px',
paddingRight: '0px',
};
const sliderStyle = {
position: 'absolute',
cursor: 'pointer',
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: on ? styles.toggleSwitchColor : styles.uncheckedColor,
transition: 'background-color 0.2s',
borderRadius: '34px',
outline: `1px solid ${styles.borderColor}`,
};
const circleStyle = {
position: 'absolute',
content: '',
height: '12px',
width: '12px',
left: '2px',
bottom: '3px',
backgroundColor: styles.handleColor,
transition: 'transform 0.2s',
borderRadius: '50%',
transform: on ? 'translateX(12px)' : 'translateX(0)',
};
return (
);
};
export const ToggleSwitchV2 = ({
height,
properties,
styles,
fireEvent,
setExposedVariable,
dataCy,
component,
validate,
width,
}) => {
const defaultValue = properties.defaultValue ?? false;
const [on, setOn] = useState(Boolean(defaultValue));
const label = properties.label;
const { isValid, validationError } = validate(on);
const [showValidationError, setShowValidationError] = useState(true);
const [loading, setLoading] = useState(properties?.loadingState);
const [disable, setDisable] = useState(properties.disabledState || properties.loadingState);
const [visibility, setVisibility] = useState(properties.visibility);
const [userInteracted, setUserInteracted] = useState(false);
const isMandatory = resolveWidgetFieldValue(component?.definition?.validation?.mandatory?.value);
const { toggleSwitchColor, boxShadow, alignment, borderColor } = styles;
const textColor = styles.textColor === '#1B1F24' ? 'var(--text-primary)' : styles.textColor;
const toggleValue = (e) => {
const toggled = e.target.checked;
setExposedVariable('value', toggled);
fireEvent('onChange');
setUserInteracted(true);
};
// Exposing the initially set false value once on load
useEffect(() => {
setExposedVariable('value', defaultValue);
// eslint-disable-next-line react-hooks/exhaustive-deps
setOn(defaultValue);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [defaultValue]);
const toggle = () => {
setOn(!on);
setUserInteracted(true);
};
useEffect(() => {
if (disable !== properties.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 !== properties.loadingState) setLoading(properties.loadingState);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [properties.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
}, [properties.disabledState]);
useEffect(() => {
setExposedVariable('toggle', async function () {
setExposedVariable('value', !on);
fireEvent('onChange');
setOn(!on);
setUserInteracted(true);
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [on]);
useEffect(() => {
setExposedVariable('setValue', async function (value) {
setOn(value);
setExposedVariable('value', value);
setUserInteracted(true);
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const renderInput = () => (
{loading ? (
) : (
<>
{label}
{isMandatory && !on && {'*'}}
>
)}
);
return (
{renderInput()}
{showValidationError && isMandatory && userInteracted && !on && visibility && (
{validationError}
)}
);
};