Created
November 4, 2022 21:25
-
-
Save alielmajdaoui/25e7961ebe654f19e49b31adc1e0b387 to your computer and use it in GitHub Desktop.
./src/main/main.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint global-require: off, no-console: off, promise/always-return: off */ | |
/** | |
* This module executes inside of electron's main process. You can start | |
* electron renderer process from here and communicate with the other processes | |
* through IPC. | |
* | |
* When running `npm run build` or `npm run build:main`, this file is compiled to | |
* `./src/main.js` using webpack. This gives us some performance wins. | |
*/ | |
import path from 'path'; | |
import { app, BrowserWindow, shell, ipcMain } from 'electron'; | |
import { autoUpdater } from 'electron-updater'; | |
import log from 'electron-log'; | |
import MenuBuilder from './menu'; | |
import { resolveHtmlPath } from './util'; | |
import { createWindow as createSettingsWindow } from '../settings-main/settings-main'; | |
class AppUpdater { | |
constructor() { | |
log.transports.file.level = 'info'; | |
autoUpdater.logger = log; | |
autoUpdater.checkForUpdatesAndNotify(); | |
} | |
} | |
let mainWindow: BrowserWindow | null = null; | |
ipcMain.on('ipc-example', async (event, arg) => { | |
const msgTemplate = (pingPong: string) => `IPC test: ${pingPong}`; | |
console.log(msgTemplate(arg)); | |
event.reply('ipc-example', msgTemplate('pong')); | |
}); | |
ipcMain.on('open-settings-window', async () => { | |
createSettingsWindow(); | |
}); | |
if (process.env.NODE_ENV === 'production') { | |
const sourceMapSupport = require('source-map-support'); | |
sourceMapSupport.install(); | |
} | |
const isDebug = | |
process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true'; | |
if (isDebug) { | |
require('electron-debug')(); | |
} | |
const installExtensions = async () => { | |
const installer = require('electron-devtools-installer'); | |
const forceDownload = !!process.env.UPGRADE_EXTENSIONS; | |
const extensions = ['REACT_DEVELOPER_TOOLS']; | |
return installer | |
.default( | |
extensions.map((name) => installer[name]), | |
forceDownload | |
) | |
.catch(console.log); | |
}; | |
const createWindow = async () => { | |
if (isDebug) { | |
await installExtensions(); | |
} | |
const RESOURCES_PATH = app.isPackaged | |
? path.join(process.resourcesPath, 'assets') | |
: path.join(__dirname, '../../assets'); | |
const getAssetPath = (...paths: string[]): string => { | |
return path.join(RESOURCES_PATH, ...paths); | |
}; | |
mainWindow = new BrowserWindow({ | |
show: false, | |
width: 1024, | |
height: 728, | |
icon: getAssetPath('icon.png'), | |
webPreferences: { | |
preload: app.isPackaged | |
? path.join(__dirname, 'preload.js') | |
: path.join(__dirname, '../../.erb/dll/preload.js'), | |
}, | |
}); | |
mainWindow.loadURL(resolveHtmlPath('main.html')); | |
mainWindow.on('ready-to-show', () => { | |
if (!mainWindow) { | |
throw new Error('"mainWindow" is not defined'); | |
} | |
if (process.env.START_MINIMIZED) { | |
mainWindow.minimize(); | |
} else { | |
mainWindow.show(); | |
} | |
}); | |
mainWindow.on('closed', () => { | |
mainWindow = null; | |
}); | |
const menuBuilder = new MenuBuilder(mainWindow); | |
menuBuilder.buildMenu(); | |
// Open urls in the user's browser | |
mainWindow.webContents.setWindowOpenHandler((edata) => { | |
shell.openExternal(edata.url); | |
return { action: 'deny' }; | |
}); | |
// Remove this if your app does not use auto updates | |
// eslint-disable-next-line | |
new AppUpdater(); | |
}; | |
/** | |
* Add event listeners... | |
*/ | |
app.on('window-all-closed', () => { | |
// Respect the OSX convention of having the application in memory even | |
// after all windows have been closed | |
if (process.platform !== 'darwin') { | |
app.quit(); | |
} | |
}); | |
app | |
.whenReady() | |
.then(() => { | |
createWindow(); | |
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 (mainWindow === null) createWindow(); | |
}); | |
}) | |
.catch(console.log); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment