Merge remote-tracking branch 'origin/1.1.x_branch' into 1.2.x_branch

This commit is contained in:
2020-02-22 22:14:20 -06:00
23 changed files with 131 additions and 55 deletions

1
.gitignore vendored
View File

@@ -5,3 +5,4 @@ build/
chrome_data/ chrome_data/
dist/ dist/
/.cache /.cache
/temp.json

View File

@@ -308,16 +308,29 @@ if (!instanceLock) {
configurePrimaryApp(); configurePrimaryApp();
} }
const AppFunctions = {
closeApplication,
detectScript,
dialog,
getCleanupReleases: () => cleanupReleases,
getMainWindow,
saveUiSettings,
setIsInstalling,
setTrayImage,
setWindowVisibility,
standardIPCReply,
unmountAllDrives: MountsIPC.unmountAllDrives,
};
AppIPC.addListeners(ipcMain, closeApplication, setWindowVisibility); AppIPC.addListeners(ipcMain, AppFunctions);
ConfigIPC.addListeners(ipcMain, standardIPCReply); ConfigIPC.addListeners(ipcMain, AppFunctions);
DaemonIPC.addListeners(ipcMain, standardIPCReply); DaemonIPC.addListeners(ipcMain, AppFunctions);
DependencyIPC.addListeners(ipcMain, standardIPCReply); DependencyIPC.addListeners(ipcMain, AppFunctions);
DownloadIPC.addListeners(ipcMain, standardIPCReply); DownloadIPC.addListeners(ipcMain, AppFunctions);
FilesystemIPC.addListeners(ipcMain, getMainWindow, dialog); FilesystemIPC.addListeners(ipcMain, AppFunctions);
MountsIPC.addListeners(ipcMain, setTrayImage, standardIPCReply); MountsIPC.addListeners(ipcMain, AppFunctions);
PlatformIPC.addListeners(ipcMain, detectScript, saveUiSettings); PlatformIPC.addListeners(ipcMain, AppFunctions);
ReleaseIPC.addListeners(ipcMain, () => cleanupReleases, standardIPCReply); ReleaseIPC.addListeners(ipcMain, AppFunctions);
StateIPC.addListeners(ipcMain); StateIPC.addListeners(ipcMain, AppFunctions);
SystemIPC.addListeners(ipcMain, closeApplication); SystemIPC.addListeners(ipcMain, AppFunctions);
UpgradeIPC.addListeners(ipcMain, setIsInstalling, MountsIPC.unmountAllDrives, standardIPCReply); UpgradeIPC.addListeners(ipcMain, AppFunctions);

View File

