@@ -19,6 +19,7 @@ import {
19
19
20
20
import { getTypeGraph } from '../graph/' ;
21
21
import { extractTypeName , getSchema , typeNameToId } from '../introspection' ;
22
+ import { MaybePromise , usePromise } from '../utils/usePromise' ;
22
23
import DocExplorer from './doc-explorer/DocExplorer' ;
23
24
import GraphViewport from './GraphViewport' ;
24
25
import { IntrospectionModal } from './IntrospectionModal' ;
@@ -37,7 +38,9 @@ export interface VoyagerDisplayOptions {
37
38
}
38
39
39
40
export interface VoyagerProps {
40
- introspection : Promise < ExecutionResult < IntrospectionQuery > | GraphQLSchema > ;
41
+ introspection ?: MaybePromise <
42
+ ExecutionResult < IntrospectionQuery > | GraphQLSchema
43
+ > ;
41
44
displayOptions ?: VoyagerDisplayOptions ;
42
45
introspectionPresets ?: { [ name : string ] : any } ;
43
46
allowToChangeSchema ?: boolean ;
@@ -62,29 +65,27 @@ export default function Voyager(props: VoyagerProps) {
62
65
[ props . displayOptions ] ,
63
66
) ;
64
67
65
- const [ introspectionModalOpen , setIntrospectionModalOpen ] = useState ( false ) ;
66
- const [ introspectionResult , setIntrospectionResult ] = useState ( null ) ;
68
+ const [ introspectionModalOpen , setIntrospectionModalOpen ] = useState (
69
+ props . introspection == null ,
70
+ ) ;
71
+ const [ introspectionResult , resolveIntrospectionResult ] = usePromise (
72
+ props . introspection ,
73
+ ) ;
67
74
const [ displayOptions , setDisplayOptions ] = useState ( initialDisplayOptions ) ;
68
75
69
- useEffect ( ( ) => {
70
- // FIXME: handle rejection and also handle errors inside introspection
71
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
72
- Promise . resolve ( props . introspection ) . then ( setIntrospectionResult ) ;
73
- } , [ props . introspection ] ) ;
74
-
75
76
useEffect ( ( ) => {
76
77
setDisplayOptions ( initialDisplayOptions ) ;
77
78
} , [ introspectionResult , initialDisplayOptions ] ) ;
78
79
79
80
const typeGraph = useMemo ( ( ) => {
80
- if ( introspectionResult == null ) {
81
+ if ( introspectionResult . loading || introspectionResult . value == null ) {
81
82
return null ;
82
83
}
83
84
84
85
const introspectionSchema =
85
- introspectionResult instanceof GraphQLSchema
86
- ? introspectionResult
87
- : buildClientSchema ( introspectionResult . data ) ;
86
+ introspectionResult . value instanceof GraphQLSchema
87
+ ? introspectionResult . value
88
+ : buildClientSchema ( introspectionResult . value . data ) ;
88
89
89
90
const schema = getSchema (
90
91
introspectionSchema ,
@@ -133,7 +134,7 @@ export default function Voyager(props: VoyagerProps) {
133
134
open = { introspectionModalOpen }
134
135
presets = { props . introspectionPresets }
135
136
onClose = { ( ) => setIntrospectionModalOpen ( false ) }
136
- onChange = { setIntrospectionResult }
137
+ onChange = { resolveIntrospectionResult }
137
138
/>
138
139
) ;
139
140
}
0 commit comments