import React, { useState, useEffect, useMemo } from 'react'; // eslint-disable-next-line import/no-unresolved import CheckboxTree from 'react-checkbox-tree'; // eslint-disable-next-line import/no-unresolved import 'react-checkbox-tree/lib/react-checkbox-tree.css'; export const TreeSelect = ({ height, properties, styles, setExposedVariable, fireEvent, darkMode }) => { const { label, data, checkedData, expandedData } = properties; const { visibility, disabledState, checkboxColor } = styles; const textColor = darkMode && styles.textColor === '#000' ? '#fff' : styles.textColor; const [checked, setChecked] = useState(checkedData); const [expanded, setExpanded] = useState(expandedData); let pathObj = {}; useEffect(() => { const checkedArr = [], checkedPathArray = [], checkedPathString = []; const updateCheckedArr = (array = [], selected, isSelected = false) => { array.forEach((node) => { if (isSelected || selected.includes(node.value)) { checkedArr.push(node.value); updateCheckedArr(node.children, selected, true); } else { updateCheckedArr(node.children, selected); } }); }; updateCheckedArr(data, checkedData); setChecked(checkedArr); setExposedVariable('checked', checkedArr); checkedArr.forEach((item) => { checkedPathArray.push(pathObj[item]); checkedPathString.push(pathObj[item].join('-')); }); setExposedVariable('checkedPathArray', checkedPathArray); setExposedVariable('checkedPathStrings', checkedPathString); // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(checkedData), JSON.stringify(data)]); useEffect(() => { setExposedVariable('expanded', expandedData); setExpanded(expandedData); // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(expandedData)]); pathObj = useMemo(() => { let nodePath = {}; function checkedPath(nodes, arr = []) { for (const node of nodes) { nodePath[node.value] = [...arr, node.value]; if (node?.children?.length > 0) { checkedPath(node.children, [...arr, node.value]); } } } checkedPath(data, []); return nodePath; // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(data)]); const onCheck = (checked, updatedNode) => { const checkedPathArray = [], checkedPathString = []; checked.forEach((item) => { checkedPathArray.push(pathObj[item]); checkedPathString.push(pathObj[item].join('-')); }); setExposedVariable('checkedPathArray', checkedPathArray); setExposedVariable('checkedPathStrings', checkedPathString); setExposedVariable('checked', checked).then(() => { updatedNode.checked ? fireEvent('onCheck') : fireEvent('onUnCheck'); fireEvent('onChange'); }); setChecked(checked); }; const onExpand = (expanded) => { setExposedVariable('expanded', expanded); setExpanded(expanded); }; return (