-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.tsx
More file actions
70 lines (61 loc) · 2.32 KB
/
Copy pathindex.tsx
File metadata and controls
70 lines (61 loc) · 2.32 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
import { createApiGateway } from "@openstax/ts-utils/services/apiGateway";
import { createUserRoleValidator } from "@openstax/ts-utils/services/authProvider/utils/userRoleValidator";
import { ErrorBoundary, createSentryLogger } from "@openstax/ui-components";
import { createBrowserHistory, Location } from "history";
import React from 'react';
import { createRoot } from 'react-dom/client';
import { createAuthProvider } from "./auth/authProvider";
import { frontendConfigProvider } from "./configProvider";
import { getRequestResponder } from "./core";
import { serviceProviderMiddleware } from "./core/context/services";
import { composeResponseServiceMiddleware } from "./core/services";
import './index.css';
/*
* the use of the service container pattern in an app that only
* has one entry point is pretty academic. it might become relevant
* if you had some external dependencies the FE accessed directly
* that you wanted to use a fake driver for in dev (or something like that)
*/
const makeApiGateway = createApiGateway({fetch: fetch.bind(window)});
const configProvider = frontendConfigProvider(makeApiGateway);
const authProvider = createAuthProvider({window})(configProvider);
const services = {
authProvider,
logger: createSentryLogger(),
roleValidator: createUserRoleValidator(authProvider, {application: () => configProvider.getValue('roleApplication')}),
history: createBrowserHistory(),
createApiGateway: makeApiGateway,
configProvider,
};
export type BrowserServices = typeof services;
const handler = getRequestResponder(services, composeResponseServiceMiddleware(
serviceProviderMiddleware,
));
const Router = () => {
const [location, setLocation] = React.useState<Location>(services.history.location);
React.useEffect(() => {
return services.history.listen((locationChange) => {
setLocation(locationChange.location);
});
}, []);
return <>{handler(location)}</>;
};
const ErrorBoundaryComponent = () => {
return (
<ErrorBoundary
renderFallback
// sentryDsn='https://examplePublicKey@o0.ingest.sentry.io/0'
>
<Router />
</ErrorBoundary>
);
};
const container = document.getElementById('root');
if (!container) {
throw new Error('Root container #root not found');
}
createRoot(container).render(
<React.StrictMode>
<ErrorBoundaryComponent />
</React.StrictMode>
);