diff --git a/packages/fether-electron/package.json b/packages/fether-electron/package.json index e7c238db6c9b95baa8c8898f1d44ec9dc2638e32..29219d1e41ea4708b3219f0a1fffdff75853225c 100644 --- a/packages/fether-electron/package.json +++ b/packages/fether-electron/package.json @@ -47,6 +47,7 @@ "commander": "^2.15.1", "electron-dl": "^1.11.0", "fether-react": "^0.1.0", + "menubar": "^5.2.3", "pino": "^4.16.1", "pino-multi-stream": "^3.1.2", "promise-any": "^0.2.0", @@ -55,7 +56,7 @@ "devDependencies": { "babel-eslint": "^8.2.3", "copyfiles": "^2.0.0", - "cross-env": "^5.1.4", + "cross-env": "^5.2.0", "electron": "^2.0.2", "electron-builder": "^20.15.1", "electron-webpack": "^2.1.2", diff --git a/packages/fether-electron/src/main/index.js b/packages/fether-electron/src/main/index.js index f9214df4ea952f2467599a3e6f0c389b80a43316..76bf3d8e8a34c86419d73efc87144d9d3813848f 100644 --- a/packages/fether-electron/src/main/index.js +++ b/packages/fether-electron/src/main/index.js @@ -3,53 +3,55 @@ // // SPDX-License-Identifier: BSD-3-Clause +/* global __static */ + import electron from 'electron'; import path from 'path'; import url from 'url'; -import addMenu from './menu'; import { doesParityExist } from './operations/doesParityExist'; import fetchParity from './operations/fetchParity'; import handleError from './operations/handleError'; +import Mb from 'menubar'; import messages from './messages'; import { productName } from '../../electron-builder.json'; import Pino from './utils/pino'; import { runParity, killParity } from './operations/runParity'; -import staticPath from './utils/staticPath'; -const { app, BrowserWindow, ipcMain, session } = electron; -let mainWindow; +const { ipcMain, Menu, session } = electron; const pino = Pino(); +const menubar = Mb({ + height: 640, + index: + // Opens file:///path/to/build/index.html in prod mode, or whatever is + // passed to ELECTRON_START_URL + process.env.ELECTRON_START_URL || + url.format({ + pathname: path.join(__static, 'build', 'index.html'), + protocol: 'file:', + slashes: true + }), + preloadWindow: true, + resizable: false, + transparent: true, + webPreferences: { + nodeIntegration: true + }, + width: 360 +}); + function createWindow () { pino.info(`Starting ${productName}...`); - mainWindow = new BrowserWindow({ - height: 800, - width: 1200 - }); doesParityExist() - .catch(() => fetchParity(mainWindow)) // Install parity if not present - .then(() => runParity(mainWindow)) + .catch(() => fetchParity(menubar.window)) // Install parity if not present + .then(() => runParity(menubar.window)) .catch(handleError); // Errors should be handled before, this is really just in case - // Opens file:///path/to/build/index.html in prod mode, or whatever is - // passed to ELECTRON_START_URL - mainWindow.loadURL( - process.env.ELECTRON_START_URL || - url.format({ - pathname: path.join(staticPath, 'build', 'index.html'), - protocol: 'file:', - slashes: true - }) - ); - // Listen to messages from renderer process ipcMain.on('asynchronous-message', messages); - // Add application menu - addMenu(mainWindow); - // WS calls have Origin `file://` by default, which is not trusted. // We override Origin header on all WS connections with an authorized one. session.defaultSession.webRequest.onBeforeSendHeaders( @@ -57,43 +59,51 @@ function createWindow () { urls: ['ws://*/*', 'wss://*/*'] }, (details, callback) => { - if (!mainWindow) { + if (!menubar.window) { // There might be a split second where the user closes the app, so - // mainWindow is null, but there is still a network request done. + // menubar.window is null, but there is still a network request done. return; } - details.requestHeaders.Origin = `parity://${mainWindow.id}.ui.parity`; + details.requestHeaders.Origin = `parity://${menubar.window.id}.ui.parity`; callback({ requestHeaders: details.requestHeaders }); // eslint-disable-line } ); // Open external links in browser - mainWindow.webContents.on('new-window', function (event, url) { + menubar.window.webContents.on('new-window', function (event, url) { event.preventDefault(); electron.shell.openExternal(url); }); - - mainWindow.on('closed', () => { - mainWindow = null; - }); } -app.on('ready', createWindow); +// Right click menu for Tray +menubar.on('after-create-window', () => { + const contextMenu = Menu.buildFromTemplate([ + { role: 'about' }, + { type: 'separator' }, + { + label: 'Restart', + click: () => { + menubar.app.relaunch(); + menubar.app.exit(); + } + }, + { + label: 'Quit', + click: () => { + menubar.app.quit(); + } + } + ]); -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - killParity(); - app.quit(); - } + menubar.tray.on('right-click', () => { + menubar.tray.popUpContextMenu(contextMenu); + }); }); // Make sure parity stops when UI stops -app.on('before-quit', killParity); -app.on('will-quit', killParity); -app.on('quit', killParity); +menubar.app.on('before-quit', killParity); +menubar.app.on('will-quit', killParity); +menubar.app.on('quit', killParity); -app.on('activate', () => { - if (mainWindow === null) { - createWindow(); - } -}); +menubar.on('ready', createWindow); diff --git a/packages/fether-react/src/App/App.js b/packages/fether-react/src/App/App.js index 641df4608f55baf56996502b35b4b0633242fe70..acbc76ff75b75eab3f354217ec41f601a0c3dbe7 100644 --- a/packages/fether-react/src/App/App.js +++ b/packages/fether-react/src/App/App.js @@ -34,12 +34,17 @@ class App extends Component {
-
+
{this.renderScreen()} + {/*
+ + + +
*/}
@@ -58,7 +63,11 @@ class App extends Component { } = this.props; if (isFirstRun) { - return
; + return ( +
+ +
+ ); } return ( diff --git a/packages/fether-react/src/assets/sass/layouts/_wrapper.scss b/packages/fether-react/src/assets/sass/layouts/_wrapper.scss index c8f3874b5c02f42ff8421eea865645d8e70e199b..b6102e08b4fa894441fb4edbb24afc68a510b693 100644 --- a/packages/fether-react/src/assets/sass/layouts/_wrapper.scss +++ b/packages/fether-react/src/assets/sass/layouts/_wrapper.scss @@ -16,7 +16,11 @@ height: 0.5rem; display: flex; justify-content: center; - margin-bottom: -1px; + + &.-top { + margin-bottom: -1px; + } + svg { height: 0.5rem; width: auto; diff --git a/packages/fether-react/src/assets/sass/shared/_basics.scss b/packages/fether-react/src/assets/sass/shared/_basics.scss index c8b0d1fcc94c6759a71207c46ba61a2506197f8c..4482849bf0ab2a62bde6c5c52927a096d8f388a5 100644 --- a/packages/fether-react/src/assets/sass/shared/_basics.scss +++ b/packages/fether-react/src/assets/sass/shared/_basics.scss @@ -5,10 +5,6 @@ html { body { user-select: none; - background-color: #a5bfda; - background-image: linear-gradient(#a5bfda, #bfcddc); - background-repeat: no-repeat; - background-size: cover; color: $black; font-family: $sans; font-weight: 400; diff --git a/yarn.lock b/yarn.lock index 9d5f276ab1e5e60148414edfb227850668fa70b9..35097a901001a8ee290ec7ad06374e964aeae2d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3585,7 +3585,7 @@ crocket@^0.9.11: dependencies: xpipe "*" -cross-env@^5.1.4: +cross-env@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" dependencies: @@ -4358,6 +4358,10 @@ electron-osx-sign@0.4.10: minimist "^1.2.0" plist "^2.1.0" +electron-positioner@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/electron-positioner/-/electron-positioner-3.0.1.tgz#e699400c2d634ad19352cf20202e92b92b96accb" + electron-publish@20.16.0: version "20.16.0" resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-20.16.0.tgz#6fbda71181af650315f11ad85af1027df3f30a09" @@ -5064,6 +5068,10 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" +extend@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-2.0.1.tgz#1ee8010689e7395ff9448241c98652bc759a8260" + extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -7752,6 +7760,13 @@ memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" +menubar@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/menubar/-/menubar-5.2.3.tgz#8f2761597b4a0ee87edf04a87d8aab1aac2c44e9" + dependencies: + electron-positioner "^3.0.0" + extend "^2.0.0" + meow@^3.1.0, meow@^3.3.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -10584,7 +10599,7 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" -"solc@github:ngotchac/solc-js": +solc@ngotchac/solc-js: version "0.4.4" resolved "https://codeload.github.com/ngotchac/solc-js/tar.gz/04eb38cc3003fba8cb3656653a7941ed36408818" dependencies: