1
1
import { Suspense , useEffect , useState } from "react" ;
2
2
import type { ReactNode } from "react" ;
3
3
import type { TypedDocumentNode } from "@apollo/client" ;
4
- import { useReactiveVar , gql , useQuery } from "@apollo/client" ;
4
+ import { gql , useQuery } from "@apollo/client" ;
5
5
import { useMachine } from "@xstate/react" ;
6
6
import { ErrorBoundary } from "react-error-boundary" ;
7
7
8
- import { currentScreen , Screens } from "./components/Layouts/Navigation" ;
9
8
import { Queries } from "./components/Queries/Queries" ;
10
9
import { Mutations } from "./components/Mutations/Mutations" ;
11
10
import { Explorer } from "./components/Explorer/Explorer" ;
@@ -41,7 +40,7 @@ import { useActorEvent } from "./hooks/useActorEvent";
41
40
import { removeClient } from "." ;
42
41
import { PageError } from "./components/PageError" ;
43
42
import { SidebarLayout } from "./components/Layouts/SidebarLayout" ;
44
- import { Outlet , useNavigate } from "react-router-dom" ;
43
+ import { Outlet , useMatches , useNavigate } from "react-router-dom" ;
45
44
import { PageSpinner } from "./components/PageSpinner" ;
46
45
47
46
const APP_QUERY : TypedDocumentNode < AppQuery , AppQueryVariables > = gql `
@@ -118,11 +117,11 @@ export const App = () => {
118
117
} ) ;
119
118
120
119
const navigate = useNavigate ( ) ;
120
+ const matches = useMatches ( ) ;
121
121
const [ settingsOpen , setSettingsOpen ] = useState ( false ) ;
122
122
const [ selectedClientId , setSelectedClientId ] = useState < string | undefined > (
123
123
data ?. clients [ 0 ] ?. id
124
124
) ;
125
- const selected = useReactiveVar < Screens > ( currentScreen ) ;
126
125
const [ embeddedExplorerIFrame , setEmbeddedExplorerIFrame ] =
127
126
useState < HTMLIFrameElement | null > ( null ) ;
128
127
@@ -156,6 +155,9 @@ export const App = () => {
156
155
}
157
156
} , [ send , clients . length ] ) ;
158
157
158
+ // The 0 index is always the root route and the selected tab is index 1.
159
+ const tab = matches [ 1 ] ;
160
+
159
161
return (
160
162
< >
161
163
< SettingsModal open = { settingsOpen } onOpen = { setSettingsOpen } />
@@ -166,16 +168,8 @@ export const App = () => {
166
168
/>
167
169
< BannerAlert />
168
170
< Tabs
169
- value = { selected }
170
- onChange = { ( screen ) => {
171
- currentScreen ( screen ) ;
172
-
173
- if ( screen === Screens . Connectors ) {
174
- navigate ( "/connectors" ) ;
175
- } else {
176
- navigate ( "/" ) ;
177
- }
178
- } }
171
+ value = { tab ?. pathname ?? "/queries" }
172
+ onChange = { navigate }
179
173
className = "flex flex-col h-screen bg-primary dark:bg-primary-dark"
180
174
>
181
175
< div className = "flex items-center border-b border-b-primary dark:border-b-primary-dark gap-4 px-4" >
@@ -196,15 +190,15 @@ export const App = () => {
196
190
</ a >
197
191
< Divider orientation = "vertical" />
198
192
< Tabs . List className = "-mb-px" >
199
- < Tabs . Trigger value = { Screens . Queries } >
193
+ < Tabs . Trigger value = "/queries" >
200
194
Queries ({ client ?. queries . total ?? 0 } )
201
195
</ Tabs . Trigger >
202
- < Tabs . Trigger value = { Screens . Mutations } >
196
+ < Tabs . Trigger value = "/mutations" >
203
197
Mutations ({ client ?. mutations . total ?? 0 } )
204
198
</ Tabs . Trigger >
205
- < Tabs . Trigger value = { Screens . Cache } > Cache</ Tabs . Trigger >
206
- < Tabs . Trigger value = { Screens . Connectors } > Connectors</ Tabs . Trigger >
207
- < Tabs . Trigger value = { Screens . Explorer } > Explorer</ Tabs . Trigger >
199
+ < Tabs . Trigger value = "/cache" > Cache</ Tabs . Trigger >
200
+ < Tabs . Trigger value = "/connectors" > Connectors</ Tabs . Trigger >
201
+ < Tabs . Trigger value = "/explorer" > Explorer</ Tabs . Trigger >
208
202
</ Tabs . List >
209
203
< div className = "ml-auto flex-1 justify-end flex items-center gap-2 h-full" >
210
204
{ client ?. version && (
@@ -272,51 +266,42 @@ export const App = () => {
272
266
*/ }
273
267
< Tabs . Content
274
268
className = "flex flex-col flex-1"
275
- value = { Screens . Explorer }
269
+ value = "/explorer"
276
270
forceMount
277
271
>
278
272
< Explorer
279
273
clientId = { selectedClientId }
280
- isVisible = { selected === Screens . Explorer }
274
+ isVisible = { tab ?. pathname === "/explorer" }
281
275
embeddedExplorerProps = { {
282
276
embeddedExplorerIFrame,
283
277
setEmbeddedExplorerIFrame,
284
278
} }
285
279
/>
286
280
</ Tabs . Content >
287
- < Tabs . Content
288
- className = "flex-1 overflow-hidden"
289
- value = { Screens . Queries }
290
- >
281
+ < Tabs . Content className = "flex-1 overflow-hidden" value = "/queries" >
291
282
< TabErrorBoundary remarks = "Error on Queries tab:" >
292
283
< Queries
293
284
clientId = { selectedClientId }
294
285
explorerIFrame = { embeddedExplorerIFrame }
295
286
/>
296
287
</ TabErrorBoundary >
297
288
</ Tabs . Content >
298
- < Tabs . Content
299
- className = "flex-1 overflow-hidden"
300
- value = { Screens . Mutations }
301
- >
289
+ < Tabs . Content className = "flex-1 overflow-hidden" value = "/mutations" >
302
290
< TabErrorBoundary remarks = "Error on Mutations tab:" >
303
291
< Mutations
304
292
clientId = { selectedClientId }
305
293
explorerIFrame = { embeddedExplorerIFrame }
306
294
/>
307
295
</ TabErrorBoundary >
308
296
</ Tabs . Content >
309
- < Tabs . Content
310
- className = "flex-1 overflow-hidden"
311
- value = { Screens . Connectors }
312
- >
297
+ < Tabs . Content className = "flex-1 overflow-hidden" value = "/connectors" >
313
298
< TabErrorBoundary remarks = "Error on Connectors tab:" >
314
299
< Suspense fallback = { < PageSpinner /> } >
315
300
< Outlet />
316
301
</ Suspense >
317
302
</ TabErrorBoundary >
318
303
</ Tabs . Content >
319
- < Tabs . Content className = "flex-1 overflow-hidden" value = { Screens . Cache } >
304
+ < Tabs . Content className = "flex-1 overflow-hidden" value = "/cache" >
320
305
< TabErrorBoundary remarks = "Error on Cache tab:" >
321
306
< Cache clientId = { selectedClientId } />
322
307
</ TabErrorBoundary >
0 commit comments