From 7e99059fba63f6f224a66276c7237003f6d12318 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Sat, 12 Aug 2017 00:25:58 +0900 Subject: [PATCH] Prototype updater window --- src/browser/components/UpdaterPage.jsx | 53 ++++++++++++++++++++++ src/browser/css/components/UpdaterPage.css | 12 +++++ src/browser/css/components/index.css | 1 + src/browser/updater.html | 13 ++++++ src/browser/updater.jsx | 22 +++++++++ src/main.js | 17 +++++++ src/main/autoUpdater.js | 44 ++++++++++++++++++ webpack.config.renderer.js | 1 + 8 files changed, 163 insertions(+) create mode 100644 src/browser/components/UpdaterPage.jsx create mode 100644 src/browser/css/components/UpdaterPage.css create mode 100644 src/browser/updater.html create mode 100644 src/browser/updater.jsx create mode 100644 src/main/autoUpdater.js diff --git a/src/browser/components/UpdaterPage.jsx b/src/browser/components/UpdaterPage.jsx new file mode 100644 index 00000000..d7c81019 --- /dev/null +++ b/src/browser/components/UpdaterPage.jsx @@ -0,0 +1,53 @@ +const React = require('react'); +const propTypes = require('prop-types'); +const {Button, Navbar} = require('react-bootstrap'); + +function UpdaterPage(props) { + return ( +
+ +

{'New update is available'}

+
+
+

{'A new version of the Mattermost Desktop App is available!'}

+

{'Read the '} + {'release notes'} + {' to learn more.'} +

+
+ + +
+ + +
+
+
+ ); +} + +UpdaterPage.propTypes = { + onClickInstall: propTypes.func.isRequired, + onClickReleaseNotes: propTypes.func.isRequired, + onClickRemind: propTypes.func.isRequired, + onClickSkip: propTypes.func.isRequired +}; + +module.exports = UpdaterPage; diff --git a/src/browser/css/components/UpdaterPage.css b/src/browser/css/components/UpdaterPage.css new file mode 100644 index 00000000..06dac481 --- /dev/null +++ b/src/browser/css/components/UpdaterPage.css @@ -0,0 +1,12 @@ +.UpdaterPage-heading { + font-size: 20pt; + margin: 10px 0px; +} + +.UpdaterPage-skipButton { + padding-left: 0px; +} + +.UpdaterPage-footer { + padding: 1em 0; +} diff --git a/src/browser/css/components/index.css b/src/browser/css/components/index.css index 357b259d..542c7e89 100644 --- a/src/browser/css/components/index.css +++ b/src/browser/css/components/index.css @@ -7,3 +7,4 @@ @import url("TabBar.css"); @import url("TeamListItem.css"); @import url("Finder.css"); +@import url("UpdaterPage.css"); diff --git a/src/browser/updater.html b/src/browser/updater.html new file mode 100644 index 00000000..39247158 --- /dev/null +++ b/src/browser/updater.html @@ -0,0 +1,13 @@ + + + + + Updater + + + + +
+ + + diff --git a/src/browser/updater.jsx b/src/browser/updater.jsx new file mode 100644 index 00000000..c0b46f45 --- /dev/null +++ b/src/browser/updater.jsx @@ -0,0 +1,22 @@ +const React = require('react'); +const ReactDOM = require('react-dom'); +const {ipcRenderer} = require('electron'); +const UpdaterPage = require('./components/UpdaterPage.jsx'); + +ReactDOM.render( + { + ipcRenderer.send('click-release-notes'); + }} + onClickSkip={() => { + ipcRenderer.send('click-skip'); + }} + onClickRemind={() => { + ipcRenderer.send('click-remind'); + }} + onClickInstall={() => { + ipcRenderer.send('click-install'); + }} + />, + document.getElementById('content') +); diff --git a/src/main.js b/src/main.js index 511f5d78..8e0ab9d5 100644 --- a/src/main.js +++ b/src/main.js @@ -26,6 +26,7 @@ import {protocols} from '../electron-builder.json'; import CriticalErrorHandler from './main/CriticalErrorHandler'; import {upgradeAutoLaunch} from './main/autoLaunch'; +import {createUpdaterWindow} from './main/autoUpdater'; autoUpdater.on('error', (err) => { console.log('autoUpdater.on error'); @@ -77,6 +78,7 @@ const assetsDir = path.resolve(app.getAppPath(), 'assets'); // 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. var mainWindow = null; +let updaterWindow; let spellChecker = null; let deeplinkingUrl = null; let scheme = null; @@ -440,6 +442,21 @@ app.on('ready', () => { catch((err) => console.log('An error occurred: ', err)); } + updaterWindow = createUpdaterWindow({linuxAppIcon: path.join(assetsDir, 'appicon.png'), nextVersion: '0.0.0'}); + updaterWindow. + on('click-skip', () => { + console.log('click-skip'); + }). + on('click-remind', () => { + console.log('click-remind'); + }). + on('click-install', () => { + console.log('click-install'); + }). + on('click-release-notes', () => { + console.log('click-release-notes'); + }); + // Protocol handler for win32 if (process.platform === 'win32') { // Keep only command line / deep linked argument. Make sure it's not squirrel command diff --git a/src/main/autoUpdater.js b/src/main/autoUpdater.js new file mode 100644 index 00000000..3a54e2d4 --- /dev/null +++ b/src/main/autoUpdater.js @@ -0,0 +1,44 @@ +const {app, BrowserWindow, ipcMain} = require('electron'); + +function setEvent(win, eventName) { + ipcMain.on(eventName, (event) => { + if (event.sender === win.webContents) { + win.emit(eventName); + } + }); +} + +function createUpdaterWindow(options) { + const windowWidth = 480; + const windowHeight = 240; + const windowOptions = { + title: `${app.getName()} Updater`, + maximizable: false, + show: false, + width: windowWidth, + height: windowHeight, + resizable: false, + autoHideMenuBar: true + }; + if (process.platform === 'linux') { + windowOptions.icon = options.linuxAppIcon; + } + + const win = new BrowserWindow(windowOptions); + win.once('ready-to-show', () => { + win.show(); + }); + const updaterURL = (global.isDev ? 'http://localhost:8080' : `file://${app.getAppPath()}`) + '/browser/updater.html'; + win.loadURL(updaterURL); + + setEvent(win, 'click-release-notes'); + setEvent(win, 'click-skip'); + setEvent(win, 'click-remind'); + setEvent(win, 'click-install'); + + return win; +} + +module.exports = { + createUpdaterWindow +}; diff --git a/webpack.config.renderer.js b/webpack.config.renderer.js index 28d60528..489f28da 100644 --- a/webpack.config.renderer.js +++ b/webpack.config.renderer.js @@ -15,6 +15,7 @@ module.exports = merge(base, { entry: { index: './src/browser/index.jsx', settings: './src/browser/settings.jsx', + updater: './src/browser/updater.jsx', 'webview/mattermost': './src/browser/webview/mattermost.js', }, output: {