-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathinfrastructure-providers.component.tsx
More file actions
83 lines (72 loc) · 3.44 KB
/
infrastructure-providers.component.tsx
File metadata and controls
83 lines (72 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright (C) 2022-2025 Intel Corporation
// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE
import { FC, ReactNode, StrictMode, Suspense, useState } from 'react';
import { useFeatureFlags } from '@geti/core/src/feature-flags/hooks/use-feature-flags.hook';
import { ApplicationServicesProvider } from '@geti/core/src/services/application-services-provider.component';
import { IntelBrandedLoading } from '@geti/ui';
import { createBrowserRouter, createRoutesFromElements, RouterProvider, RouterProviderProps } from 'react-router-dom';
import { ErrorBoundary } from '../pages/errors/error-boundary.component';
import { AuthProvider } from './auth-provider/auth-provider.component';
import { ProgressiveWebAppProvider } from './progressive-web-app-provider/progressive-web-app-provider.component';
import { QueryClientProvider } from './query-client-provider/query-client-provider.component';
import { ThemeProvider } from './theme-provider.component';
const useInMemoryEnvironment = process.env.REACT_APP_VALIDATION_COMPONENT_TESTS === 'true';
// Context will be used for preloading data
type Context = unknown;
interface InfrastructureProvidersProps {
routes: Array<(context?: Context) => ReactNode>;
isAdminBuild?: boolean;
}
type AppProps = Pick<InfrastructureProvidersProps, 'routes'>;
export const App: FC<AppProps> = ({ routes }) => {
// Load feature flags at the top of the tree leveraging the suspense.
useFeatureFlags();
const [router] = useState<RouterProviderProps['router']>(() =>
createBrowserRouter(createRoutesFromElements(routes.map((routesGroup) => routesGroup())), {
future: {
v7_relativeSplatPath: true,
v7_fetcherPersist: true,
v7_normalizeFormMethod: true,
v7_partialHydration: true,
v7_skipActionErrorRevalidation: true,
},
})
);
return (
<ThemeProvider router={router}>
<RouterProvider
router={router}
fallbackElement={<IntelBrandedLoading />}
future={{
v7_startTransition: true,
}}
/>
<div id='custom-notification'></div>
</ThemeProvider>
);
};
export const InfrastructureProviders: FC<InfrastructureProvidersProps> = ({ routes, isAdminBuild = false }) => {
return (
<StrictMode>
<ProgressiveWebAppProvider>
<QueryClientProvider>
{/*
The goal of this additional ThemeProvider (the second one in inside the App) is to have proper
styles for the ErrorBoundary views that might be triggered by feature flags or deployment config
*/}
<ThemeProvider>
<ErrorBoundary>
<Suspense fallback={<IntelBrandedLoading />}>
<ApplicationServicesProvider useInMemoryEnvironment={useInMemoryEnvironment}>
<AuthProvider isAdmin={isAdminBuild}>
<App routes={routes} />
</AuthProvider>
</ApplicationServicesProvider>
</Suspense>
</ErrorBoundary>
</ThemeProvider>
</QueryClientProvider>
</ProgressiveWebAppProvider>
</StrictMode>
);
};