diff --git a/electron_app/build/background.png b/electron_app/build/background.png index f8415bc3b..31430de86 100644 Binary files a/electron_app/build/background.png and b/electron_app/build/background.png differ diff --git a/electron_app/build/icon.icns b/electron_app/build/icon.icns index 1ceeb09c9..21c74c27e 100644 Binary files a/electron_app/build/icon.icns and b/electron_app/build/icon.icns differ diff --git a/electron_app/electron-starter.js b/electron_app/electron-starter.js index 2f68d99d4..ce485cace 100644 --- a/electron_app/electron-starter.js +++ b/electron_app/electron-starter.js @@ -1,7 +1,7 @@ -const { app, ipcMain, dialog } = require('electron'); +const { app, ipcMain, dialog, Menu } = require('electron'); const dbManager = require('./src/DBManager'); const myAccount = require('./src/Account'); -const wsClient = require('./src/socketClient') +const wsClient = require('./src/socketClient'); const globalManager = require('./src/globalManager'); const loginWindow = require('./src/windows/login'); @@ -9,6 +9,7 @@ const dialogWindow = require('./src/windows/dialog'); const mailboxWindow = require('./src/windows/mailbox'); const loadingWindow = require('./src/windows/loading'); const composerWindowManager = require('./src/windows/composer'); +const { template } = require('./src/windows/menu'); async function initApp() { try { @@ -102,11 +103,14 @@ async function initApp() { }) } - // App app.disableHardwareAcceleration(); -app.on('ready', initApp); +app.on('ready', () => { + const menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); + initApp(); +}); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { @@ -114,8 +118,4 @@ app.on('window-all-closed', () => { } }); -app.on('activate', () => { - if (loginWindow === undefined) { - initApp(); - } -}); +app.on('activate', initApp); \ No newline at end of file diff --git a/electron_app/package.json b/electron_app/package.json index 81605b244..21e8cd7ec 100644 --- a/electron_app/package.json +++ b/electron_app/package.json @@ -11,9 +11,13 @@ "productName": "Criptext", "main": "./electron-starter.js", "description": "Email service encrypted with signal", + "repository": { + "type": "git", + "url": "https://github.com/Criptext/Criptext-Email-React-Client.git" + }, "scripts": { "electron": "electron .", - "set-env": "NODE_ENV=development MAILBOX_URL=http://localhost:3000 DIALOG_URL=http://localhost:3006 LOGIN_URL=http://localhost:3005 LOADING_URL=http://localhost:3003 COMPOSER_URL=http://localhost:3004 REACT_APP_KEYSERVER_URL=http://localhost:8000 REACT_APP_SOCKETSERVER_URL=ws://localhost:3001", + "set-env": "NODE_ENV=development DEBUG=electron-builder MAILBOX_URL=http://localhost:3000 DIALOG_URL=http://localhost:3006 LOGIN_URL=http://localhost:3005 LOADING_URL=http://localhost:3003 COMPOSER_URL=http://localhost:3004 REACT_APP_KEYSERVER_URL=http://localhost:8000 REACT_APP_SOCKETSERVER_URL=ws://localhost:3001", "start": "npm run set-env electron .", "postinstall": "install-app-deps", "test": "criptext-js-tools test", @@ -26,11 +30,21 @@ "installer-mac": "electron-installer-dmg ./release-builds/Criptext-darwin-x64/Criptext.app Criptext --out=release-builds --overwrite", "installer-windows": "electron-installer-windows --src ./release-builds/Criptext-win32-x64/ --dest ./release-builds/ --config ./installerResources/windows.json", "pack": "build --dir", - "dist": "build", - "clear-build": "bash ./installerResources/clearBuild.sh" + "dist": "electron-builder --publish onTag", + "clear-build": "bash ./installerResources/clearBuild.sh", + "release": "build", + "publish": "build --mac --win -p onTag" }, "build": { - "appId": "com.criptext.criptextmac", + "appId": "com.criptext.criptextmail", + "mac": { + "target": [ + "mas", + "dmg", + "zip" + ], + "category": "public.app-category.productivity" + }, "dmg": { "background": "build/background.png", "icon": "build/volume.icns", @@ -64,7 +78,13 @@ "oneClick": true, "installerIcon": "build/icon.ico", "deleteAppDataOnUninstall": true - } + }, + "publish": [ + { + "provider": "generic", + "url": "https://cdn.criptext.com/Criptext-Email-Desktop/mac" + } + ] }, "devDependencies": { "criptext-js-tools": "0.5.0", @@ -78,6 +98,7 @@ "dependencies": { "@criptext/email-http-client": "^0.11.1", "crypto-js": "^3.1.9-1", + "electron-updater": "^3.0.3", "electron-window-state": "^4.1.1", "knex": "^0.14.2", "sqlite3": "^3.1.13", diff --git a/electron_app/src/updater.js b/electron_app/src/updater.js new file mode 100644 index 000000000..213e9c054 --- /dev/null +++ b/electron_app/src/updater.js @@ -0,0 +1,57 @@ +const { dialog } = require('electron'); +const { autoUpdater } = require('electron-updater'); + +const appUpdater = () => { + autoUpdater.checkForUpdatesAndNotify(); + + autoUpdater.on('error', error => { + dialog.showErrorBox( + 'Error: ', + error == null ? 'unknown' : (error.stack || error).toString() + ); + }); + + autoUpdater.on('update-not-available', () => { + dialog.showMessageBox({ + title: 'No Updates', + message: 'Current version is up-to-date.' + }); + }); + + autoUpdater.on('update-available', () => { + dialog.showMessageBox( + { + type: 'info', + title: 'Found Updates', + message: 'Found updates, do you want update now?', + buttons: ['Sure', 'No'] + }, + buttonIndex => { + if (buttonIndex === 0) { + autoUpdater.downloadUpdate(); + } + } + ); + }); + + autoUpdater.on('update-downloaded', () => { + dialog.showMessageBox( + { + title: 'Install Updates', + message: 'Updates downloaded, application will be quit for update...' + }, + () => { + setImmediate(() => autoUpdater.quitAndInstall()); + } + ); + }); +}; + +const checkForUpdates = () => { + autoUpdater.checkForUpdates(); +}; + +module.exports = { + checkForUpdates, + appUpdater +}; diff --git a/electron_app/src/windows/composer.js b/electron_app/src/windows/composer.js index d2d1376dc..14905a501 100644 --- a/electron_app/src/windows/composer.js +++ b/electron_app/src/windows/composer.js @@ -1,4 +1,4 @@ -const { BrowserWindow, Menu, dialog } = require('electron'); +const { BrowserWindow, dialog } = require('electron'); const path = require('path'); const { composerUrl } = require('./../window_routing'); const mailboxWindow = require('./mailbox'); @@ -17,28 +17,6 @@ const iconPath = path.join( './../../resources/launch-icons/icon.png' ); -const template = [ - { - submenu: [ - { role: 'undo', accelerator: 'CmdOrCtrl+Z', visible: false }, - { - role: 'redo', - accelerator: process.platform === 'darwin' ? 'Cmd+Shift+Z' : 'Ctrl+Y', - visible: false - }, - { role: 'cut', accelerator: 'CmdOrCtrl+X', visible: false }, - { role: 'copy', accelerator: 'CmdOrCtrl+C', visible: false }, - { role: 'paste', accelerator: 'CmdOrCtrl+V', visible: false }, - { - role: 'pasteandmatchstyle', - accelerator: 'CmdOrCtrl+Shift+V', - visible: false - } - ] - } -]; -const menu = Menu.buildFromTemplate(template); - const RESPONSES = { DISCARD: { index: 0, @@ -95,7 +73,6 @@ const createComposerWindow = () => { }); globalManager.composerData.set(window.id, {}); window.loadURL(composerUrl); - window.setMenu(menu); window.setMenuBarVisibility(false); window.on('page-title-updated', event => { event.preventDefault(); diff --git a/electron_app/src/windows/mailbox.js b/electron_app/src/windows/mailbox.js index 0ad3bfe25..d961d1f08 100644 --- a/electron_app/src/windows/mailbox.js +++ b/electron_app/src/windows/mailbox.js @@ -1,6 +1,7 @@ -const { BrowserWindow, shell, app } = require('electron'); +const { app, BrowserWindow, shell } = require('electron'); const windowStateManager = require('electron-window-state'); const { mailboxUrl } = require('./../window_routing'); +const { appUpdater } = require('./../updater'); const path = require('path'); let mailboxWindow; @@ -32,7 +33,6 @@ const create = () => { title: '' }); mailboxWindow.loadURL(mailboxUrl); - mailboxWindow.setMenu(null); mailboxWindow.on('page-title-updated', event => { event.preventDefault(); }); @@ -57,6 +57,12 @@ const create = () => { } }); }); + mailboxWindow.webContents.once('did-frame-finish-load', () => { + const checkOS = isWindowsOrmacOS(); + if (checkOS) { + appUpdater(); + } + }); mailboxWindowState.manage(mailboxWindow); }; @@ -89,6 +95,10 @@ const send = (message, data) => { mailboxWindow.webContents.send(message, data); }; +const isWindowsOrmacOS = () => { + return process.platform === 'darwin' || process.platform === 'win32'; +}; + module.exports = { show, close, diff --git a/electron_app/src/windows/menu.js b/electron_app/src/windows/menu.js new file mode 100644 index 000000000..9f3487fac --- /dev/null +++ b/electron_app/src/windows/menu.js @@ -0,0 +1,136 @@ +const { app } = require('electron'); +const { checkForUpdates } = require('./../updater'); +const composerWindowManager = require('./composer'); + +const template = [ + { + label: 'File', + submenu: [ + { + label: 'New Email', + click: function() { + composerWindowManager.openNewComposer(); + } + } + ] + }, + { + label: 'Edit', + submenu: [ + { + label: 'Undo', + accelerator: 'CmdOrCtrl+Z', + role: 'undo' + }, + { + label: 'Redo', + accelerator: 'Shift+CmdOrCtrl+Z', + role: 'redo' + }, + { + type: 'separator' + }, + { + label: 'Cut', + accelerator: 'CmdOrCtrl+X', + role: 'cut' + }, + { + label: 'Copy', + accelerator: 'CmdOrCtrl+C', + role: 'copy' + }, + { + label: 'Paste', + accelerator: 'CmdOrCtrl+V', + role: 'paste' + }, + { + label: 'Select All', + accelerator: 'CmdOrCtrl+A', + role: 'selectall' + } + ] + }, + { + label: 'Window', + role: 'window', + submenu: [ + { + label: 'Minimize', + accelerator: 'CmdOrCtrl+M', + role: 'minimize' + }, + { + label: 'Close', + accelerator: 'CmdOrCtrl+W', + role: 'close' + } + ] + } +]; + +if (process.platform === 'darwin') { + template.unshift({ + label: 'Criptext', + submenu: [ + { + label: 'About Criptext', + role: 'about' + }, + { + label: 'Check for Updates...', + click: checkForUpdates + }, + { + type: 'separator' + }, + { + label: 'Services', + role: 'services', + submenu: [] + }, + { + type: 'separator' + }, + { + label: 'Hide Criptext', + accelerator: 'Command+H', + role: 'hide' + }, + { + label: 'Hide Others', + accelerator: 'Command+Shift+H', + role: 'hideothers' + }, + { + label: 'Show All', + role: 'unhide' + }, + { + type: 'separator' + }, + { + label: 'Quit', + accelerator: 'Command+Q', + click: function() { + app.quit(); + } + } + ] + }); + // Window menu. + template[2].submenu.push( + { + type: 'separator' + }, + { + label: 'Bring All to Front', + role: 'front' + } + ); +} + +module.exports = { + template +}; diff --git a/electron_app/yarn.lock b/electron_app/yarn.lock index 436f1ec5f..a41ffd237 100644 --- a/electron_app/yarn.lock +++ b/electron_app/yarn.lock @@ -744,7 +744,7 @@ buffers@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" -builder-util-runtime@4.4.1, builder-util-runtime@^4.4.1: +builder-util-runtime@4.4.1, builder-util-runtime@^4.4.1, builder-util-runtime@~4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-4.4.1.tgz#2770d03241e51fde46acacc7ed3ed8a9f45f02cb" dependencies: @@ -1490,6 +1490,10 @@ electron-installer-windows@^1.1.0: tmp-promise "^1.0.4" yargs "^11.1.0" +electron-is-dev@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe" + electron-osx-sign@0.4.10, electron-osx-sign@^0.4.1: version "0.4.10" resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz#be4f3b89b2a75a1dc5f1e7249081ab2929ca3a26" @@ -1536,6 +1540,20 @@ electron-publish@20.22.2: lazy-val "^1.0.3" mime "^2.3.1" +electron-updater@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-3.0.3.tgz#67f7edd578d260f9351ccd46ff23c2789c2a5a4f" + dependencies: + bluebird-lst "^1.0.5" + builder-util-runtime "~4.4.1" + electron-is-dev "^0.3.0" + fs-extra-p "^4.6.1" + js-yaml "^3.12.0" + lazy-val "^1.0.3" + lodash.isequal "^4.5.0" + semver "^5.5.0" + source-map-support "^0.5.6" + electron-window-state@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/electron-window-state/-/electron-window-state-4.1.1.tgz#6b34fdc31b38514dfec8b7c8f7b5d4addb67632d" @@ -3435,6 +3453,10 @@ lodash.get@^4.0.0: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"