import { app, BrowserWindow } from 'electron'; import { join } from 'path'; import { RendererIpcMessage } from '@sophie/shared'; 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'), } }); const { webContents } = mainWindow; // See https://github.com/MarshallOfSound/electron-devtools-installer/issues/195#issuecomment-998872878 if (isDevelopment) { webContents.once('dom-ready', () => { webContents.once('devtools-opened', () => { mainWindow?.focus(); }); webContents.openDevTools(); }); } mainWindow.on('ready-to-show', () => { mainWindow?.show(); }); webContents.on('ipc-message', (_event, channel, ...args) => { switch (channel) { case RendererIpcMessage.ButtonClicked: console.log('Button clicked'); break; default: console.warn('Unknown IPC message:', channel, args); break; } }); 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); });