const {app, BrowserWindow, dialog, ipcMain} = require('electron') const path = require('path') let mainWindow function createWindow () { mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js') } }) mainWindow.loadFile('index.html') } function showDialog (_, shouldAttachToMainWindow) { const abortCtrl = new AbortController() setTimeout(() => abortCtrl.abort(), 3_000) const parentWindow = shouldAttachToMainWindow ? mainWindow : undefined dialog.showMessageBox( // On MacOS if parentWindow is undefined this will behave like showMessageBoxSync // and will ignore the abort signal. Windows will dismiss the dialog parentWindow, { message: 'This should dismiss in 3 seconds', signal: abortCtrl.signal } ) } app.whenReady().then(() => { createWindow() app.on('activate', function () { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) ipcMain.on('show-dialog', showDialog) }) app.on('window-all-closed', function () { if (process.platform !== 'darwin') app.quit() })