11import 'regenerator-runtime/runtime' ;
22
33import mountReactComponents from '../mountReactComponents' ;
4- import { StrictMode , use , useMemo } from 'react' ;
4+ import { StrictMode , use , useEffect , useMemo , useState } from 'react' ;
55import AuthenticityTokensManager , { getAuthenticityTokensURL } from 'AuthenticityTokensContext' ;
66import { createBrowserRouter , RouterContextProvider , RouterProvider } from 'react-router' ;
77import { buildBrowserApolloClient } from 'useIntercodeApolloClient' ;
@@ -14,24 +14,41 @@ import {
1414} from 'AppContexts' ;
1515import { ClientConfigurationQueryData } from 'serverQueries.generated' ;
1616import { appRootRoutes } from 'AppRouter' ;
17+ import { ApolloClient , OperationVariables } from '@apollo/client' ;
1718
1819const manager = new AuthenticityTokensManager ( fetch , undefined , getAuthenticityTokensURL ( ) ) ;
1920const refreshPromise = manager . refresh ( ) ;
21+ const client = buildBrowserApolloClient ( manager ) ;
2022
2123export type DataModeApplicationEntryProps = {
2224 recaptchaSiteKey : string ;
2325 railsDefaultActiveStorageServiceName : string ;
2426 railsDirectUploadsUrl : string ;
27+ queryData ?: ApolloClient . WriteQueryOptions < unknown , OperationVariables > [ ] ;
2528} ;
2629
2730function 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
8094mountReactComponents ( { AppRoot : DataModeApplicationEntry } ) ;
0 commit comments