1
1
<script setup lang="ts">
2
2
import { computed , onUnmounted , ref , watch } from ' vue'
3
3
import { Pane , Splitpanes } from ' splitpanes'
4
- import { DevToolsMessagingEvents , rpc } from ' @vue/devtools-core'
4
+ import { DevToolsMessagingEvents , onRpcConnected , rpc } from ' @vue/devtools-core'
5
5
import { parse } from ' @vue/devtools-kit'
6
6
import type { CustomInspectorNode , CustomInspectorOptions , CustomInspectorState } from ' @vue/devtools-kit'
7
7
import { vTooltip } from ' @vue/devtools-ui'
8
8
import Navbar from ' ~/components/basic/Navbar.vue'
9
- import SelectiveList from ' ~/components/basic/SelectiveList.vue'
10
9
import DevToolsHeader from ' ~/components/basic/DevToolsHeader.vue'
11
10
import Empty from ' ~/components/basic/Empty.vue'
12
11
import RootStateViewer from ' ~/components/state/RootStateViewer.vue'
13
12
import { createExpandedContext } from ' ~/composables/toggle-expanded'
14
13
import { useCustomInspectorState } from ' ~/composables/custom-inspector-state'
14
+ import ComponentTree from ' ~/components/tree/TreeViewer.vue'
15
15
16
- const { expanded : expandedStateNodes } = createExpandedContext (' vue-query-state' )
16
+ const { expanded : expandedTreeNodes } = createExpandedContext ()
17
+ const { expanded : expandedStateNodes } = createExpandedContext (' custom-inspector-state' )
17
18
18
19
const customInspectState = useCustomInspectorState ()
19
20
20
21
const inspectorId = computed (() => customInspectState .value .id ! )
21
22
const nodeActions = ref <CustomInspectorOptions [' nodeActions' ]>([])
22
23
const actions = ref <CustomInspectorOptions [' nodeActions' ]>([])
23
24
24
- const selected = ref (' ' )
25
25
const tree = ref <CustomInspectorNode []>([])
26
+ const treeNodeLinkedList = computed (() => tree .value ?.length ? dfs (tree .value ?.[0 ]) : [])
27
+ const selected = ref (' ' )
28
+
26
29
const state = ref <Record <string , CustomInspectorState []>>({})
27
30
const emptyState = computed (() => ! Object .keys (state .value ).length )
28
31
32
+ // tree
33
+ function dfs(node : { id: string , children? : { id: string }[] }, path : string [] = [], linkedList : string [][] = []) {
34
+ path .push (node .id )
35
+ if (node .children ?.length === 0 )
36
+ linkedList .push ([... path ])
37
+
38
+ node .children ?.forEach ((child ) => {
39
+ dfs (child , path , linkedList )
40
+ })
41
+ path .pop ()
42
+ return linkedList
43
+ }
44
+
45
+ function getNodesByDepth(list : string [][], depth : number ) {
46
+ const nodes: string [] = []
47
+ list .forEach ((item ) => {
48
+ nodes .push (... item .slice (0 , depth + 1 ))
49
+ })
50
+ return [... new Set (nodes )]
51
+ }
52
+
29
53
function getNodeActions() {
30
54
rpc .value .getInspectorNodeActions (inspectorId .value ).then ((actions ) => {
31
55
nodeActions .value = actions
@@ -80,6 +104,7 @@ const getInspectorTree = () => {
80
104
tree .value = data
81
105
if (! selected .value && data .length ) {
82
106
selected .value = data [0 ].id
107
+ expandedTreeNodes .value = getNodesByDepth (treeNodeLinkedList .value , 1 )
83
108
getInspectorState (data [0 ].id )
84
109
}
85
110
})
@@ -94,10 +119,11 @@ function onInspectorTreeUpdated(_data: string) {
94
119
if (! data .rootNodes .length || data .inspectorId !== inspectorId .value )
95
120
return
96
121
tree .value = data .rootNodes
97
- if ((! selected .value && data .rootNodes .length ) || (selected .value && ! data .rootNodes .find (node => node .id === selected .value ))) {
98
- selected .value = data .rootNodes [0 ].id
99
- getInspectorState (data .rootNodes [0 ].id )
100
- }
122
+ expandedTreeNodes .value = getNodesByDepth (treeNodeLinkedList .value , 1 )
123
+ // if ((!selected.value && data.rootNodes.length) || (selected.value && !data.rootNodes.find(node => node.id === selected.value))) {
124
+ // selected.value = data.rootNodes[0].id
125
+ // getInspectorState(data.rootNodes[0].id)
126
+ // }
101
127
}
102
128
103
129
function onInspectorStateUpdated(_data : string ) {
@@ -106,17 +132,19 @@ function onInspectorStateUpdated(_data: string) {
106
132
state: CustomInspectorState
107
133
nodeId: string
108
134
}
109
- if (data .inspectorId !== inspectorId .value || ! data .state )
135
+ if (data .inspectorId !== inspectorId .value || ! data .state || data . nodeId !== selected . value )
110
136
return
111
137
112
138
const { inspectorId : _inspectorId, ... filtered } = data .state
113
139
114
140
state .value = filterEmptyState (filtered as any )
115
- expandedStateNodes .value = Array .from ({ length: Object .keys (state .value ).length }, (_ , i ) => ` ${i } ` )
141
+ // expandedStateNodes.value = Array.from({ length: Object.keys(state.value).length }, (_, i) => `${i}`)
116
142
}
117
143
118
- rpc .functions .on (DevToolsMessagingEvents .INSPECTOR_TREE_UPDATED , onInspectorTreeUpdated )
119
- rpc .functions .on (DevToolsMessagingEvents .INSPECTOR_STATE_UPDATED , onInspectorStateUpdated )
144
+ onRpcConnected (() => {
145
+ rpc .functions .on (DevToolsMessagingEvents .INSPECTOR_TREE_UPDATED , onInspectorTreeUpdated )
146
+ rpc .functions .on (DevToolsMessagingEvents .INSPECTOR_STATE_UPDATED , onInspectorStateUpdated )
147
+ })
120
148
121
149
onUnmounted (() => {
122
150
rpc .functions .off (DevToolsMessagingEvents .INSPECTOR_TREE_UPDATED , onInspectorTreeUpdated )
@@ -140,7 +168,7 @@ onUnmounted(() => {
140
168
</div >
141
169
</div >
142
170
</div >
143
- <SelectiveList v-model =" selected" :data =" tree" />
171
+ <ComponentTree v-model =" selected" :data =" tree" />
144
172
</div >
145
173
</Pane >
146
174
<Pane size =" 60" >
@@ -152,7 +180,7 @@ onUnmounted(() => {
152
180
</div >
153
181
</div >
154
182
</div >
155
- <RootStateViewer v-if =" selected && !emptyState" :data =" state" :node-id =" selected" :inspector-id =" inspectorId" expanded-state-id =" vue-query -state" class =" no-scrollbar flex-1 select-none overflow-scroll" />
183
+ <RootStateViewer v-if =" selected && !emptyState" :data =" state" :node-id =" selected" :inspector-id =" inspectorId" expanded-state-id =" custom-inspector -state" class =" no-scrollbar flex-1 select-none overflow-scroll" />
156
184
<Empty v-else >
157
185
No Data
158
186
</Empty >
0 commit comments