import { Group } from '@visx/group'; import { hierarchy, Tree as VisxTree } from '@visx/hierarchy'; import { isNil } from 'ramda'; import { useCallback, useMemo } from 'react'; import { useDeepCompare } from '../../utils'; import { nodeMargins } from './constants'; import DescendantNodes from './DescendantNodes'; import Links from './Links'; import type { BaseProp, Node, TreeProps } from './models'; import { updateNodeFromTree } from './utils'; export const Tree = ({ containerHeight, containerWidth, tree, node, treeLink = {}, changeTree, children }: TreeProps): JSX.Element => { const formattedTree: Node = useMemo( () => ({ ...tree, isExpanded: true }), [...useDeepCompare([tree]), tree] ); const toggleTreeNodesExpanded = useCallback( ({ currentTree, targetNode }: { currentTree: Node; targetNode: Node; }): Node => { return updateNodeFromTree({ callback: (subTree) => { if (isNil(subTree.isExpanded) && isNil(node.isDefaultExpanded)) { return { isExpanded: false }; } return { isExpanded: isNil(subTree.isExpanded) ? !node.isDefaultExpanded?.(subTree.data) : !subTree.isExpanded || false }; }, targetNode, tree: currentTree }); }, [node.isDefaultExpanded] ); const expandCollapseNode = useCallback( (targetNode: Node): void => { changeTree?.( toggleTreeNodesExpanded({ currentTree: formattedTree, targetNode }) ); }, [formattedTree, changeTree, toggleTreeNodesExpanded] ); const getExpanded = useCallback( (d: Node): Array> | undefined | null => { if (isNil(d.isExpanded) && isNil(node.isDefaultExpanded)) { return d.children; } if (isNil(d.isExpanded)) { return node.isDefaultExpanded?.(d.data) ? d.children : null; } return d.isExpanded ? d.children : null; }, [node.isDefaultExpanded] ); const origin = useMemo( () => ({ x: 0, y: containerHeight / 2 }), [containerHeight] ); return ( 1} size={[containerWidth, containerHeight]} top={0} > {(subTree) => ( {children} )} ); };