aboutsummaryrefslogtreecommitdiffstats
path: root/packages/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'packages/renderer')
-rw-r--r--packages/renderer/package.json6
-rw-r--r--packages/renderer/src/devTools.ts37
-rw-r--r--packages/renderer/src/index.tsx23
-rw-r--r--packages/renderer/tsconfig.json3
-rw-r--r--packages/renderer/vite.config.js3
5 files changed, 69 insertions, 3 deletions
diff --git a/packages/renderer/package.json b/packages/renderer/package.json
index 559e668..ee627b4 100644
--- a/packages/renderer/package.json
+++ b/packages/renderer/package.json
@@ -14,13 +14,17 @@
14 "@mui/icons-material": "^5.2.5", 14 "@mui/icons-material": "^5.2.5",
15 "@mui/material": "^5.2.5", 15 "@mui/material": "^5.2.5",
16 "@sophie/shared": "workspace:*", 16 "@sophie/shared": "workspace:*",
17 "mobx": "^6.3.10",
18 "mobx-state-tree": "^5.1.0",
17 "react": "^17.0.2", 19 "react": "^17.0.2",
18 "react-dom": "^17.0.2" 20 "react-dom": "^17.0.2"
19 }, 21 },
20 "devDependencies": { 22 "devDependencies": {
21 "@types/react": "^17.0.37", 23 "@types/react": "^17.0.38",
22 "@types/react-dom": "^17.0.11", 24 "@types/react-dom": "^17.0.11",
23 "@vitejs/plugin-react": "^1.1.3", 25 "@vitejs/plugin-react": "^1.1.3",
26 "mst-middlewares": "^5.1.0",
27 "remotedev": "^0.2.9",
24 "typescript": "^4.5.4", 28 "typescript": "^4.5.4",
25 "vite": "^2.7.6" 29 "vite": "^2.7.6"
26 } 30 }
diff --git a/packages/renderer/src/devTools.ts b/packages/renderer/src/devTools.ts
new file mode 100644
index 0000000..5930c48
--- /dev/null
+++ b/packages/renderer/src/devTools.ts
@@ -0,0 +1,37 @@
1import type { IAnyStateTreeNode } from 'mobx-state-tree';
2
3/**
4 * Connects the `model` to the redux devtools extension after loading the required
5 * dependencies asynchronously.
6 *
7 * We have to apply a workaround to load `remotedev` by shimming the `global` object,
8 * because `remotedev` uses an old version of `socketcluster-client` that refers to
9 * `global` instead of `globalThis`.
10 *
11 * Due to the old dependencies, this function is not safe to call in production.
12 * However, we don't bundle `remotedev` in production, so the call would fail anyways.
13 *
14 * @param model The store to connect to the redux devtools.
15 * @see https://github.com/SocketCluster/socketcluster-client/issues/118#issuecomment-469064682
16 */
17async function exposeToReduxDevtoolsAsync(model: IAnyStateTreeNode): Promise<void> {
18 (window as { global?: unknown }).global = window;
19
20 const [remotedev, { connectReduxDevtools }] = await Promise.all([
21 // @ts-ignore
22 import('remotedev'),
23 import('mst-middlewares'),
24 ]);
25 connectReduxDevtools(remotedev, model);
26}
27
28/**
29 * Connects the `model` to the redux devtools extension.
30 *
31 * @param model The store to connect to the redux devtools.
32 */
33export function exposeToReduxDevtools(model: IAnyStateTreeNode): void {
34 exposeToReduxDevtoolsAsync(model).catch((err) => {
35 console.error('Could not connect to Redux devtools', err);
36 });
37}
diff --git a/packages/renderer/src/index.tsx b/packages/renderer/src/index.tsx
index 452448c..37daaa6 100644
--- a/packages/renderer/src/index.tsx
+++ b/packages/renderer/src/index.tsx
@@ -2,6 +2,7 @@ import '@fontsource/roboto/300.css';
2import '@fontsource/roboto/400.css'; 2import '@fontsource/roboto/400.css';
3import '@fontsource/roboto/500.css'; 3import '@fontsource/roboto/500.css';
4import '@fontsource/roboto/700.css'; 4import '@fontsource/roboto/700.css';
5import { applyPatch, applySnapshot } from 'mobx-state-tree';
5import Button from "@mui/material/Button"; 6import Button from "@mui/material/Button";
6import CssBaseline from "@mui/material/CssBaseline"; 7import CssBaseline from "@mui/material/CssBaseline";
7import { 8import {
@@ -10,6 +11,26 @@ import {
10} from '@mui/material/styles'; 11} from '@mui/material/styles';
11import React from 'react'; 12import React from 'react';
12import { render } from 'react-dom'; 13import { render } from 'react-dom';
14import { sharedStore } from '@sophie/shared';
15
16import { exposeToReduxDevtools } from './devTools';
17
18const isDevelopment = import.meta.env.MODE === 'development';
19
20const store = sharedStore.create();
21
22if (isDevelopment) {
23 exposeToReduxDevtools(store);
24}
25
26window.sophieRenderer.setSharedStoreListener({
27 onSnapshot(snapshot) {
28 applySnapshot(store, snapshot);
29 },
30 onPatch(patch) {
31 applyPatch(store, patch);
32 },
33});
13 34
14const theme = createTheme({ 35const theme = createTheme({
15 palette: { 36 palette: {
@@ -24,7 +45,7 @@ function App() {
24 <CssBaseline enableColorScheme /> 45 <CssBaseline enableColorScheme />
25 <Button 46 <Button
26 variant="contained" 47 variant="contained"
27 onClick={window.sophieRenderer.buttonClicked} 48 onClick={window.sophieRenderer.buttonClick}
28 > 49 >
29 Hello Sophie! 50 Hello Sophie!
30 </Button> 51 </Button>
diff --git a/packages/renderer/tsconfig.json b/packages/renderer/tsconfig.json
index 668356c..8746462 100644
--- a/packages/renderer/tsconfig.json
+++ b/packages/renderer/tsconfig.json
@@ -7,6 +7,9 @@
7 "dom", 7 "dom",
8 "dom.iterable", 8 "dom.iterable",
9 "esnext" 9 "esnext"
10 ],
11 "types": [
12 "vite/client"
10 ] 13 ]
11 }, 14 },
12 "references": [ 15 "references": [
diff --git a/packages/renderer/vite.config.js b/packages/renderer/vite.config.js
index ff34b6d..87c2d0c 100644
--- a/packages/renderer/vite.config.js
+++ b/packages/renderer/vite.config.js
@@ -3,7 +3,6 @@
3/* eslint-env node */ 3/* eslint-env node */
4 4
5import { builtinModules } from 'module'; 5import { builtinModules } from 'module';
6import { join } from 'path';
7import react from '@vitejs/plugin-react'; 6import react from '@vitejs/plugin-react';
8 7
9// `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless. 8// `resolveJsonModule` is disabled for this package, but vite will load the json nevertheless.
@@ -36,6 +35,8 @@ const config = {
36 assetsDir: '.', 35 assetsDir: '.',
37 rollupOptions: { 36 rollupOptions: {
38 external: [ 37 external: [
38 'mst-middlewares',
39 'remotedev',
39 ...builtinModules, 40 ...builtinModules,
40 ], 41 ],
41 }, 42 },