Skip to content

Commit bdad21f

Browse files
committed
Performance regression fix: load pre-sent GraphQL queries into the ApolloClient instance
1 parent ea00c0a commit bdad21f

1 file changed

Lines changed: 22 additions & 8 deletions

File tree

app/javascript/packs/application.tsx

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'regenerator-runtime/runtime';
22

33
import mountReactComponents from '../mountReactComponents';
4-
import { StrictMode, use, useMemo } from 'react';
4+
import { StrictMode, use, useEffect, useMemo, useState } from 'react';
55
import AuthenticityTokensManager, { getAuthenticityTokensURL } from 'AuthenticityTokensContext';
66
import { createBrowserRouter, RouterContextProvider, RouterProvider } from 'react-router';
77
import { buildBrowserApolloClient } from 'useIntercodeApolloClient';
@@ -14,24 +14,41 @@ import {
1414
} from 'AppContexts';
1515
import { ClientConfigurationQueryData } from 'serverQueries.generated';
1616
import { appRootRoutes } from 'AppRouter';
17+
import { ApolloClient, OperationVariables } from '@apollo/client';
1718

1819
const manager = new AuthenticityTokensManager(fetch, undefined, getAuthenticityTokensURL());
1920
const refreshPromise = manager.refresh();
21+
const client = buildBrowserApolloClient(manager);
2022

2123
export type DataModeApplicationEntryProps = {
2224
recaptchaSiteKey: string;
2325
railsDefaultActiveStorageServiceName: string;
2426
railsDirectUploadsUrl: string;
27+
queryData?: ApolloClient.WriteQueryOptions<unknown, OperationVariables>[];
2528
};
2629

2730
function DataModeApplicationEntry({
2831
recaptchaSiteKey,
2932
railsDefaultActiveStorageServiceName,
3033
railsDirectUploadsUrl,
34+
queryData,
3135
}: DataModeApplicationEntryProps) {
3236
use(refreshPromise);
3337

34-
const client = useMemo(() => buildBrowserApolloClient(manager), []);
38+
const [queryPreloadComplete, setQueryPreloadComplete] = useState(false);
39+
useEffect(() => {
40+
if (queryData && Array.isArray(queryData)) {
41+
for (const query of queryData) {
42+
try {
43+
client.writeQuery(query);
44+
} catch {
45+
// don't blow up if we get a malformed query
46+
}
47+
}
48+
}
49+
50+
setQueryPreloadComplete(true);
51+
}, [queryData]);
3552

3653
const clientConfigurationData = useMemo<ClientConfigurationQueryData>(
3754
() => ({
@@ -48,6 +65,7 @@ function DataModeApplicationEntry({
4865

4966
const router = useMemo(
5067
() =>
68+
queryPreloadComplete &&
5169
createBrowserRouter(
5270
[
5371
{
@@ -67,14 +85,10 @@ function DataModeApplicationEntry({
6785
},
6886
},
6987
),
70-
[client, clientConfigurationData],
88+
[clientConfigurationData, queryPreloadComplete],
7189
);
7290

73-
return (
74-
<StrictMode>
75-
<RouterProvider router={router} />
76-
</StrictMode>
77-
);
91+
return <StrictMode>{router && <RouterProvider router={router} />}</StrictMode>;
7892
}
7993

8094
mountReactComponents({ AppRoot: DataModeApplicationEntry });

0 commit comments

Comments
 (0)