1
- import React , { useRef , useEffect , useContext } from 'react' ;
1
+ import React , { useRef , useEffect , useContext , useState } from 'react' ;
2
2
import { select , hierarchy , tree , linkHorizontal } from 'd3' ;
3
3
import cloneDeep from 'lodash/cloneDeep' ;
4
4
import useResizeObserver from './useResizeObserver' ;
@@ -10,7 +10,7 @@ function usePrevious(value) {
10
10
return ref . current ;
11
11
}
12
12
13
- function Tree ( { data, currComponentState, setCurrComponentState, parentProps, setParentProps, setClickedComp } ) {
13
+ function Tree ( { data, currComponentState, setCurrComponentState, parentProps, setParentProps, setClickedComp} ) {
14
14
const [ state , dispatch ] = useContext ( StateContext ) ;
15
15
const svgRef = useRef ( ) ;
16
16
const wrapperRef = useRef ( ) ;
@@ -41,7 +41,6 @@ function Tree({ data, currComponentState, setCurrComponentState, parentProps, se
41
41
// create a deep clone of data to avoid mutating the actual children array in removing separators
42
42
const dataDeepClone = cloneDeep ( data ) ;
43
43
44
- // LEGACYPD to look at when trying to figure out how to convert tab to work for NextJS
45
44
if ( state . projectType === 'Next.js' ) {
46
45
dataDeepClone . forEach ( element => {
47
46
element . children = sanitize ( element . children ) . filter ( element => ! Array . isArray ( element ) ) ;
@@ -57,7 +56,7 @@ function Tree({ data, currComponentState, setCurrComponentState, parentProps, se
57
56
58
57
// remove separators and update components to current versions
59
58
dataDeepClone . forEach ( component => removeHTMLElements ( component . children ) ) ;
60
-
59
+
61
60
// will be called initially and on every data change
62
61
useEffect ( ( ) => {
63
62
const svg = select ( svgRef . current ) ;
@@ -66,7 +65,31 @@ function Tree({ data, currComponentState, setCurrComponentState, parentProps, se
66
65
// (dimensions are null for the first render)
67
66
const { width, height } = dimensions || wrapperRef . current . getBoundingClientRect ( ) ;
68
67
// transform hierarchical data
69
- const root = hierarchy ( dataDeepClone [ 0 ] ) ;
68
+
69
+ let root ;
70
+ let rootName ;
71
+
72
+ if ( state . rootComponents . includes ( state . canvasFocus . componentId ) ) {
73
+ // find out if canvasFocus is a root component
74
+ // if yes, set root to be that canvasFocus component
75
+ // find that component inside dataDeepClone
76
+ for ( let i = 0 ; i < dataDeepClone . length ; i ++ ) {
77
+ if ( dataDeepClone [ i ] [ 'id' ] === state . canvasFocus . componentId ) {
78
+ // reassign root to be dataDeepClone at that element
79
+
80
+ root = hierarchy ( dataDeepClone [ i ] ) ;
81
+ rootName = dataDeepClone [ i ] [ "name" ] ;
82
+
83
+ }
84
+ }
85
+ } else {
86
+ // if no, set root to be dataDeepClone[0]
87
+ root = hierarchy ( dataDeepClone [ 0 ] ) ;
88
+ rootName = dataDeepClone [ 0 ] [ "name" ] ;
89
+ }
90
+
91
+ setClickedComp ( rootName ) ;
92
+
70
93
const treeLayout = tree ( ) . size ( [ height , width - 125 ] ) ;
71
94
// Returns a new link generator with horizontal display.
72
95
// To visualize links in a tree diagram rooted on the left edge of the display
@@ -76,7 +99,7 @@ function Tree({ data, currComponentState, setCurrComponentState, parentProps, se
76
99
77
100
// insert our data into the tree layout
78
101
treeLayout ( root ) ;
79
-
102
+
80
103
svg
81
104
. selectAll ( '.node' )
82
105
. data ( root . descendants ( ) )
@@ -99,7 +122,7 @@ function Tree({ data, currComponentState, setCurrComponentState, parentProps, se
99
122
let passedInProps ;
100
123
let componentStateProps ;
101
124
102
- // iterate through data array to find stateProps for parent and clicked element
125
+ // iterate through data array to find stateProps and passedInProps
103
126
for ( let i = 0 ; i < data . length ; i ++ ) {
104
127
if ( data [ i ] [ "name" ] === nameOfClicked ) {
105
128
componentStateProps = data [ i ] [ "stateProps" ] ;
0 commit comments