100 lines
3.3 KiB
JavaScript
100 lines
3.3 KiB
JavaScript
import * as Constants from '../../constants';
|
|
import {createAction} from '@reduxjs/toolkit';
|
|
import {getIPCRenderer} from '../../utils';
|
|
import {notifyError} from './error_actions';
|
|
import {
|
|
installAndTestRelease,
|
|
installDependency,
|
|
installRelease,
|
|
installUpgrade
|
|
} from './install_actions';
|
|
|
|
export const setAllowDownload = createAction('download/setAllowDownload');
|
|
|
|
export const SET_DOWNLOAD_BEGIN = 'download/setDownloadBegin';
|
|
export const setDownloadBegin = (name, type, url) => {
|
|
return {
|
|
type: SET_DOWNLOAD_BEGIN,
|
|
payload: {
|
|
name,
|
|
type,
|
|
url
|
|
}
|
|
};
|
|
};
|
|
|
|
export const setDownloadEnd = createAction('download/setDownloadEnd');
|
|
export const setDownloadProgress = createAction('download/setDownloadProgress');
|
|
|
|
export const downloadItem = (name, type, urls, isWinFSP, testVersion, appPlatform) => {
|
|
return (dispatch, getState) => {
|
|
if (!Array.isArray(urls)) {
|
|
urls = [urls];
|
|
}
|
|
|
|
const downloadComplete = result => {
|
|
if (result.Success) {
|
|
switch (type) {
|
|
case Constants.INSTALL_TYPES.Dependency:
|
|
dispatch(installDependency(result.Destination, result.URL, isWinFSP));
|
|
break;
|
|
case Constants.INSTALL_TYPES.Release:
|
|
dispatch(installRelease(result.Destination));
|
|
break;
|
|
case Constants.INSTALL_TYPES.TestRelease:
|
|
dispatch(installAndTestRelease(result.Destination, testVersion, appPlatform));
|
|
break;
|
|
case Constants.INSTALL_TYPES.Upgrade:
|
|
//const info = this.props.LocationsLookup[this.props.AppPlatform][this.props.VersionLookup[this.props.AppPlatform][0]];
|
|
const sha256 = null;//info.sha256;
|
|
const signature = null;//info.sig;
|
|
dispatch(installUpgrade(result.Destination, sha256, signature, !!result.SkipVerification));
|
|
break;
|
|
default:
|
|
dispatch(notifyError('Unknown download type: ' + type));
|
|
break;
|
|
}
|
|
} else {
|
|
if (type === Constants.INSTALL_TYPES.TestRelease) {
|
|
this.props.setAllowDownload(false);
|
|
}
|
|
dispatch(notifyError(result.Error));
|
|
}
|
|
};
|
|
|
|
const downloadAtIndex = index => {
|
|
const url = urls[index];
|
|
const state = getState();
|
|
if ((index > 0) || (!state.download.DownloadActive && state.download.AllowDownload)) {
|
|
const ipcRenderer = getIPCRenderer();
|
|
if (ipcRenderer) {
|
|
dispatch(setDownloadBegin(name, type, url));
|
|
|
|
const downloadFileProgress = (_, arg) => {
|
|
dispatch(setDownloadProgress(arg.data.Progress));
|
|
};
|
|
|
|
const downloadFileComplete = (_, arg) => {
|
|
ipcRenderer.removeListener(Constants.IPC_Download_File_Progress, downloadFileProgress);
|
|
if (!arg.data.Success && (++index < urls.length)) {
|
|
downloadAtIndex(index);
|
|
} else {
|
|
downloadComplete(arg.data);
|
|
dispatch(setDownloadEnd(arg.data));
|
|
}
|
|
};
|
|
|
|
ipcRenderer.on(Constants.IPC_Download_File_Progress, downloadFileProgress);
|
|
ipcRenderer.once(Constants.IPC_Download_File_Complete, downloadFileComplete);
|
|
|
|
ipcRenderer.send(Constants.IPC_Download_File, {
|
|
Filename: name,
|
|
URL: url,
|
|
});
|
|
}
|
|
}
|
|
};
|
|
downloadAtIndex(0);
|
|
};
|
|
};
|