@@ -14,6 +14,10 @@ import MountItems from './containers/MountItems/MountItems';
import NewReleases from './components/NewReleases/NewReleases'; import NewReleases from './components/NewReleases/NewReleases';
import {notifyError} from './redux/actions/error_actions'; import {notifyError} from './redux/actions/error_actions';
import Reboot from './components/Reboot/Reboot'; import Reboot from './components/Reboot/Reboot';
import {
setDismissNewReleasesAvailable,
setNewReleasesAvailable
} from './redux/actions/release_version_actions';
import ReleaseVersionDisplay from './components/ReleaseVersionDisplay/ReleaseVersionDisplay'; import ReleaseVersionDisplay from './components/ReleaseVersionDisplay/ReleaseVersionDisplay';
import { import {
displaySelectAppPlatform, displaySelectAppPlatform,
@@ -73,6 +77,15 @@ class App extends IPCContainer {
this.props.VersionLookup[Constants.RELEASE_TYPES[this.props.Release]][this.props.ReleaseVersion]; this.props.VersionLookup[Constants.RELEASE_TYPES[this.props.Release]][this.props.ReleaseVersion];
}; };
handleUpgradeIconClicked = () => {
if (this.props.UpgradeAvailable) {
this.props.setDismissUIUpgrade(false)
} else if (this.props.NewReleasesAvailable2.length > 0) {
this.props.setNewReleasesAvailable(this.props.NewReleasesAvailable2);
this.props.setDismissNewReleasesAvailable(false);
}
};
render() { render() {
const selectedVersion = this.getSelectedVersion(); const selectedVersion = this.getSelectedVersion();
@@ -177,8 +190,9 @@ class App extends IPCContainer {
textAlign={'center'} textAlign={'center'}
type={'Heading1'}/> type={'Heading1'}/>
<UpgradeIcon <UpgradeIcon
available={this.props.UpgradeAvailable} available={this.props.UpgradeAvailable || (this.props.NewReleasesAvailable2.length > 0)}
clicked={()=>this.props.setDismissUIUpgrade(false)} newReleases={!this.props.UpgradeAvailable && (this.props.NewReleasesAvailable2.length > 0)}
clicked={this.handleUpgradeIconClicked}
col={dimensions => dimensions.columns - 6} col={dimensions => dimensions.columns - 6}
colSpan={5} colSpan={5}
row={1} row={1}
@@ -225,6 +239,7 @@ const mapStateToProps = state => {
MissingDependencies: state.install.MissingDependencies, MissingDependencies: state.install.MissingDependencies,
MountsBusy: state.mounts.MountsBusy, MountsBusy: state.mounts.MountsBusy,
NewReleasesAvailable: state.relver.NewReleasesAvailable, NewReleasesAvailable: state.relver.NewReleasesAvailable,
NewReleasesAvailable2: state.relver.NewReleasesAvailable2,
Platform: state.common.Platform, Platform: state.common.Platform,
ProviderState: state.mounts.ProviderState, ProviderState: state.mounts.ProviderState,
RebootRequired: state.common.RebootRequired, RebootRequired: state.common.RebootRequired,
@@ -243,6 +258,8 @@ const mapDispatchToProps = dispatch => {
loadReleases: ()=> dispatch(loadReleases()), loadReleases: ()=> dispatch(loadReleases()),
notifyError: (msg, critical, callback) => dispatch(notifyError(msg, critical, callback)), notifyError: (msg, critical, callback) => dispatch(notifyError(msg, critical, callback)),
saveState: () => dispatch(saveState()), saveState: () => dispatch(saveState()),
setDismissNewReleasesAvailable: dismiss => dispatch(setDismissNewReleasesAvailable),
setNewReleasesAvailable: items => dispatch(setNewReleasesAvailable(items)),
setDismissUIUpgrade: dismiss => dispatch(setDismissUIUpgrade(dismiss)), setDismissUIUpgrade: dismiss => dispatch(setDismissUIUpgrade(dismiss)),
}; };
}; };

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -17,5 +17,9 @@
max-width: 100%; max-width: 100%;
max-height: 100%; max-height: 100%;
box-sizing: border-box; box-sizing: border-box;
opacity: 0.65; color: var(--heading_text_color);
}
.UpgradeIcon.Release {
color: var(--heading_other_text_color);
} }

View File

@@ -1,13 +1,19 @@
import React from 'react'; import React from 'react';
import './UpgradeIcon.css'; import './UpgradeIcon.css';
import availableImage from '../../assets/images/release_available.png';
import ReactTooltip from 'react-tooltip'; import ReactTooltip from 'react-tooltip';
import {faExclamationTriangle} from '@fortawesome/free-solid-svg-icons';
import {FontAwesomeIcon} from '@fortawesome/react-fontawesome';
export default props => { export default props => {
const styles = ['UpgradeIcon'];
let placement = 'left'; let placement = 'left';
let toolTipText = 'UI Upgrade Available'; let toolTipText = 'UI Upgrade Available';
if (props.release) { if (props.release) {
placement='bottom'; placement='bottom';
styles.push('Release');
}
if (props.release || props.newReleases) {
toolTipText = 'New Release Available'; toolTipText = 'New Release Available';
} }
@@ -16,10 +22,11 @@ export default props => {
( (
<div className={'UpgradeIconOwner'}> <div className={'UpgradeIconOwner'}>
<p data-tip='' data-for={placement}> <p data-tip='' data-for={placement}>
<img alt='' <a href={'#'}
onClick={props.clicked} className={styles.join(' ')}
src={availableImage} onClick={props.clicked}>
className={'UpgradeIcon'}/> <FontAwesomeIcon icon={faExclamationTriangle}/>
</a>
</p> </p>
<ReactTooltip id={placement} place={placement}>{toolTipText}</ReactTooltip> <ReactTooltip id={placement} place={placement}>{toolTipText}</ReactTooltip>
</div> </div>

View File

@@ -152,13 +152,14 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
} }
}; };
removeControl = ( removeControl = (
<RootElem col={dimensions=>dimensions.columns - 6}
row={secondRow + 3}>
<a href={'#'} <a href={'#'}
col={dimensions=>dimensions.columns - 6}
onClick={handleRemoveMount} onClick={handleRemoveMount}
row={secondRow + 3}
style={removeStyle}> style={removeStyle}>
<FontAwesomeIcon icon={faTrashAlt}/> <FontAwesomeIcon icon={faTrashAlt}/>
</a>); </a>
</RootElem>);
} }
return ( return (

View File

@@ -10,7 +10,8 @@ import {
loadReleases, loadReleases,
setActiveRelease, setActiveRelease,
setInstalledVersion, setInstalledVersion,
setReleaseUpgradeAvailable setReleaseUpgradeAvailable,
setNewReleasesAvailable2,
} from './release_version_actions'; } from './release_version_actions';
import { import {
confirmYesNo, confirmYesNo,
@@ -224,6 +225,11 @@ export const installRelease = source => {
FilePath: source, FilePath: source,
}); });
if (arg.data.Success) {
localStorage.setItem('previous_releases', localStorage.getItem('releases'));
dispatch(setNewReleasesAvailable2([]));
}
dispatch(setInstallComplete(arg.data)); dispatch(setInstallComplete(arg.data));
dispatch(checkVersionInstalled()); dispatch(checkVersionInstalled());
}; };

