import { app, BrowserWindow } from 'electron'; import { join } from 'path'; import { URL } from 'url'; const isSingleInstance = app.requestSingleInstanceLock(); const isDevelopment = import.meta.env.MODE === 'development'; if (!isSingleInstance) { app.quit(); process.exit(0); } app.enableSandbox(); if (isDevelopment) { app.whenReady().then(async () => { const { default: installExtension, MOBX_DEVTOOLS, REACT_DEVELOPER_TOOLS, } = await import('electron-devtools-installer'); installExtension( [ MOBX_DEVTOOLS, REACT_DEVELOPER_TOOLS, ], { forceDownload: false, loadExtensionOptions: { allowFileAccess: true, }, }, ); }).catch((err) => { console.error('Failed to install devtools extension', err); }); } let mainWindow: BrowserWindow | null = null; function createWindow(): Promise { mainWindow = new BrowserWindow({ show: false, webPreferences: { nativeWindowOpen: true, webviewTag: false, sandbox: true, preload: join(__dirname, '../../preload/dist/index.cjs'), } }); // See https://github.com/MarshallOfSound/electron-devtools-installer/issues/195#issuecomment-998872878 if (isDevelopment) { const { webContents } = mainWindow; webContents.once('dom-ready', () => { webContents.once('devtools-opened', () => { mainWindow?.focus(); }); webContents.openDevTools(); }); } mainWindow.on('ready-to-show', () => { mainWindow?.show(); }); const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined) ? import.meta.env.VITE_DEV_SERVER_URL : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString(); return mainWindow.loadURL(pageUrl); } app.on('second-instance', () => { if (mainWindow !== null) { if (!mainWindow.isVisible()) { mainWindow.show(); } if (mainWindow.isMinimized()) { mainWindow.restore(); } mainWindow.focus(); } }); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); app.whenReady().then(createWindow).catch((err) => { console.error('Failed to create window', err); process.exit(1); });