11import "./GraphInspector.css" ;
22import type { SyntheticEvent } from "react" ;
3- import { useCallback , useEffect , useReducer , useRef } from "react" ;
3+ import { useCallback , useEffect , useReducer , useRef , useState } from "react" ;
44import TreeView from "@mui/lab/TreeView" ;
55import { Node } from "./Node" ;
6- import { all , node } from "./queries" ;
6+ import { allQuery , node } from "./queries" ;
77import { graphReducer } from "./graphReducer" ;
88import { VertexNode } from "../../../../graphql/types" ;
99import { MinusSquare , PlusSquare } from "./icons" ;
1010import { StyledTreeItem } from "./StyledTreeItem" ;
1111import { fetchGraphQL } from "../../graphql/fetchGraphql" ;
1212import { Loader } from "../Loader/Loader" ;
13-
13+ import { useQuery } from 'urql' ;
14+ import type { Page } from '../../../../graphql/relay' ;
1415const emptyGraph = { graph : { } } ;
1516
17+ const limit = 5 ;
18+
1619export function GraphInspector ( ) : JSX . Element {
20+ // TODO: call setAfter when scrolling
21+ const [ after ] = useState ( '' ) ;
22+ const [ typename , setTypename ] = useState < string | undefined > ( ) ;
23+
24+ const [ result ] = useQuery < { all : Page < VertexNode > } , {
25+ typename : string ;
26+ first : number ;
27+ after : string ;
28+ } > ( {
29+ query : allQuery ,
30+ pause : ! typename ,
31+ variables : {
32+ typename,
33+ first : limit ,
34+ after
35+ } ,
36+ } ) ;
37+
1738 const [ { graph } , dispatch ] = useReducer ( graphReducer , emptyGraph ) ;
1839 const expandedNodes = useRef ( new Set < string > ( ) ) ;
1940
41+ const { data, error } = result ;
42+
43+ useEffect ( ( ) => {
44+ const edges = data ?. all ?. edges ?? [ ] ;
45+
46+ if ( edges . length === 0 ) {
47+ return ;
48+ }
49+
50+ dispatch ( {
51+ type : "ALL" ,
52+ payload : {
53+ typename,
54+ nodes : edges . map ( edge => edge . node ) ,
55+ } ,
56+ } ) ;
57+ } , [ data , typename ] )
58+
2059 const handleChange = useCallback (
2160 async ( _ : SyntheticEvent , nodeIds : string [ ] ) => {
2261 if ( nodeIds . length === 0 ) {
@@ -79,22 +118,8 @@ export function GraphInspector(): JSX.Element {
79118 return ;
80119 }
81120
82- try {
83- const response = await all ( nodeId ) ;
84-
85- dispatch ( {
86- type : "ALL" ,
87- payload : {
88- typename : nodeIds [ 0 ] ,
89- nodes : response . data . all ,
90- } ,
91- } ) ;
92- } catch ( e ) {
93- console . error ( e ) ;
94- throw e ;
95- }
96- } ,
97- [ ] ,
121+ setTypename ( nodeId ) ;
122+ } , [ ] ,
98123 ) ;
99124
100125 useEffect ( ( ) => {
@@ -120,6 +145,10 @@ export function GraphInspector(): JSX.Element {
120145 return < h2 > No graph nodes</ h2 > ;
121146 }
122147
148+ if ( error ) {
149+ return < p className = "error" > Oh no... { error ?. message } </ p >
150+ }
151+
123152 return (
124153 < TreeView
125154 aria-label = "graph inspector"
@@ -135,20 +164,19 @@ export function GraphInspector(): JSX.Element {
135164 label = { < div className = "root" > { label } </ div > }
136165 >
137166 { nodes . length > 0
138- ? nodes . map ( ( vertexNode , i ) => {
139- return (
140- < StyledTreeItem
141- key = { vertexNode . id }
142- nodeId = { vertexNode . id }
143- label = {
144- < Node
145- parentId = { `${ typename } .nodes.${ i } ` }
146- node = { vertexNode }
147- />
148- }
149- />
150- ) ;
151- } )
167+ ? nodes . map ( ( vertexNode , i ) => (
168+ < StyledTreeItem
169+ key = { vertexNode . id }
170+ nodeId = { vertexNode . id }
171+ label = {
172+ < Node
173+ parentId = { `${ typename } .nodes.${ i } ` }
174+ node = { vertexNode }
175+ />
176+ }
177+ />
178+ )
179+ )
152180 : < Loader /> }
153181 </ StyledTreeItem >
154182 ) ) }
0 commit comments