-
Notifications
You must be signed in to change notification settings - Fork 37
/
Copy pathApp.tsx
107 lines (99 loc) · 4 KB
/
App.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
105
106
107
/**
* (c) 2022, Micro:bit Educational Foundation and contributors
*
* SPDX-License-Identifier: MIT
*/
import { ChakraProvider } from "@chakra-ui/react";
import { polyfill } from "mobile-drag-drop";
import { useEffect } from "react";
import "./App.css";
import { DialogProvider } from "./common/use-dialogs";
import VisualViewPortCSSVariables from "./common/VisualViewportCSSVariables";
import { deployment, useDeployment } from "./deployment";
import { MicrobitWebUSBConnection } from "./device/webusb";
import { DeviceContextProvider } from "./device/device-hooks";
import { MockDeviceConnection } from "./device/mock";
import DocumentationProvider from "./documentation/documentation-hooks";
import SearchProvider from "./documentation/search/search-hooks";
import { ActiveEditorProvider } from "./editor/active-editor-hooks";
import { FileSystem } from "./fs/fs";
import { FileSystemProvider } from "./fs/fs-hooks";
import { createHost } from "./fs/host";
import { fetchMicroPython } from "./micropython/micropython";
import { LanguageServerClientProvider } from "./language-server/language-server-hooks";
import { LoggingProvider } from "./logging/logging-hooks";
import TranslationProvider from "./messages/TranslationProvider";
import ProjectDropTarget from "./project/ProjectDropTarget";
import { RouterProvider } from "./router-hooks";
import SessionSettingsProvider from "./settings/session-settings";
import SettingsProvider from "./settings/settings";
import BeforeUnloadDirtyCheck from "./workbench/BeforeUnloadDirtyCheck";
import { SelectionProvider } from "./workbench/use-selection";
import Workbench from "./workbench/Workbench";
const isMockDeviceMode = () =>
// We use a cookie set from the e2e tests. Avoids having separate test and live builds.
Boolean(
document.cookie.split("; ").find((row) => row.startsWith("mockDevice="))
);
const logging = deployment.logging;
const device = isMockDeviceMode()
? new MockDeviceConnection()
: new MicrobitWebUSBConnection({ logging });
const host = createHost(logging);
const fs = new FileSystem(logging, host, fetchMicroPython);
// If this fails then we retry on access.
fs.initializeInBackground();
const App = () => {
useEffect(() => {
logging.event({ type: "boot" });
device.initialize();
return () => {
device.dispose();
};
}, []);
polyfill({
forceApply: true,
});
const deployment = useDeployment();
const { ConsentProvider } = deployment.compliance;
return (
<>
<VisualViewPortCSSVariables />
<ChakraProvider theme={deployment.chakraTheme}>
<LoggingProvider value={logging}>
<SettingsProvider>
<SessionSettingsProvider>
<TranslationProvider>
<FileSystemProvider value={fs}>
<DeviceContextProvider value={device}>
<LanguageServerClientProvider>
<BeforeUnloadDirtyCheck />
<DocumentationProvider>
<SearchProvider>
<SelectionProvider>
<DialogProvider>
<RouterProvider>
<ConsentProvider>
<ProjectDropTarget>
<ActiveEditorProvider>
<Workbench />
</ActiveEditorProvider>
</ProjectDropTarget>
</ConsentProvider>
</RouterProvider>
</DialogProvider>
</SelectionProvider>
</SearchProvider>
</DocumentationProvider>
</LanguageServerClientProvider>
</DeviceContextProvider>
</FileSystemProvider>
</TranslationProvider>
</SessionSettingsProvider>
</SettingsProvider>
</LoggingProvider>
</ChakraProvider>
</>
);
};
export default App;