Add cancel button to updater

This commit is contained in:
Yuya Ochiai 2018-10-17 22:42:51 +09:00
parent c4240bd87f
commit 48f165c44f
4 changed files with 20 additions and 5 deletions

View file

@ -55,6 +55,11 @@ function UpdaterPage(props) {
now={props.progress} now={props.progress}
label={`${props.progress}%`} label={`${props.progress}%`}
/> />
<div className='pull-right'>
<Button
onClick={props.onClickCancel}
>{'Cancel'}</Button>
</div>
</Navbar> : </Navbar> :
<Navbar <Navbar
className='UpdaterPage-footer' className='UpdaterPage-footer'
@ -93,6 +98,7 @@ UpdaterPage.propTypes = {
onClickReleaseNotes: propTypes.func.isRequired, onClickReleaseNotes: propTypes.func.isRequired,
onClickRemind: propTypes.func.isRequired, onClickRemind: propTypes.func.isRequired,
onClickSkip: propTypes.func.isRequired, onClickSkip: propTypes.func.isRequired,
onClickCancel: propTypes.func.isRequired,
}; };
export default UpdaterPage; export default UpdaterPage;

View file

@ -48,5 +48,6 @@ storiesOf('UpdaterPage', module).
appName={appName} appName={appName}
isDownloading={true} isDownloading={true}
progress={0} progress={0}
onClickCancel={action('clicked cancel')}
/> />
)); ));

View file

@ -53,6 +53,9 @@ class UpdaterPageContainer extends React.Component {
onClickDownload={() => { onClickDownload={() => {
ipcRenderer.send('click-download'); ipcRenderer.send('click-download');
}} }}
onClickCancel={() => {
ipcRenderer.send('click-cancel');
}}
/> />
); );
} }

View file

@ -8,7 +8,7 @@ import path from 'path';
import {app, BrowserWindow, dialog, ipcMain, shell} from 'electron'; import {app, BrowserWindow, dialog, ipcMain, shell} from 'electron';
import logger from 'electron-log'; import logger from 'electron-log';
import {autoUpdater} from 'electron-updater'; import {autoUpdater, CancellationToken} from 'electron-updater';
import semver from 'semver'; import semver from 'semver';
const INTERVAL_48_HOURS_IN_MS = 5 * 60 * 1000; // 5 min. const INTERVAL_48_HOURS_IN_MS = 5 * 60 * 1000; // 5 min.
@ -55,7 +55,7 @@ function createUpdaterModal(parentWindow, options) {
} }
modal.loadURL(updaterURL); modal.loadURL(updaterURL);
for (const eventName of ['click-release-notes', 'click-skip', 'click-remind', 'click-install', 'click-download']) { for (const eventName of ['click-release-notes', 'click-skip', 'click-remind', 'click-install', 'click-download', 'click-cancel']) {
const listener = createEventListener(modal, eventName); const listener = createEventListener(modal, eventName);
ipcMain.on(eventName, listener); ipcMain.on(eventName, listener);
modal.on('closed', () => { modal.on('closed', () => {
@ -82,12 +82,12 @@ function isUpdateApplicable(now, skippedVersion, updateInfo) {
return true; return true;
} }
function downloadAndInstall() { function downloadAndInstall(cancellationToken) {
autoUpdater.on('update-downloaded', () => { autoUpdater.on('update-downloaded', () => {
global.willAppQuit = true; global.willAppQuit = true;
autoUpdater.quitAndInstall(); autoUpdater.quitAndInstall();
}); });
autoUpdater.downloadUpdate(); autoUpdater.downloadUpdate(cancellationToken);
} }
function initialize(appState, mainWindow, notifyOnly = false) { function initialize(appState, mainWindow, notifyOnly = false) {
@ -96,6 +96,7 @@ function initialize(appState, mainWindow, notifyOnly = false) {
autoUpdater.on('error', (err) => { autoUpdater.on('error', (err) => {
console.error('Error in autoUpdater:', err.message); console.error('Error in autoUpdater:', err.message);
}).on('update-available', (info) => { }).on('update-available', (info) => {
let cancellationToken = null;
if (isUpdateApplicable(new Date(), appState.skippedVersion, info)) { if (isUpdateApplicable(new Date(), appState.skippedVersion, info)) {
updaterModal = createUpdaterModal(mainWindow, { updaterModal = createUpdaterModal(mainWindow, {
linuxAppIcon: path.join(assetsDir, 'appicon.png'), linuxAppIcon: path.join(assetsDir, 'appicon.png'),
@ -119,11 +120,15 @@ function initialize(appState, mainWindow, notifyOnly = false) {
updaterModal.send('progress', Math.floor(data.percent)); updaterModal.send('progress', Math.floor(data.percent));
console.log('progress:', data); console.log('progress:', data);
}); });
downloadAndInstall(); cancellationToken = new CancellationToken();
downloadAndInstall(cancellationToken);
}).on('click-download', () => { }).on('click-download', () => {
shell.openExternal('https://about.mattermost.com/download/#mattermostApps'); shell.openExternal('https://about.mattermost.com/download/#mattermostApps');
}).on('click-release-notes', () => { }).on('click-release-notes', () => {
shell.openExternal(`https://github.com/mattermost/desktop/releases/v${info.version}`); shell.openExternal(`https://github.com/mattermost/desktop/releases/v${info.version}`);
}).on('click-cancel', () => {
cancellationToken.cancel();
updaterModal.close();
}); });
updaterModal.focus(); updaterModal.focus();
} else if (autoUpdater.isManual) { } else if (autoUpdater.isManual) {