aboutsummaryrefslogtreecommitdiffstats
path: root/packages/main/src/index.ts
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-23 21:29:26 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-23 21:29:26 +0100
commitd303f2e3415237e1a519db21ad4e089c2ba7e9f9 (patch)
tree5d562dcaf7bb9c83c1930c7d7cf1b2c9de75e15b /packages/main/src/index.ts
parentbuild: Enable asar (diff)
downloadsophie-d303f2e3415237e1a519db21ad4e089c2ba7e9f9.tar.gz
sophie-d303f2e3415237e1a519db21ad4e089c2ba7e9f9.tar.zst
sophie-d303f2e3415237e1a519db21ad4e089c2ba7e9f9.zip
feat: Add BrowserView and synchronize its position
Diffstat (limited to 'packages/main/src/index.ts')
-rw-r--r--packages/main/src/index.ts63
1 files changed, 42 insertions, 21 deletions
diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts
index 90102a7..59b9ecb 100644
--- a/packages/main/src/index.ts
+++ b/packages/main/src/index.ts
@@ -18,11 +18,14 @@
18 * SPDX-License-Identifier: AGPL-3.0-only 18 * SPDX-License-Identifier: AGPL-3.0-only
19 */ 19 */
20 20
21import { app, BrowserWindow } from 'electron'; 21import { app, BrowserView, BrowserWindow } from 'electron';
22import { autorun } from 'mobx';
22import { getSnapshot, onPatch } from 'mobx-state-tree'; 23import { getSnapshot, onPatch } from 'mobx-state-tree';
23import { join } from 'path'; 24import { join } from 'path';
24import { 25import {
26 browserViewBounds,
25 MainToRendererIpcMessage, 27 MainToRendererIpcMessage,
28 paletteMode,
26 RendererToMainIpcMessage, 29 RendererToMainIpcMessage,
27} from '@sophie/shared'; 30} from '@sophie/shared';
28import { URL } from 'url'; 31import { URL } from 'url';
@@ -31,7 +34,7 @@ import {
31 installDevToolsExtensions, 34 installDevToolsExtensions,
32 openDevToolsWhenReady, 35 openDevToolsWhenReady,
33} from './devTools'; 36} from './devTools';
34import { rootStore } from './stores/RootStore'; 37import { createRootStore } from './stores/RootStore';
35 38
36const isSingleInstance = app.requestSingleInstanceLock(); 39const isSingleInstance = app.requestSingleInstanceLock();
37const isDevelopment = import.meta.env.MODE === 'development'; 40const isDevelopment = import.meta.env.MODE === 'development';
@@ -49,19 +52,13 @@ if (isDevelopment) {
49 52
50let mainWindow: BrowserWindow | null = null; 53let mainWindow: BrowserWindow | null = null;
51 54
52const store = rootStore.create({ 55const store = createRootStore();
53 shared: {
54 clickCount: 1,
55 },
56});
57 56
58function createWindow(): Promise<void> { 57async function createWindow(): Promise<void> {
59 mainWindow = new BrowserWindow({ 58 mainWindow = new BrowserWindow({
60 show: false, 59 show: false,
61 autoHideMenuBar: true, 60 autoHideMenuBar: true,
62 webPreferences: { 61 webPreferences: {
63 nativeWindowOpen: true,
64 webviewTag: false,
65 sandbox: true, 62 sandbox: true,
66 preload: join(__dirname, '../../preload/dist/index.cjs'), 63 preload: join(__dirname, '../../preload/dist/index.cjs'),
67 }, 64 },
@@ -78,16 +75,23 @@ function createWindow(): Promise<void> {
78 const { webContents } = mainWindow; 75 const { webContents } = mainWindow;
79 76
80 webContents.on('ipc-message', (_event, channel, ...args) => { 77 webContents.on('ipc-message', (_event, channel, ...args) => {
81 switch (channel) { 78 try {
82 case RendererToMainIpcMessage.SharedStoreSnapshotRequest: 79 switch (channel) {
83 webContents.send(MainToRendererIpcMessage.SharedStoreSnapshot, getSnapshot(store.shared)); 80 case RendererToMainIpcMessage.SharedStoreSnapshotRequest:
84 break; 81 webContents.send(MainToRendererIpcMessage.SharedStoreSnapshot, getSnapshot(store.shared));
85 case RendererToMainIpcMessage.ButtonClick: 82 break;
86 store.buttonClick(); 83 case RendererToMainIpcMessage.SetBrowserViewBounds:
87 break; 84 store.setBrowserViewBounds(browserViewBounds.parse(args[0]));
88 default: 85 break;
89 console.warn('Unknown IPC message:', channel, args); 86 case RendererToMainIpcMessage.SetPaletteMode:
90 break; 87 store.setPaletteMode(paletteMode.parse(args[0]))
88 break;
89 default:
90 console.warn('Unknown IPC message:', channel, args);
91 break;
92 }
93 } catch (err) {
94 console.error('Error while processing IPC message:', channel, args, err);
91 } 95 }
92 }); 96 });
93 97
@@ -99,7 +103,24 @@ function createWindow(): Promise<void> {
99 ? import.meta.env.VITE_DEV_SERVER_URL 103 ? import.meta.env.VITE_DEV_SERVER_URL
100 : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString(); 104 : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString();
101 105
102 return mainWindow.loadURL(pageUrl); 106 const browserView = new BrowserView({
107 webPreferences: {
108 sandbox: true,
109 partition: 'service',
110 },
111 });
112
113 browserView.setBackgroundColor('#fff');
114
115 autorun(() => {
116 browserView.setBounds(store.shared.browserViewBounds);
117 });
118
119 await mainWindow.loadURL(pageUrl);
120
121 mainWindow.addBrowserView(browserView);
122
123 return browserView.webContents.loadURL('https://git.marussy.com/sophie/about');
103} 124}
104 125
105app.on('second-instance', () => { 126app.on('second-instance', () => {