'use strict' import path from 'path' import { app, protocol, shell, BrowserWindow, Menu } from 'electron' import ContextMenu from 'electron-context-menu' import { createProtocol, installVueDevtools } from 'vue-cli-plugin-electron-builder/lib' import { bugs } from '../package.json' import thedeskInfo from '../info.json' const isDevelopment = process.env.NODE_ENV !== 'production' // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. let win ContextMenu() // Standard scheme must be registered before the app is ready protocol.registerStandardSchemes(['app'], { secure: true }) function createWindow () { // Create the browser window. win = new BrowserWindow({ width: 800, height: 600, icon: path.join(__static, 'icon.png') }) win.setMenuBarVisibility(true) if (process.env.WEBPACK_DEV_SERVER_URL) { // Load the url of the dev server if in development mode win.loadURL(process.env.WEBPACK_DEV_SERVER_URL) if (!process.env.IS_TEST) win.webContents.openDevTools() } else { createProtocol('app') // Load the index.html when not in development win.loadURL('app://./index.html') } win.on('closed', () => { win = null }) } // Quit when all windows are closed. app.on('window-all-closed', () => { // On macOS it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q 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 (win === null) { createWindow() } }) // 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.on('ready', async () => { if (isDevelopment && !process.env.IS_TEST) { // Install Vue Devtools try { await installVueDevtools() } catch (e) { console.error('Vue Devtools failed to install:', e.toString()) } } createWindow() }) // Exit cleanly on request from parent process in development mode. if (isDevelopment) { if (process.platform === 'win32') { process.on('message', data => { if (data === 'graceful-exit') { app.quit() } }) } else { process.on('SIGTERM', () => { app.quit() }) } } const template = [ { label: app.getName(), submenu: [ { role: 'about' }, ] }, { label: 'Edit', submenu: [ { role: 'undo' }, { role: 'redo' }, { type: 'separator' }, { role: 'cut' }, { role: 'copy' }, { role: 'paste' }, { role: 'pasteandmatchstyle' }, { role: 'delete' }, { role: 'selectall' }, ] }, { label: 'View', submenu: [ { role: 'reload' }, { role: 'forcereload' }, { role: 'toggledevtools' }, { type: 'separator' }, { role: 'togglefullscreen' }, ] }, { role: 'Window', submenu: [ { role: 'minimize' }, { role: 'close' }, ] }, { role: 'help', submenu: [ { label: 'Report an issue', click: () => shell.openExternal(`${bugs.url}/new`), }, { label: 'Learn More', click: () => shell.openExternal(thedeskInfo.documentURL), } ] } ] if (process.platform === 'darwin') { template[0].submenu.push( { type: 'separator' }, { role: 'services' }, { type: 'separator' }, { role: 'hide' }, { role: 'hideothers' }, { role: 'unhide' }, { type: 'separator' }, { role: 'quit' }, ) template[1].submenu.push( { type: 'separator' }, { label: 'Speech', submenu: [ { role: 'startspeaking' }, { role: 'stopspeaking' }, ] } ) template[3].submenu = [ { role: 'close' }, { role: 'minimize' }, { role: 'zoom' }, { type: 'separator' }, { role: 'front' }, ] } const menu = Menu.buildFromTemplate(template) Menu.setApplicationMenu(menu)