Skip to content

Commit bc0a79c

Browse files
committed
Use the URL to navigate tabs
1 parent a09c432 commit bc0a79c

File tree

4 files changed

+29
-48
lines changed

4 files changed

+29
-48
lines changed

src/application/App.tsx

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import { Suspense, useEffect, useState } from "react";
22
import type { ReactNode } from "react";
33
import type { TypedDocumentNode } from "@apollo/client";
4-
import { useReactiveVar, gql, useQuery } from "@apollo/client";
4+
import { gql, useQuery } from "@apollo/client";
55
import { useMachine } from "@xstate/react";
66
import { ErrorBoundary } from "react-error-boundary";
77

8-
import { currentScreen, Screens } from "./components/Layouts/Navigation";
98
import { Queries } from "./components/Queries/Queries";
109
import { Mutations } from "./components/Mutations/Mutations";
1110
import { Explorer } from "./components/Explorer/Explorer";
@@ -41,7 +40,7 @@ import { useActorEvent } from "./hooks/useActorEvent";
4140
import { removeClient } from ".";
4241
import { PageError } from "./components/PageError";
4342
import { SidebarLayout } from "./components/Layouts/SidebarLayout";
44-
import { Outlet, useNavigate } from "react-router-dom";
43+
import { Outlet, useMatches, useNavigate } from "react-router-dom";
4544
import { PageSpinner } from "./components/PageSpinner";
4645

4746
const APP_QUERY: TypedDocumentNode<AppQuery, AppQueryVariables> = gql`
@@ -118,11 +117,11 @@ export const App = () => {
118117
});
119118

120119
const navigate = useNavigate();
120+
const matches = useMatches();
121121
const [settingsOpen, setSettingsOpen] = useState(false);
122122
const [selectedClientId, setSelectedClientId] = useState<string | undefined>(
123123
data?.clients[0]?.id
124124
);
125-
const selected = useReactiveVar<Screens>(currentScreen);
126125
const [embeddedExplorerIFrame, setEmbeddedExplorerIFrame] =
127126
useState<HTMLIFrameElement | null>(null);
128127

@@ -156,6 +155,9 @@ export const App = () => {
156155
}
157156
}, [send, clients.length]);
158157

158+
// The 0 index is always the root route and the selected tab is index 1.
159+
const tab = matches[1];
160+
159161
return (
160162
<>
161163
<SettingsModal open={settingsOpen} onOpen={setSettingsOpen} />
@@ -166,16 +168,8 @@ export const App = () => {
166168
/>
167169
<BannerAlert />
168170
<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}
179173
className="flex flex-col h-screen bg-primary dark:bg-primary-dark"
180174
>
181175
<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 = () => {
196190
</a>
197191
<Divider orientation="vertical" />
198192
<Tabs.List className="-mb-px">
199-
<Tabs.Trigger value={Screens.Queries}>
193+
<Tabs.Trigger value="/queries">
200194
Queries ({client?.queries.total ?? 0})
201195
</Tabs.Trigger>
202-
<Tabs.Trigger value={Screens.Mutations}>
196+
<Tabs.Trigger value="/mutations">
203197
Mutations ({client?.mutations.total ?? 0})
204198
</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>
208202
</Tabs.List>
209203
<div className="ml-auto flex-1 justify-end flex items-center gap-2 h-full">
210204
{client?.version && (
@@ -272,51 +266,42 @@ export const App = () => {
272266
*/}
273267
<Tabs.Content
274268
className="flex flex-col flex-1"
275-
value={Screens.Explorer}
269+
value="/explorer"
276270
forceMount
277271
>
278272
<Explorer
279273
clientId={selectedClientId}
280-
isVisible={selected === Screens.Explorer}
274+
isVisible={tab?.pathname === "/explorer"}
281275
embeddedExplorerProps={{
282276
embeddedExplorerIFrame,
283277
setEmbeddedExplorerIFrame,
284278
}}
285279
/>
286280
</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">
291282
<TabErrorBoundary remarks="Error on Queries tab:">
292283
<Queries
293284
clientId={selectedClientId}
294285
explorerIFrame={embeddedExplorerIFrame}
295286
/>
296287
</TabErrorBoundary>
297288
</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">
302290
<TabErrorBoundary remarks="Error on Mutations tab:">
303291
<Mutations
304292
clientId={selectedClientId}
305293
explorerIFrame={embeddedExplorerIFrame}
306294
/>
307295
</TabErrorBoundary>
308296
</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">
313298
<TabErrorBoundary remarks="Error on Connectors tab:">
314299
<Suspense fallback={<PageSpinner />}>
315300
<Outlet />
316301
</Suspense>
317302
</TabErrorBoundary>
318303
</Tabs.Content>
319-
<Tabs.Content className="flex-1 overflow-hidden" value={Screens.Cache}>
304+
<Tabs.Content className="flex-1 overflow-hidden" value="/cache">
320305
<TabErrorBoundary remarks="Error on Cache tab:">
321306
<Cache clientId={selectedClientId} />
322307
</TabErrorBoundary>

src/application/components/Layouts/Navigation.tsx

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/application/components/Queries/RunInExplorerButton.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import {
33
postMessageToEmbed,
44
SET_OPERATION,
55
} from "../Explorer/postMessageHelpers";
6-
import { currentScreen, Screens } from "../Layouts/Navigation";
76
import IconRun from "@apollo/icons/default/IconRun.svg";
87
import { Button } from "../Button";
8+
import { useNavigate } from "react-router-dom";
99

1010
interface RunInExplorerButtonProps {
1111
operation: string;
@@ -18,6 +18,8 @@ export const RunInExplorerButton = ({
1818
variables,
1919
embeddedExplorerIFrame,
2020
}: RunInExplorerButtonProps): JSX.Element | null => {
21+
const navigate = useNavigate();
22+
2123
return (
2224
<Button
2325
variant="secondary"
@@ -36,7 +38,7 @@ export const RunInExplorerButton = ({
3638
},
3739
embeddedExplorerIFrame,
3840
});
39-
currentScreen(Screens.Explorer);
41+
navigate("/explorer");
4042
}
4143
}}
4244
>

src/application/router.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import * as ConnectorRequestPage from "./pages/connectors/$operationId/requests/
1414
export const router = createMemoryRouter(
1515
createRoutesFromElements(
1616
<Route path="/" element={<App />}>
17+
<Route path="queries" />
18+
<Route path="mutations" />
19+
<Route path="cache" />
20+
<Route path="explorer" />
1721
<Route path="connectors" element={<ConnectorsPage.Route />}>
1822
<Route index element={<ConnectorsIndexPage.Route />} />
1923
<Route
@@ -29,5 +33,6 @@ export const router = createMemoryRouter(
2933
</Route>
3034
</Route>
3135
</Route>
32-
)
36+
),
37+
{ initialEntries: ["/queries"] }
3338
);

0 commit comments

Comments
 (0)