View File

@@ -14,6 +14,7 @@ import {
} from './install_actions'; } from './install_actions';
import {unmountAll} from './mount_actions'; import {unmountAll} from './mount_actions';
import { import {
checkNewReleases,
getIPCRenderer, getIPCRenderer,
getNewReleases getNewReleases
} from '../../utils'; } from '../../utils';
@@ -140,8 +141,11 @@ export const loadReleases = () => {
dispatch(setNewReleasesAvailable(newReleases)); dispatch(setNewReleasesAvailable(newReleases));
if (getState().relver.NewReleasesAvailable.length > 0) { if (getState().relver.NewReleasesAvailable.length > 0) {
dispatch(setNewReleasesAvailable2(newReleases));
localStorage.setItem('previous_releases', storedReleases); localStorage.setItem('previous_releases', storedReleases);
dispatch(showWindow()); dispatch(showWindow());
} else if ((newReleases = checkNewReleases()).length > 0) {
dispatch(setNewReleasesAvailable2(newReleases));
} }
}).catch(error => { }).catch(error => {
const releases = localStorage.getItem('releases'); const releases = localStorage.getItem('releases');
@@ -193,6 +197,7 @@ export const setDismissNewReleasesAvailable = createAction('relver/setDismissNew
export const setDismissUIUpgrade = createAction('relver/setDismissUIUpgrade'); export const setDismissUIUpgrade = createAction('relver/setDismissUIUpgrade');
export const setInstalledVersion = createAction('relver/setInstalledVersion'); export const setInstalledVersion = createAction('relver/setInstalledVersion');
export const setNewReleasesAvailable = createAction('relver/setNewReleasesAvailable'); export const setNewReleasesAvailable = createAction('relver/setNewReleasesAvailable');
export const setNewReleasesAvailable2 = createAction('relver/setNewReleasesAvailable2');
export const SET_RELEASE_DATA = 'relver/setReleaseData'; export const SET_RELEASE_DATA = 'relver/setReleaseData';
export const setReleaseData = (locationsLookup, versionLookup)=> { export const setReleaseData = (locationsLookup, versionLookup)=> {

View File

@@ -19,6 +19,7 @@ export const releaseVersionReducer = createReducer({
InstalledVersion: 'none', InstalledVersion: 'none',
LocationsLookup: {}, LocationsLookup: {},
NewReleasesAvailable: [], NewReleasesAvailable: [],
NewReleasesAvailable2: [],
Release: 0, Release: 0,
ReleaseDefault: 0, ReleaseDefault: 0,
ReleaseUpgradeAvailable: false, ReleaseUpgradeAvailable: false,
@@ -76,6 +77,12 @@ export const releaseVersionReducer = createReducer({
NewReleasesAvailable: action.payload, NewReleasesAvailable: action.payload,
}; };
}, },
[Actions.setNewReleasesAvailable2]: (state, action) => {
return {
...state,
NewReleasesAvailable2: action.payload,
};
},
[Actions.SET_RELEASE_DATA]: (state, action) => { [Actions.SET_RELEASE_DATA]: (state, action) => {
return { return {
...state, ...state,

View File

@@ -1,6 +1,6 @@
const Constants = require('../../constants'); const Constants = require('../../constants');
const addListeners = (ipcMain, closeApplication, setWindowVisibility) => { const addListeners = (ipcMain, {closeApplication, setWindowVisibility}) => {
ipcMain.on(Constants.IPC_Shutdown, () => { ipcMain.on(Constants.IPC_Shutdown, () => {
closeApplication(); closeApplication();
}); });

View File

@@ -1,7 +1,7 @@
const Constants = require('../../constants'); const Constants = require('../../constants');
const helpers = require('../../helpers'); const helpers = require('../../helpers');
const addListeners = (ipcMain, standardIPCReply) => { const addListeners = (ipcMain, {standardIPCReply}) => {
ipcMain.on(Constants.IPC_Get_Config, (event, data) => { ipcMain.on(Constants.IPC_Get_Config, (event, data) => {
helpers helpers
.getConfig(data.Version, data.Provider, data.Remote) .getConfig(data.Version, data.Provider, data.Remote)

View File

@@ -1,7 +1,7 @@
const Constants = require('../../constants'); const Constants = require('../../constants');
const helpers = require('../../helpers'); const helpers = require('../../helpers');
const addListeners = (ipcMain, standardIPCReply) => { const addListeners = (ipcMain, {standardIPCReply}) => {
ipcMain.on(Constants.IPC_Check_Daemon_Version, (event, data) => { ipcMain.on(Constants.IPC_Check_Daemon_Version, (event, data) => {
helpers helpers
.checkDaemonVersion(data.Version, data.Provider) .checkDaemonVersion(data.Version, data.Provider)

View File

@@ -2,7 +2,7 @@ const Constants = require('../../constants');
const fs = require('fs'); const fs = require('fs');
const helpers = require('../../helpers'); const helpers = require('../../helpers');
const addListeners = (ipcMain, standardIPCReply) => { const addListeners = (ipcMain, {standardIPCReply}) => {
ipcMain.on(Constants.IPC_Check_Dependency_Installed, (event, data) => { ipcMain.on(Constants.IPC_Check_Dependency_Installed, (event, data) => {
try { try {
const exists = fs.lstatSync(data.File).isFile(); const exists = fs.lstatSync(data.File).isFile();

View File

@@ -2,7 +2,7 @@ const Constants = require('../../constants');
const helpers = require('../../helpers'); const helpers = require('../../helpers');
const path = require('path'); const path = require('path');
const addListeners = (ipcMain, standardIPCReply) => { const addListeners = (ipcMain, {standardIPCReply}) => {
ipcMain.on(Constants.IPC_Download_File, (event, data) => { ipcMain.on(Constants.IPC_Download_File, (event, data) => {
const destination = path.join(helpers.getDataDirectory(), data.Filename); const destination = path.join(helpers.getDataDirectory(), data.Filename);
helpers.downloadFile(data.URL, destination, (progress) => { helpers.downloadFile(data.URL, destination, (progress) => {

View File

@@ -1,7 +1,7 @@
const Constants = require('../../constants'); const Constants = require('../../constants');
const fs = require('fs'); const fs = require('fs');
const addListeners = (ipcMain, getMainWindow, dialog) => { const addListeners = (ipcMain, {getMainWindow, dialog}) => {
ipcMain.on(Constants.IPC_Browse_Directory + '_sync', (event, data) => { ipcMain.on(Constants.IPC_Browse_Directory + '_sync', (event, data) => {
dialog.showOpenDialog(getMainWindow(), { dialog.showOpenDialog(getMainWindow(), {
defaultPath: data.Location, defaultPath: data.Location,

View File

@@ -62,7 +62,7 @@ const unmountAllDrives = () => {
mountedData = {}; mountedData = {};
}; };
const addListeners = (ipcMain, setTrayImage, standardIPCReply) => { const addListeners = (ipcMain, {setTrayImage, standardIPCReply}) => {
ipcMain.on(Constants.IPC_Check_Mount_Location + '_sync', (event, data) => { ipcMain.on(Constants.IPC_Check_Mount_Location + '_sync', (event, data) => {
let response = { let response = {
Success: true, Success: true,

View File

@@ -14,7 +14,7 @@ const setPlatformOverride = platformOverride => {
_platformOverride = platformOverride; _platformOverride = platformOverride;
}; };
const addListeners = (ipcMain, detectScript, saveUiSettings) => { const addListeners = (ipcMain, {detectScript, saveUiSettings}) => {
ipcMain.on(Constants.IPC_Get_Platform, (event) => { ipcMain.on(Constants.IPC_Get_Platform, (event) => {
const sendResponse = (appPlatform, platform) => { const sendResponse = (appPlatform, platform) => {
event.sender.send(Constants.IPC_Get_Platform_Reply, { event.sender.send(Constants.IPC_Get_Platform_Reply, {

View File

@@ -5,7 +5,7 @@ const os = require('os');
const path = require('path'); const path = require('path');
const unzip = require('unzipper'); const unzip = require('unzipper');
const addListeners = (ipcMain, getCleanupReleases, standardIPCReply) => { const addListeners = (ipcMain, {getCleanupReleases, standardIPCReply}) => {
ipcMain.on(Constants.IPC_Check_Installed, (event, data) => { ipcMain.on(Constants.IPC_Check_Installed, (event, data) => {
const destination = path.join(helpers.getDataDirectory(), data.Version); const destination = path.join(helpers.getDataDirectory(), data.Version);
helpers helpers

View File

@@ -2,7 +2,7 @@ const Constants = require('../../constants');
const os = require('os'); const os = require('os');
const helpers = require('../../helpers'); const helpers = require('../../helpers');
const addListeners = (ipcMain, closeApplication) => { const addListeners = (ipcMain, {closeApplication}) => {
ipcMain.on(Constants.IPC_Reboot_System, () => { ipcMain.on(Constants.IPC_Reboot_System, () => {
if (os.platform() === 'win32') { if (os.platform() === 'win32') {
helpers.executeAsync('shutdown.exe', ['/r', '/t', '30']); helpers.executeAsync('shutdown.exe', ['/r', '/t', '30']);

View File

@@ -3,7 +3,7 @@ const fs = require('fs');
const helpers = require('../../helpers'); const helpers = require('../../helpers');
const os = require('os'); const os = require('os');
const addListeners = (ipcMain, setIsInstalling, unmountAllDrives, standardIPCReply) => { const addListeners = (ipcMain, {setIsInstalling, unmountAllDrives, standardIPCReply}) => {
ipcMain.on(Constants.IPC_Install_Upgrade, (event, data) => { ipcMain.on(Constants.IPC_Install_Upgrade, (event, data) => {
let allowSkipVerification = true; let allowSkipVerification = true;

View File

@@ -7,6 +7,21 @@ const ipcRenderer = (!process.versions.hasOwnProperty('electron') && window && w
window.require('electron').ipcRenderer : window.require('electron').ipcRenderer :
null; null;
export const checkNewReleases = () => {
let previousReleases = localStorage.getItem('previous_releases');
if (previousReleases) {
previousReleases = JSON.parse(previousReleases).VersionLookup;
let currentReleases = localStorage.getItem('releases');
if (currentReleases) {
currentReleases = JSON.parse(currentReleases).VersionLookup;
return getNewReleases(previousReleases, currentReleases);
}
}
return [];
};
export const createModalConditionally = (condition, jsx, critical, disableFocusTrap) => { export const createModalConditionally = (condition, jsx, critical, disableFocusTrap) => {
const modalProps = {critical: critical, disableFocusTrap: disableFocusTrap}; const modalProps = {critical: critical, disableFocusTrap: disableFocusTrap};
return condition ? (<Modal {...modalProps}>{jsx}</Modal>) : null; return condition ? (<Modal {...modalProps}>{jsx}</Modal>) : null;
@@ -62,7 +77,7 @@ export const getIPCRenderer = () => {
return ipcRenderer; return ipcRenderer;
}; };
export const getNewReleases = (existingReleases, newReleases) => { export const getNewReleases = (existingLocations, newLocations) => {
const ret = []; const ret = [];
/*existingReleases = Constants.RELEASE_TYPES.reduce((map, release) => { /*existingReleases = Constants.RELEASE_TYPES.reduce((map, release) => {
@@ -70,15 +85,15 @@ export const getNewReleases = (existingReleases, newReleases) => {
return map; return map;
}, {});*/ }, {});*/
if (existingReleases && newReleases) { if (existingLocations && newLocations) {
Constants.RELEASE_TYPES.forEach(release => { Constants.RELEASE_TYPES.forEach(release => {
newReleases[release] newLocations[release]
.filter(version => !existingReleases[release].includes(version) && (version !== 'unavailable')) .filter(version => !existingLocations[release].includes(version) && (version !== 'unavailable'))
.forEach(version => { .forEach(version => {
ret.splice(0, 0, { ret.splice(0, 0, {
Display: version, Display: version,
Release: Constants.RELEASE_TYPES.indexOf(release), Release: Constants.RELEASE_TYPES.indexOf(release),
Version: newReleases[release].indexOf(version), Version: newLocations[release].indexOf(version),
VersionString: version, VersionString: version,
}); });
}); });