-
Notifications
You must be signed in to change notification settings - Fork 153
/
Copy pathBoot.tsx
104 lines (96 loc) · 3.01 KB
/
Boot.tsx
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import {
Grid,
Theme,
injectGlobalStyles,
themeProps,
ToastsProvider,
} from "@artsy/palette"
import { SystemContextProvider, track } from "v2/System"
import { AppRouteConfig } from "v2/System/Router/Route"
import { useEffect } from "react"
import * as React from "react"
import { HeadProvider } from "react-head"
import { Environment } from "relay-runtime"
// eslint-disable-next-line no-restricted-imports
import { data as sd } from "sharify"
import { Provider as StateProvider } from "unstated"
import Events from "v2/Utils/Events"
import { getENV } from "v2/Utils/getENV"
import { ErrorBoundary } from "./ErrorBoundary"
import { FocusVisible } from "v2/Components/FocusVisible"
import {
MatchingMediaQueries,
MediaContextProvider,
ResponsiveProvider,
} from "v2/Utils/Responsive"
import { AnalyticsContext } from "../Analytics/AnalyticsContext"
import { ClientContext } from "desktop/lib/buildClientAppContext"
import { FlashMessage } from "v2/Components/Modal/FlashModal"
import { SiftContainer } from "v2/Utils/SiftContainer"
import { setupSentryClient } from "lib/setupSentryClient"
import "v2/System/i18n/i18n"
export interface BootProps {
children: React.ReactNode
context: ClientContext
headTags?: JSX.Element[]
onlyMatchMediaQueries?: MatchingMediaQueries
relayEnvironment: Environment
routes: AppRouteConfig[]
user: User | null
}
const { GlobalStyles } = injectGlobalStyles()
export const Boot = track(undefined, {
dispatch: Events.postEvent,
})((props: BootProps) => {
/**
* Let our end-to-end tests know that the app is hydrated and ready to go; and
* if in prod, initialize Sentry.
*/
useEffect(() => {
document.body.setAttribute("data-test", "AppReady") //
if (getENV("NODE_ENV") === "production") {
setupSentryClient(sd)
}
}, [])
const {
children,
context,
headTags = [],
onlyMatchMediaQueries,
...rest
} = props
const contextProps = {
...rest,
...context,
}
return (
<Theme>
<GlobalStyles />
<HeadProvider headTags={headTags}>
<StateProvider>
<SystemContextProvider {...contextProps}>
<AnalyticsContext.Provider value={context?.analytics}>
<ErrorBoundary>
<MediaContextProvider onlyMatch={onlyMatchMediaQueries}>
<ResponsiveProvider
mediaQueries={themeProps.mediaQueries}
initialMatchingMediaQueries={onlyMatchMediaQueries as any}
>
<ToastsProvider>
<Grid fluid maxWidth="100%">
<FlashMessage />
<FocusVisible />
<SiftContainer />
{children}
</Grid>
</ToastsProvider>
</ResponsiveProvider>
</MediaContextProvider>
</ErrorBoundary>
</AnalyticsContext.Provider>
</SystemContextProvider>
</StateProvider>
</HeadProvider>
</Theme>
)
})