const path = require("path"); const { app, BrowserWindow, Tray, Menu, ipcMain } = require("electron"); const isDev = require("electron-is-dev"); const settings = require("electron-settings"); const { default: ipcTypes } = require("../src/ipc.types"); require("./ipc-main-handler"); // Conditionally include the dev tools installer to load React Dev Tools let installExtension, REACT_DEVELOPER_TOOLS; if (isDev) { const devTools = require("electron-devtools-installer"); installExtension = devTools.default; REACT_DEVELOPER_TOOLS = devTools.REACT_DEVELOPER_TOOLS; } // Handle creating/removing shortcuts on Windows when installing/uninstalling if (require("electron-squirrel-startup")) { app.quit(); } console.log(`${__dirname}/preload.js`); let mainWindow; let tray = null; function createWindow() { makeSingleInstance(); // Create the browser window. mainWindow = new BrowserWindow({ width: 800, height: 600, title: "ImEX RPS", icon: path.join(__dirname, "../src/assets/logo192.png"), webPreferences: { nodeIntegration: false, enableRemoteModule: false, worldSafeExecuteJavaScript: true, contextIsolation: true, preload: path.join(__dirname, "preload.js"), // use a preload script }, }); // and load the index.html of the app. // win.loadFile("index.html"); mainWindow.loadURL( isDev ? "http://localhost:3000" : `file://${path.join(__dirname, "../build/index.html")}` ); // mainWindow.on("close", function (event) { // event.preventDefault(); // mainWindow.hide(); // tray = createTray(); // }); mainWindow.on("minimize", function (event) { event.preventDefault(); mainWindow.hide(); tray = createTray(); }); ipcMain.on(ipcTypes.quit, (event, arg) => { app.isQuiting = true; app.quit(); }); // Open the DevTools. if (isDev) { mainWindow.webContents.openDevTools({ // mode: "detach" }); } } exports.mainWindow = mainWindow; // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.whenReady().then(() => { createWindow(); if (isDev) { console.log(`Path to Settings File: ${settings.file()}`); installExtension(REACT_DEVELOPER_TOOLS) .then((name) => console.log(`Added Extension: ${name}`)) .catch((error) => console.log(`An error occurred: , ${error}`)); } // ipcMain.on(ipcTypes.default.webcontent, (event, ...obj) => { // console.log("event", event); // mainWindow.webContents.send(event, obj); // }); }); if (isDev) app.setAppUserModelId(process.execPath); // Quit when all windows are closed, except on macOS. There, it's common // for applications and their menu bar to stay active until the user quits // explicitly with Cmd + Q. app.on("window-all-closed", () => { if (process.platform !== "darwin") { app.quit(); } }); app.on("activate", () => { // On macOS it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); // In this file you can include the rest of your app's specific main process // code. You can also put them in separate files and require them here. function makeSingleInstance() { if (process.mas) return; app.requestSingleInstanceLock(); app.on("second-instance", () => { if (mainWindow) { if (mainWindow.isMinimized()) mainWindow.restore(); mainWindow.focus(); } }); } function createTray() { let appIcon = new Tray(path.join(__dirname, "../src/assets/logo192.png")); const contextMenu = Menu.buildFromTemplate([ { label: "Show", click: function () { mainWindow.show(); }, }, { label: "Exit", click: function () { app.isQuiting = true; app.quit(); }, }, ]); appIcon.on("double-click", function (event) { mainWindow.show(); }); appIcon.setToolTip("ImEX RPS"); appIcon.setContextMenu(contextMenu); return appIcon; }