From 762a7ec6e3b653db7e0bc0c1189d5a7a58756d38 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 25 Sep 2018 12:34:13 -0500 Subject: [PATCH 01/27] Changed version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b6add2a..3acebef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "repertory-ui", - "version": "1.0.0", + "version": "1.1.0", "private": true, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.1", From 0f12f7e33ac89bcc360c5cf8790a528c20a86141 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 26 Sep 2018 02:20:11 -0500 Subject: [PATCH 02/27] [Repertory release notification icon] [Prevent release change when mount is busy] [Initial loading animation] --- src/App.js | 122 ++++++++++++--------- src/assets/images/release_available.png | Bin 0 -> 79055 bytes src/assets/images/upgrade_available.png | Bin 179294 -> 0 bytes src/components/UI/Loading/Loading.css | 16 +++ src/components/UI/Loading/Loading.js | 17 +++ src/components/UpgradeIcon/UpgradeIcon.css | 5 +- src/components/UpgradeIcon/UpgradeIcon.js | 11 +- src/containers/MountItems/MountItems.js | 5 + 8 files changed, 119 insertions(+), 57 deletions(-) create mode 100644 src/assets/images/release_available.png delete mode 100644 src/assets/images/upgrade_available.png create mode 100644 src/components/UI/Loading/Loading.css create mode 100644 src/components/UI/Loading/Loading.js diff --git a/src/App.js b/src/App.js index 5f5582b..73be628 100644 --- a/src/App.js +++ b/src/App.js @@ -12,7 +12,7 @@ import Modal from './components/UI/Modal/Modal'; import DownloadProgress from './components/DownloadProgress/DownloadProgress'; import UpgradeUI from './components/UpgradeUI/UpgradeUI'; import UpgradeIcon from './components/UpgradeIcon/UpgradeIcon'; - +import Loading from './components/UI/Loading/Loading'; const Scheduler = require('node-schedule'); let ipcRenderer = null; @@ -62,12 +62,21 @@ class App extends Component { const locationsLookup = { ...response.data.Locations[this.state.Platform], }; + + const latestVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; + let version = this.state.Version; + if (version === -1) { + version = latestVersion; + } + this.setState({ AllowOptions: true, LocationsLookup: locationsLookup, + Version: version, + VersionAvailable: version !== latestVersion, VersionLookup: versionLookup, }); - this.checkVersionInstalled(this.state.Release, this.state.Version, versionLookup); + this.checkVersionInstalled(this.state.Release, version, versionLookup); }).catch(error => { console.log(error); }); @@ -212,6 +221,7 @@ class App extends Component { }, LocationsLookup: {}, MissingDependencies: [], + MountsBusy: false, Platform: 'unknown', Release: 3, ReleaseTypes: [ @@ -228,7 +238,8 @@ class App extends Component { UpgradeAvailable: false, UpgradeData: {}, UpgradeDismissed: false, - Version: 0, + Version: -1, + VersionAvailable: false, VersionLookup: { Alpha: [ 'unavailable' @@ -341,12 +352,13 @@ class App extends Component { handleReleaseChanged = (e) => { const val = parseInt(e.target.value, 10); + const versionIndex = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; this.setState({ Release: val, - Version: 0 + Version: versionIndex }); - this.saveState(val, 0, this.state.Sia, this.state.Hyperspace); - this.checkVersionInstalled(val, 0); + this.saveState(val, versionIndex, this.state.Sia, this.state.Hyperspace); + this.checkVersionInstalled(val, versionIndex); }; handleReleaseDownload = () => { @@ -397,6 +409,10 @@ class App extends Component { notifyAutoMountProcessed = () => { this.setState({AutoMountChecked: true}); }; + + notifyMountsBusy = (busy) => { + this.setState({MountsBusy: busy}) + }; saveState = (release, version, sia, hyperspace)=> { if (ipcRenderer) { @@ -421,8 +437,11 @@ class App extends Component { }; render() { - const selectedVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]][this.state.Version]; + const selectedVersion = (this.state.Version === -1) ? + 'unavailable' : + this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]][this.state.Version]; const downloadEnabled = this.state.AllowDownload && + !this.state.MountsBusy && !this.state.DownloadActive && (((selectedVersion !== 'unavailable') && (selectedVersion !== this.state.RepertoryVersion))); const allowMount = this.state.RepertoryVersion !== 'none'; @@ -437,6 +456,7 @@ class App extends Component { processAutoMount={!this.state.AutoMountChecked} autoMountProcessed={this.notifyAutoMountProcessed} autoMountChanged={this.handleAutoMountChanged} + mountsBusy={this.notifyMountsBusy} version={this.state.RepertoryVersion} directory={Constants.DATA_LOCATIONS[this.state.Platform]} disabled={!allowMount}/>; @@ -484,51 +504,53 @@ class App extends Component { ); } - let options = null; + let mainContent = null; if (this.state.AllowOptions) { - options = ( + mainContent = ( - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
-

Release

-
-

Version

-
-

Installed

-
- - - - - {this.state.RepertoryVersion} -
- {releaseDisplay} -
- {mountDisplay} -
+

Release

+
+

Version

+
+

Installed

+
+ + + + + {this.state.RepertoryVersion} +
+ {releaseDisplay} +
+ {mountDisplay} +
); + } else { + mainContent = } return ( @@ -536,7 +558,7 @@ class App extends Component { {dependencyDisplay} {upgradeDisplay} {downloadDisplay} - + @@ -553,8 +575,8 @@ class App extends Component {
- - {options} + + {mainContent} ); diff --git a/src/assets/images/release_available.png b/src/assets/images/release_available.png new file mode 100644 index 0000000000000000000000000000000000000000..07e449388972d66e74641848667e347304e80cdd GIT binary patch literal 79055 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 aZb&f;D?DNz>{o++(wS4{M)@b4Z~q@WO;->A literal 0 HcmV?d00001 diff --git a/src/assets/images/upgrade_available.png b/src/assets/images/upgrade_available.png deleted file mode 100644 index dbd19d0644c1bd3f9f583f7905a43f1f2b7faef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179294 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%0AZ7IN8|>VaXi;ix6ZZ?7GF=SQ3yznuHK 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 z

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 { + return ( +

); +}, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/UpgradeIcon/UpgradeIcon.css b/src/components/UpgradeIcon/UpgradeIcon.css index cf9e26c..4225165 100644 --- a/src/components/UpgradeIcon/UpgradeIcon.css +++ b/src/components/UpgradeIcon/UpgradeIcon.css @@ -7,8 +7,5 @@ border: 0; box-sizing: border-box; cursor: pointer; -} - -div.UpgradeIcon { - cursor: default; + opacity: 0.65; } \ No newline at end of file diff --git a/src/components/UpgradeIcon/UpgradeIcon.js b/src/components/UpgradeIcon/UpgradeIcon.js index 11a7fcb..11d5ee2 100644 --- a/src/components/UpgradeIcon/UpgradeIcon.js +++ b/src/components/UpgradeIcon/UpgradeIcon.js @@ -1,10 +1,15 @@ import React from 'react'; import CSSModules from 'react-css-modules'; import styles from './UpgradeIcon.css'; -import availableImage from '../../assets/images/upgrade_available.png'; +import availableImage from '../../assets/images/release_available.png'; export default CSSModules((props) => { + let style; + if (props.release) { + style = {float: 'right', marginRight: '5%', cursor: 'default'}; + } + return props.available ? - : -
; + : + null; }, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/containers/MountItems/MountItems.js b/src/containers/MountItems/MountItems.js index d37e624..d0ce06d 100644 --- a/src/containers/MountItems/MountItems.js +++ b/src/containers/MountItems/MountItems.js @@ -35,6 +35,8 @@ class MountItems extends Component { Sia: sia, }); + this.props.mountsBusy(hs.Mounted || sia.Mounted); + let hsLocation = arg.data.Locations.Hyperspace; if ((hsLocation.length === 0) && (this.props.platform === 'win32')) { hsLocation = this.props.hyperspace.MountLocation || arg.data.DriveLetters.Hyperspace[0]; @@ -92,6 +94,7 @@ class MountItems extends Component { }; detectMounts = ()=> { + this.props.mountsBusy(true); ipcRenderer.send('detect_mounts', { Directory: this.props.directory, Version: this.props.version, @@ -117,6 +120,8 @@ class MountItems extends Component { [storageType]: state, }); + this.props.mountsBusy(true); + if (mount) { ipcRenderer.send('mount_drive', { Directory: this.props.directory, From 5fcdece54a5e5cdf936e6957b3a93def69dc0c07 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 26 Sep 2018 17:51:16 -0500 Subject: [PATCH 03/27] Fixed loading display --- src/components/UI/Loading/Loading.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/UI/Loading/Loading.css b/src/components/UI/Loading/Loading.css index eace39c..4784845 100644 --- a/src/components/UI/Loading/Loading.css +++ b/src/components/UI/Loading/Loading.css @@ -1,8 +1,9 @@ .Loading { margin: 0; padding: 0; - height: 100%; + height: inherit; width: 100%; + box-sizing: border-box; } .Content { @@ -13,4 +14,5 @@ transform: translate(-50%,-50%); width: 28px; height: 28px; + box-sizing: border-box; } \ No newline at end of file From 7de028e0f09d49c7bc16a380329042b1bae26d91 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 27 Sep 2018 17:47:24 -0500 Subject: [PATCH 04/27] Show window on second launch --- electron.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/electron.js b/electron.js index 9dce969..48c4000 100644 --- a/electron.js +++ b/electron.js @@ -14,6 +14,7 @@ const AutoLaunch = require('auto-launch'); // 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. +let mainContextWindow; let mainWindow; let mainWindowTray; let mountedPIDs = []; @@ -53,7 +54,7 @@ function createWindow() { }); const image = nativeImage.createFromPath(path.join(__dirname, '/build/icon.ico')); - const contextMenu = Menu.buildFromTemplate([ + mainContextWindow = Menu.buildFromTemplate([ { label: 'Visible', type: 'checkbox', click(item) { if (item.checked) { @@ -78,14 +79,14 @@ function createWindow() { } ]); - contextMenu.items[0].checked = true; + mainContextWindow.items[0].checked = true; autoLauncher.isEnabled() .then((enabled) => { - contextMenu.items[1].checked = enabled; + mainContextWindow.items[1].checked = enabled; mainWindowTray = new Tray(image); mainWindowTray.setToolTip('Repertory UI'); - mainWindowTray.setContextMenu(contextMenu) + mainWindowTray.setContextMenu(mainContextWindow) }) .catch(() => { app.quit(); @@ -99,6 +100,10 @@ if (!instanceLock) { } else { app.on('second-instance', () => { if (mainWindow) { + mainWindow.show(); + if (mainContextWindow) { + mainContextWindow.items[0].checked = true; + } if (mainWindow.isMinimized()) { mainWindow.restore(); } From ed4d1a0eabdee82c81bd46a45b274b96ba0f17e0 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 27 Sep 2018 20:41:37 -0500 Subject: [PATCH 05/27] Added license --- LICENSE.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..7aa51d6 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,8 @@ +# Repertory UI MIT License # +### Copyright <2018> ### + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From f11ddb6d751c5936a917e67756bf5a55768388a8 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 27 Sep 2018 23:20:01 -0500 Subject: [PATCH 06/27] Fix version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3acebef..f201ce1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "repertory-ui", - "version": "1.1.0", + "version": "1.0.1", "private": true, "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.1", From 9968116242f2b5c6543246a4ee49c164233df0f5 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sun, 30 Sep 2018 11:00:23 -0500 Subject: [PATCH 07/27] [Application configuration support] [Fix component unmount leak] --- electron.js | 94 +++++- helpers.js | 110 +++++++ src/App.js | 145 ++++++--- src/assets/images/configure.png | Bin 0 -> 13414 bytes .../ConfigurationItem/ConfigurationItem.css | 36 +++ .../ConfigurationItem/ConfigurationItem.js | 107 +++++++ .../DependencyList/DependencyList.js | 4 +- .../DownloadProgress/DownloadProgress.js | 2 +- src/components/MountItem/MountItem.js | 45 ++- src/components/UI/DropDown/DropDown.js | 2 +- src/components/UpgradeIcon/UpgradeIcon.css | 2 +- src/components/UpgradeIcon/UpgradeIcon.js | 6 +- src/components/UpgradeUI/UpgradeUI.js | 22 +- .../Configuration/Configuration.css | 6 + src/containers/Configuration/Configuration.js | 287 ++++++++++++++++++ src/containers/MountItems/MountItems.js | 164 +++++----- src/index.css | 12 +- 17 files changed, 880 insertions(+), 164 deletions(-) create mode 100644 src/assets/images/configure.png create mode 100644 src/components/ConfigurationItem/ConfigurationItem.css create mode 100644 src/components/ConfigurationItem/ConfigurationItem.js create mode 100644 src/containers/Configuration/Configuration.css create mode 100644 src/containers/Configuration/Configuration.js diff --git a/electron.js b/electron.js index 48c4000..c943087 100644 --- a/electron.js +++ b/electron.js @@ -275,7 +275,8 @@ ipcMain.on('extract_release', (event, data) => { helpers.mkDirByPathSync(destination); const stream = fs.createReadStream(data.Source); - stream.pipe(unzip.Extract({ path: destination })) + stream + .pipe(unzip.Extract({ path: destination })) .on('error', (e) => { try { helpers.removeDirectoryRecursively(destination); @@ -301,6 +302,59 @@ ipcMain.on('extract_release', (event, data) => { }); }); +ipcMain.on('get_config', (event, data) => { + const dataDirectory = helpers.resolvePath(data.Directory); + helpers + .getConfig(dataDirectory, data.Version, data.StorageType) + .then((data) => { + if (data.Code === 0) { + event.sender.send('get_config_reply', { + data: { + Success: true, + Config: data.Data, + } + }); + } else { + event.sender.send('get_config_reply', { + data: { + Error: data.Code, + Success: false, + } + }); + } + }) + .catch((e)=> { + event.sender.send('get_config_reply', { + data: { + Error: e, + Success: false, + } + }); + }); +}); + +ipcMain.on('get_config_template', (event, data) => { + const dataDirectory = helpers.resolvePath(data.Directory); + helpers + .getConfigTemplate(dataDirectory, data.Version, data.StorageType) + .then((data) => { + event.sender.send('get_config_template_reply', { + data: { + Success: true, + Template: data, + } + }); + }) + .catch((e)=> { + event.sender.send('get_config_template_reply', { + data: { + Error: e, + Success: false, + } + }); + }); +}); + ipcMain.on('get_platform', (event) => { event.sender.send('get_platform_reply', { data: os.platform() @@ -408,14 +462,34 @@ ipcMain.on('save_state', (event, data) => { fs.writeFileSync(configFile, JSON.stringify(data.State), 'utf8'); }); -ipcMain.on('unmount_drive', (event, data) => { - helpers.stopProcessByPID(data.PID) - .then((pid)=> { - if (mountedPIDs.indexOf(pid) === -1) { - event.sender.send('unmount_drive_reply'); +ipcMain.on('set_config_values', (event, data) => { + const dataDirectory = helpers.resolvePath(data.Directory); + const setConfigValue = (i) => { + if (i < data.Items.length) { + helpers + .setConfigValue(data.Items[i].Name, data.Items[i].Value, dataDirectory, data.StorageType, data.Version) + .then(() => { + setConfigValue(++i); + }) + .catch(() => { + setConfigValue(++i); + }); + } else { + event.sender.send('set_config_values_reply', {}); } - }) - .catch((e) => { - console.log(e); - }); + }; + setConfigValue(0); +}); + +ipcMain.on('unmount_drive', (event, data) => { + helpers + .stopProcessByPID(data.PID) + .then((pid)=> { + if (mountedPIDs.indexOf(pid) === -1) { + event.sender.send('unmount_drive_reply'); + } + }) + .catch((e) => { + console.log(e); + }); }); diff --git a/helpers.js b/helpers.js index 69ac777..7564a12 100644 --- a/helpers.js +++ b/helpers.js @@ -195,6 +195,85 @@ module.exports.executeMount = (directory, version, storageType, location, exitCa }); }; +module.exports.getConfig = (directory, version, storageType) => { + return new Promise((resolve, reject) => { + const processOptions = { + detached: true, + shell: false, + windowsHide: true, + }; + + const command = path.join(directory, version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory'); + const args = []; + args.push('-dc'); + if (storageType.toLowerCase() === 'hyperspace') { + args.push('-hs'); + } + + const process = new spawn(command, args, processOptions); + let result = ''; + + process.on('error', (err) => { + reject(err); + }); + + process.stdout.on('data', (d)=> { + result += d; + }); + + process.on('exit', () => { + const lines = result + .replace(/\r\n/g, '\n') + .split('\n'); + + const code = parseInt(lines[0], 10); + if (code === 0) { + lines.shift(); + resolve({ + Code: code, + Data: JSON.parse(lines.join('\n')), + }); + } else { + resolve(code); + } + }); + process.unref(); + }); +}; + +module.exports.getConfigTemplate = (directory, version, storageType) => { + return new Promise((resolve, reject) => { + const processOptions = { + detached: true, + shell: false, + windowsHide: true, + }; + + const command = path.join(directory, version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory'); + const args = []; + args.push('-gt'); + if (storageType.toLowerCase() === 'hyperspace') { + args.push('-hs'); + } + + const process = new spawn(command, args, processOptions); + let result = ''; + + process.on('error', (err) => { + reject(err); + }); + + process.stdout.on('data', (d)=> { + result += d; + }); + + process.on('exit', () => { + resolve(JSON.parse(result)); + }); + process.unref(); + }); +}; + module.exports.getMissingDependencies = dependencies => { return new Promise((resolve, reject) => { if (!dependencies || (dependencies.length === 0)) { @@ -323,6 +402,37 @@ module.exports.resolvePath = str => { } }; +module.exports.setConfigValue = (name, value, directory, storageType, version) => { + return new Promise((resolve, reject) => { + const processOptions = { + detached: true, + shell: false, + windowsHide: true, + }; + + const command = path.join(directory, version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory'); + const args = []; + args.push('-set'); + args.push(name); + args.push(value); + if (storageType.toLowerCase() === 'hyperspace') { + args.push('-hs'); + } + + const process = new spawn(command, args, processOptions); + + process.on('error', (err) => { + reject(err); + }); + + process.on('exit', () => { + resolve(); + }); + + process.unref(); + }); +}; + module.exports.stopProcessByPID = pid => { return new Promise((resolve, reject) => { const processOptions = { diff --git a/src/App.js b/src/App.js index 73be628..2635a6f 100644 --- a/src/App.js +++ b/src/App.js @@ -1,18 +1,20 @@ import React, {Component} from 'react'; -import CSSModules from 'react-css-modules'; -import styles from './App.css'; -import Box from './components/UI/Box/Box'; -import DropDown from './components/UI/DropDown/DropDown'; import * as Constants from './constants'; import axios from 'axios'; -import MountItems from './containers/MountItems/MountItems'; -import DependencyList from './components/DependencyList/DependencyList'; +import styles from './App.css'; +import Box from './components/UI/Box/Box'; import Button from './components/UI/Button/Button'; -import Modal from './components/UI/Modal/Modal'; +import Configuration from './containers/Configuration/Configuration'; +import CSSModules from 'react-css-modules'; +import DependencyList from './components/DependencyList/DependencyList'; import DownloadProgress from './components/DownloadProgress/DownloadProgress'; -import UpgradeUI from './components/UpgradeUI/UpgradeUI'; -import UpgradeIcon from './components/UpgradeIcon/UpgradeIcon'; +import DropDown from './components/UI/DropDown/DropDown'; import Loading from './components/UI/Loading/Loading'; +import Modal from './components/UI/Modal/Modal'; +import MountItems from './containers/MountItems/MountItems'; +import UpgradeIcon from './components/UpgradeIcon/UpgradeIcon'; +import UpgradeUI from './components/UpgradeUI/UpgradeUI'; + const Scheduler = require('node-schedule'); let ipcRenderer = null; @@ -208,6 +210,7 @@ class App extends Component { AllowOptions: false, AllowDownload: false, AutoMountChecked: false, + ConfigStorageType: null, DownloadActive: false, DownloadProgress: 0.0, DownloadingDependency: false, @@ -313,6 +316,18 @@ class App extends Component { this.saveState(this.state.Release, this.state.Version, sia, hyperspace); }; + handleConfigClicked = (storageType) => { + this.setState({ + ConfigStorageType: storageType, + }) + }; + + handleConfigClosed = () => { + this.setState({ + ConfigStorageType: null, + }); + }; + handleDependencyDownload = (url) => { if (ipcRenderer) { const items = url.split('/'); @@ -440,30 +455,62 @@ class App extends Component { const selectedVersion = (this.state.Version === -1) ? 'unavailable' : this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]][this.state.Version]; + const downloadEnabled = this.state.AllowDownload && !this.state.MountsBusy && !this.state.DownloadActive && - (((selectedVersion !== 'unavailable') && (selectedVersion !== this.state.RepertoryVersion))); + (selectedVersion !== 'unavailable') && + (selectedVersion !== this.state.RepertoryVersion); + const allowMount = this.state.RepertoryVersion !== 'none'; const missingDependencies = (this.state.MissingDependencies.length > 0); + const allowConfig = this.state.LocationsLookup[selectedVersion] && + !this.state.LocationsLookup[selectedVersion].config_allowed; + + const showDependencies = missingDependencies && + !this.state.DownloadActive; + + const showConfig = !missingDependencies && + this.state.ConfigStorageType && + allowConfig; + + const showUpgrade = !showConfig && + !missingDependencies && + !this.state.DownloadActive && + this.state.UpgradeAvailable && + !this.state.UpgradeDismissed; + + let configDisplay = null; + if (showConfig) { + configDisplay = ( + + + + ); + } let mountDisplay = null; if (allowMount) { - mountDisplay = ; + disabled={!allowMount} + hyperspace={this.state.Hyperspace} + mountsBusy={this.notifyMountsBusy} + platform={this.state.Platform} + processAutoMount={!this.state.AutoMountChecked} + sia={this.state.Sia} + version={this.state.RepertoryVersion}/>; } let dependencyDisplay = null; - if (missingDependencies && !this.state.DownloadActive) { + if (showDependencies) { dependencyDisplay = ( - + ); } @@ -487,19 +534,16 @@ class App extends Component { if (this.state.ExtractActive) { releaseDisplay =

{'Activating <' + selectedVersion + '>'}

} else { - releaseDisplay = ; + releaseDisplay = ; } let upgradeDisplay = null; - if (!missingDependencies && - !this.state.DownloadActive && - this.state.UpgradeAvailable && - !this.state.UpgradeDismissed) { + if (showUpgrade) { upgradeDisplay = ( - this.setState({UpgradeDismissed: true})}/> + this.setState({UpgradeDismissed: true})} + upgrade={this.handleUIDownload}/> ); } @@ -510,28 +554,30 @@ class App extends Component { - - -
+

Release

-

Version

+
+

Version

+

Installed

- + selected={this.state.Release}/> - + selected={this.state.Version}/> {this.state.RepertoryVersion} @@ -558,15 +604,24 @@ class App extends Component { {dependencyDisplay} {upgradeDisplay} {downloadDisplay} - - + {configDisplay} + +
- -
- + +

{'Repertory UI v' + this.props.version}

+ this.setState({UpgradeDismissed: false})}/> diff --git a/src/assets/images/configure.png b/src/assets/images/configure.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ed2e02b6edf0f1e63ff818a00282af574ef610 GIT binary patch literal 13414 zcmZ|0c|27A7e7v9AIsamZ;i~@WnV*M8S9KCgi^M_*s|~IC?Yf>WEtDoB_uoZt`KEk z6N<8vB3XYI?>^t}@9}&5{Bf>vp68tBS?-;CU-#vqiIEP7ii3)XhzO*odjm;CbP4$N z5)lOna3GXi=^-K_Au=&Ag8?6bpNNPEb8~Y*IypH32Q(Ue`*wu4x3`m1#QppCU0oyY z`uU;JfHuI>GXjMQyyqR^<`(GW10aK3Tp~O?f&h%8SFoE~gtK=rfJFI(IC(_4x`sG= zM!36&pu7NNh^u#mvqvak=;9gb?jD5l40T2axq5}Vcm%n*g`zxy+}%T6J%e4)p>AHm zD335Vw=?PN9_;EF=7J7(^9)0wL)_iNTs=Zu0O=WmLWjAXOBeSLSC251dx#q#(IEiR z6%Am5T|Gik?!j(=L3=oX&J`Z~KMdruKWs1f0~!6#5d9zj{}%=*3t$Tn_=|J_s&Pi_tR_Hx&MR<{ z!hh8R2%MSxFC*aNIsgB$bpZ^|I&vQRFY==J7c~K#pI0FG91{$b6bO1I&ujG`#{E1r zATR2F(Tl$lVEdoRh2aHT!0lPq|H(6+=NmM*<)9B%P0e6X4Vr zX=F-7e2IkgG8s7qB^5Odh?b6?;U7jOW)@a9b`DN1ZXRAfegVNNV4V^p3DVV|@owL`x6{cfkNU=}|uAthv#)Ix*+N_UY+Sj>|daUjsenB?OATxI=1I@MNgsvV6 z45_UYC3}>~%baS<=ttL=bpzIE`2{Je3-ql81Sy1u!K}b1HJtui;1hf~?Ntf`kO>n62m9dQkEb zEgjoA%4DX2 zd$wO+O5h+AeT7VMYhpTVVZCyh<`vOtPkXjsQDR%kM=X#&4AMtv1~6S$J*)6*UiOp5 zCuzizXa%sR0AYf*6fbMA2J3Zl*tg~fA9hPt@xwqV3(kd*KQt`v1w~h-kJdqOAwu*k z;nyJc@W#|M{@OdD;Fl>2_kuXUSG%JVh4uId?~IDCq?1rvn;>(OXil4-rH$1Jm}&NU z_iWdou&p%uY9$VQ(no7e8Y;Tj86E&wtKW--VNP;%0<{ z7&n!^j89m2%r@`rF6b0YD+H}d9C=R52gqVVXp8Z(qN^IcPEBPaEgYv4xJ^7uvR(h_ z%LsS5Pd>Cj&b4?o7-&9gT}R}P&NWxT{c5Goh?lDhO^ZBmwHQZr#4w}B$}jHI#cbhd z@sc0LeLArDgbCqiH1EG5d^kTbu$y+BraTasyvuPq!dkU}*~QXCIsQgSQ&+njg24}k zqeV*)brF^n$rTj{9|6&p$TZJ|=xwwk7L22)&eV>hqm3CcDgf&DJ~_XrRfuaMR4V-+ z1gW_};qYd~LMWTcYF z+!aZT6ti$|YZolx@cEpV5e58!4Y*{8eq+T(;j0hOkmRf-EEjS7=&^DV{074nsU+>H z4Jw^SrHiVQbSd7{Ox3BRT@!tYvw2Y^USQb{G1 z3S@ie(#5-zKGfi!^N~h#BSnA_{fGB9k5?`rI6W0nzPfYJXell6Ng zwf4I^d=F#)UV~{Y-f*KG$NW(ENTOsYAxvu0hZU@EKOzJV?tHqvEp7eeLHE{O4za8` z8o5?@@3mT#IQUg}vY;By5ik)e8LG3*AT&2%ZOF6Vnn*Ls*|cQHUBPX?%+yv+;ON3B zrDJ_DhTjo&(liyc;qiNbswPuABwUsCDVO@gG&5Rvr5xNBR`SKJ1bzR(>Kjbq%p)!{ zKmF{H%h;=OrhBUHGkS45m$iV?5mPhx!0^o|z$XvrO6##|(&Q+&Q_lXs7SI6KzmnxfdwLHoEiKZ}dL7dq_?*^mCgE>)X-i zaKXmsB>5L;<1;ixDk@inAIU6(J4)vn^zL@$km_JRDZW7KU7(A*xHu60x7euAc~kmYn~@~i zgZW!`8~7`{Z(jyY$}>fnnHZ=7eGmi&7(p5#bB8?1@)K9IN#1XiNjW>$;384dwCsr_ zMe<3OcIfm!r_~qUVHe(KyS4@&sK#tN%aVud5bWXvg+`hZrnrAxUFhJ+C+=miKeE!0 z+67t`pQ)`1V>pWM3UT@Omf;T_KaV;1*ZNBeUsA$k?scK|3t4za9x%VVZgRnf@0?Ba zw?xzp?}#J)nzRg-dd8Fs-nT;7f%sA(qFbIiyjI+&@W#WmGe#ctf;^6&JIzv)`$39Pyg4V(q)8t#-}7cB z_$Hh+GphQl#n1yL!w}l!)z^>3gBJMA3eM|QbTJv_DXQ&h9+^y-mr9<6oZ%f5<{}p< z{BxE^kpF<)t|489MzT@s{9D7(r43;tJT6_U{TK*@Bume(kjx?4Vd(5j^- zO5^g`EDLZ0v&;m$GiY^dB|lC1|WRu%QvR;S@nE#P9aCgbGT&d z9S^nVqK!g`1iFlkG0N&9ivC5EjjY*vkK@U`ZR7`74R^ldoL}_i3xM)Dpmu(n4mFTm z+R_;k6r)}OPJcWW4L$?7kk-(QpY>5+ldv~Z-*=hSSJ* zkh4mZkKZ25nL8QhTEY5#P)?U|bhWj-2{iZX!oyFzWq^;hx=l!_x4uNh!+PbrpJ+K6 zH@GH&?sGF&&Bt{hfjMvVwb8o=wNoNKNx8ofAX9?pcL#!VvIU7R5bpSo&+K^%uadTW?dCd=xl#7@sdhedm{d0j>65t_R9nFvC((ScViDX zan=Y@Bm6PVu6suzZRqlHhDceX1X(;#M-=HN`D{3hL1D2!udMFA1A5=A<)#cYH24aa zsfj`Q_xbiWW4A3P>^3B6&D!{hvkoAbJx0jso-N^P| z^_gq!3_0c|@F{(-xp=JD<4${3JIGhwg^Lj61`w3G4gC zeO=8t-T#8-=-t`!+r*>S!YcE)l#@FDU z{TM|v6!q_hg1##bfeUxbE2CM}N~6cA**D#+4bnBXyA{o*a^h(w+Vs*rU(P=aGJ6(9 z^U78$eJ6Qad*p68pbFq_%!U@ur=OVp5lf(vk2}#wcVq~3k~6o{!DM?B!L2w0OHVAy zk1n%sDwboRuR8VH%IZXT**$u#;ps5`Kv!vV7CwTQAil0tvDG|8)%w+8FB1QnsJx{FzZFutS)3`imZ~@v?NYl^9=?IXuqH*+HS~16jFB;;+}K z&%@5qgfEsiXYfqZY<8zQGRXk zc!Z$G>+nJ5<6wW6r=YpuDCnG{;K1knKC^wprl7}en|TcmBWekI=!3v- zVK)QRMM?8sM?#sOr+5s_;eBY23N;?vf0Pg@=09xTKQx?OBgo@s%B0Cw0@TbKWn+0` zmH)N-q&p(l-@Lg@e>4v&4`q*{>(B2K(QTm>{FX6T_k4@SGv4=*+PrVNn{Fo@*9X=u zZA~mWF_;O@^0DJCLcFv!d(C_@Xj<5v9Fr;zB5S*?5r1W_4NA8nod-?S+J1PoY)5=p zV5>af{R*Dsr+7t-FPmn%>c9f4q8r{vOoesz#}0AxozqH>ZJWe4Gj^KO*}1uKid?FQ8|eY_SMQbWAlP`6ex&;}L;nnWZx5o)ro1JOir&hby$0D)=ABZi zZZAyn2Nt2(&B;1%PxIz$S}6w#ge+SJFSbO<&d2pgm-k1_eKJa~5%9X5H2Lw@U`dpf z*PL+q(J)asqn&2Dl-DhXd7)tUjV1f0%6p3DA26r&llpNxU+1fd*D}fGo|E4kv(ZcM zAUwvHIGW4Z_#Ry~ctV#PmB>@l_f~1UIG{|Lry8YXdvCfZ7e)HYx2i~UscgGc%ipA+ z4!E^^eUEO$b;8iTNgzPXoG0eCt!6sNZysax{+WN?t9VW!#8Qj(c9o*pvrFHX)Ut4N z*ty$`$!o=k0vzK}MVEw`BDK-l>nOD!$9i6tZFzVfiKBJ*a`!T79Y^)*q2@OA@U}a9 zqs~Gq(*Em$jJeO0Lb@i@Hw*pBUN9)ET9t<~N7WoZhd%Do(}~a*K~^NbeRELX8^u>@ zm^axpF<#{I=DXNJeliDh-*ng9s(X>gqifUft(T}!so zxn`jr?j$FQ_xlzrD|2rt)$45_bY1n*Nk&@&RYn&>#?#>@PwmE7keH5msWdkH%bMIvB4SUdKc>++0slC@T0{R{iaiDarRJ~nOBJ6RKtep|SJ&Cn7ExT9Jn4tZ)?SH&MK_=_JL z(DhVb#HBO)UAHXvTnRBbmHm5b_&4)ZNep|>i z*O*THi-)-O+I1rfl&e-?(U6SAij$?>L!2VTBYrG5aRufDbSh=Nr?vST8fp4Q#8A973|eRXmpu=+jOYK3qt zEL*tTJ?47P^!2IY+HdPrtJxOhD3buPU2X-?xQgbK0crOVcB2}kpFE>ut9;0BNVblv zwnf|Pi6r3?zEMPzIx^b#7Ic_Q$m{T-tt<1Z4Gr(~-ohGc66F|LN%LBa-qN$Zc0Wa1 zQ35$pXJhHD;#izCACV}WO(7z%WorBfr28_vuguwl&4LLb$I(8KTGxiKl!^-W-@QJ) z3oXb!w1=%R!DigLwww@qM3qh0V4zoYT*r)lF5kNo*s&nYM_E0j8IqTU%M{N2KC6>8 zD;&lR*6E67VP>j|{g{MX54TKtm8`_F*nQPiq9{4N!M^J!b~m;L7GC0F9A+u`Sn12u zcG9|h**!T?muEN^@z9M+eQ&#>Im^B-QG{NRj#sM2T$Vs$m6*aCBXJ~#_I54O<%V>G zo88y&jjzD{ZZ!yB_0Y;V?V*>F5+Rqz>}Uzj-S_c(L8RZ>42Q-=_a{i0P*rz6e>KZy zjoP~L4S^QzS5B|f+_xD2$TScW)FuNJ>%q`DN)#cN^dvpmVV+&D4ot>LN|rqGhwE(i zksCGmUtxxs{t#GM%)-qY6KrJAV=0J z2h5s@O9l#DE`_el!xNG*R^(g7eFpoV63wQj=$&@+mop@fT-adx_S3%Qq93C^E`{r- zm)@~(5re5N=;R?~=$*K05cc00w%b@*@F}izFSU`sL__hq*J!7#bOYgiu*b* z0SXo`SPsneRb?Ju;*<1|H(7Aa^reLvk791uH*KHD%bVJh7?d}pQ>oJPwc%@DkoA|n zPQ>-`+OY>&Fcz5)Bu^L|;bVh&FnUr@16aO6VYjR#ipB3p>2yJVI(DJ$K-J^kIQC|e1#~W>+gjW zGn9=OTE-6wnEVc(iRD0=nT$KCtpfdebMb>;~4ebylgyFQgDc{K}n zxopd>`S_7`EqHjL@16Q5jkVkuMZ-SG+9M*Rhjk<%`wy3_8+V^~?5aaaf3Etqpr+-? zT}*W{ucg(!qSxI*`cwD6j@(=Svsl*k&Y6JM`pCU|K$b*nNpxRx4KkbzbZ_at1|ql*Yyx3NPA zQ~P1AJ|)3?Bb+;#!9k?abeqGMIK};dcj84O;e9cRLFB^L(Vf`5&GxncM1$7g+Q zTqRFB1}gxSSih@@(a-=zZ8k*7gw;t^_Z=#tOMO=B-NqK(2$^YphuWpeaCTTk6zY}5 zFp50+O$6$;QE3$*&mh zJ6YQCwwLRNm+_1Bf_L7)n5wipkFO6Y*5bZ?f-6CZAC<&F)pU?TRGg9J6TuCwf5%Lj5@jkp{S(wy@GeNGqPV3-!WA^rPO7=D&t#fiLv0h8f1(29VXr#dKZ$GQ9p6>o2n5yZ z&TJpx@6*MYelr~f)J(9S^C^{$8A&0h0oF|910sj6t4Xt~U3v?%*h+2L+NWuAT3*PP z?ExK)c7-VKLF^oB@~QqI1=mCrjuKCnTZ9L3-K?20{21}Ph~0aT4~-t04a@EVOC@}` zAv+k4>+;e`qP=NkS^tFWO;`EG?Y&RCSI45V?TU(IILEFVv4ckzN(di2Q1sNf!vr8|&^F#>^W zLGbqLvOmCJ)A_Q{bC9)mFC$(kx5xpal5VWW#nffGfP|Cbve*oIbLm^L7k?Untj4ef1s(>fZJ#*0XDFDX)0xkx}? z74nB;tj7m#6cc|@h%#OCd;(#o`U?@m8eEr^PEE7_%Oxp)k-<#xtMF@Xp1#s6v1?!N?3 z^k7p&l0l&Z-(Sd06KT$|9xk|e{Qqx`!N?ui^3)}44%vSRAj#q3H)QLcrS1Jq04OGJ zdFnA%=5HWKHjc}TvjI|0{GZMLrz53uh+*D;l1lv7MN##LvJ;-!Nk|M%FRqURYI?VMC)_zv#nDI!!Mo z#P1q-NfFQDdeg*5^Dl2uPc9Wr$2NdU{woE*6--TSD&cL2+~?_uSM&KyJcJ^kJA^nigCTe4elTyhOT); zth6v0CdOD?Tz4j-v_2Q&!Ix^7VcrT?J_UEiY@KK(e$gGGMcV>bt)KRD+)PO~=4TCu zBquXw9G9^l_lA-Mjx-O$Pu~?rpm?LW-P`%LXGcmqu#sjtPWEdD&hbMm~mIuI9*lY6YB!2 zgbxSXOqSmKFgJQHH^?frNONn&5aK;i>-EyMVbX77BBglFOB*r?w2R%XCHI%>!-;5T zbV`pulYbM-U%pH_t=POzW8p3t`{*vY|_zwDDK2QM7i<9Zko zoc1Av$Z1TXblHh?QW5}kSC%d}CA|D`8kd{@(<9!>)3jdhQ72VR;j&+*Y;y8U1kcG* z-#C7NDqq5abog8V{(DF9dwlR+d`>iwQrtqx?L1y!2R`B1-Oc z4VY?*>li7zZ*Sxb{iQLVqZM~4^IE3RhLtqRq}08sz-q1~aokO2T`?25)f;0VHArf} zipA=A4mIV?h3C(u@;6m%LgbB(SBaALWohnzDD4)b$Xqa62Hkhf7;9X2yz6(&jiMD7c!g)iD5CxmD-b1qa_|Cr_*Ct_?RTysf_+@!+@vn|TGq+Lw#8Ak(epW**oTpRTU;;1Uwmmsd5#{X z;yy^CD455;pWOf>7vR9{63*)N_Oq*yETSi_?nT{!q;Kz;S#o3aYD|4uj!Le=I%4gI zWzBT`G_Ly^BJ7C_`a}vH0u1*J9mrv&grZ7bd~JdFrGn4e&`{23y%^zO_LFPRaaNLR zcgy>)^R-@2ZvcOEBXsdVTNc)@A z`=3+6W_TCsmv50~r0Q83L(Y;LLFJV_z{7^!Cj^t|%o9S?x5)J;gaRvycH1wmLGe3! z6i(bvamxn#Ba~QB6pC8}kMxlVtvL25=W?MQ;VE))V^eF$!kJ5MF+h(enbiEYouEk= zR6}^_GQ<9uZeMU$eU6{mLAhLL+1`YiwG~MT2v-R@T1{bsZFRPe08eoJ7`m~8NO&2e zyj8CaDNHM$AsvD(H}mfYRIq5t4&-i zt(sQk`&KWh682#BU7Vv*5}fUbHL=yq%hc94k@ch}dmN5*gy>*5{5^a0{*8?YlXnSR zmXc5EPPSidVmHvF)YBWq$r9P!th6UtO8$+Jmvu^nr@5j&R^_{MRW2K=s`G$&T{@mA zK@U5D$LyrYIa{r%lNkFqg`=j!)Tn^B9;@si5$jUn=?S9njJBjYNUgw{>MEpz9p$fo zd6y~f&Ks^ip{~UEFX7rjvvlW!UaG2!VtUKb1Lr)@)IK zeVXf8e)TTGa);JYLXd)|xbh3VC9*cY*&lR0%f?#MR@u5ME!j+gMZ>FyxNkF7w(WhH zr;}}wMjI=>X5Gy4r-~!6FeGH!$i-rtgKG!b&cCkaEURgis4Q!UuM?-h5Z*)Fs1mEk z@e;c(;wtHffe8o5V|&EyJ{AGt+~P{!%H}BZsX=NUrF()E`L>`6p3-$D(l_>c2|SUG z0k!ZEjxNC=_R3*U?Ye0Ki-1BdZrRaNKH7ZR&kYoq|91Ny3s?*Bc)E$NKy)Dr0#3X` z0C7~*mq^$IY+74D{A4RDbcV7i(mD`3;Pob@H|1f2%+*SNv@EJx)!h}M)B0#B(n5s) zP&L}v7?FJ5Af4bkfwEqVEuaZ7X zg~C~mtQY=w^SCTiM!xs@$=ricE8xNvnZ+Ydxqn?_hTiJr-?b}MJY;>e`iz><^*2{T z{-baGeNkFp%qBmxwf`0{|JJ3b1xH!D$uOqf%t?eU`STntW-!aR{a*6wXE%FB-O=&@ zI_>RcvQ~qFEltbww7u|bv7zvp*=_srLVnz0IKeoZpz$8>13s$i-7nklMKMs5zLjjI9PPHZI2*KWG4Fp3z*66}il zy6HpLIiSz!-i-z0qt(3bn1K|kfCbvu#3z3H9_9V9oXN)ts8>ZGo56T!u})WwCNI+Q zK95bRpBv>!d7v&ubzm|y&#|i%gMcY>d!UYNz#}Dh?}jxMeb6rdL>b}QmIpQNg1r-W z%If!|{+$CXvpNtT0W(luIS^MNZapBg-zZ_T%VyqQMakP74=oe-vKmicTX`|Y8b4pX zzJ=f6J1Pa%uX$n*1!5v_@#D8sFHiWD=WCXW90`RmpP5OFaviCvrZqt?Njxg(o3`2S zS17-t+$mUapJjxEI)osYDp9t>bhLzp1BB?fPkqv=fu$SEz*00jbN$G|)rJXEM-+<+ zGj}_t+Df*PSjA7oym7Hhr^KZAmvCV9Oy#j}S3AmfpJ0WQlv%O8Wdz()O)Ag{c-nII~=^XK(|mS?ny)u znlpDbJ5eS$8|vA~dtkZ(FS<1|^Lbk1efVQKw>X)zw@D%kx6G!1De^XX#hH8TE&-Z)>D#wky4WReR{}J1*n=-!Jo01gPK&Kn z@Bt3g0-0{JAF3a^nUlsF-669d2bJfWrJd7Cx7x1aFr3NrUsxiEr)@dT4e{WW^POK} z%^hz?f%eUL%dtFhzo^7;eNR;!6c(+@MF%vkXEm8OXdD!Zf!9HgZYVWC3j0QSyo_GK zp;wgo!UW#q>%>{vX@jxQx$zs*k8toMy&f;*9<*HLfv;k94wO!iVD&EDlz)tQCABT# z41^(Qn>wP!hwrMGr(N#xvR>3LH_%k_ttjfV?eVgkk%qdo&9^CW;&-fAq;0%J%;mm! z-T#Ozu4k71L~nf~{n@rPFLXARCO`(r=jTGz!L70#4GMN~_8aLNh(K34bAMh8%|t6K zU4FhevCLOi`qM~#CiG^f@>y}|*gaN_)6+r&zoE4 z7FcK}Wo~yJGjm{4T(77il>@y+tBG05E$(v)E*edHpJys*GK1 z-Zb6_QYxw_O`ZIQ)4Y*DvMUQkNh#oFZ;m3QHgxv~7oI#ZJN%`qu&4nIBbEq-$%>I3 zb`##?C1elT_WKbdePwR9X_5mUxEd3v31wP|UDd$$72>U5k&kost-%#C9qj8NnMxnx zSZSdJv|?l-)ie6{+S_qLq5Ktdr7{i^OSNnEtCMz&xok$N)--ZlJK{-)yX{&j{z;pk z3)Yi{4Uq$71(=MUu~YLkWhn_5*>d zdbuQYFviisH+QUO%j!M0sKW%dO_J2E?F~XVepuJeBUbfTx=n{j0ScME(?ZjxN1vWC z1PZil)pOS`wHQfmNSy)hT>ubn(b|XpAB6ic?>THvR(Yl^q=YWr=PAr};8$TaG6(C0&3_c&Nm4Q-6I5 zjA8y6K;Rsp1?)NbaImY=#25OWN6BqyLDJ>Y?iK1(p>qaiVn-7szMt+{d0C(QqvY}X zI@=EEnO5#XTm0soua*kuht(a<*=;9Avkgjsyg(9;a&_qLpuB^`><=T5LYXsU_QxR% z-*@9oS#_cG?g^3k@;=&r1~o3DupApEvr$oMD)Z${O#YhQ8EoJjX3`976cOg-CSFaR zGJJyRmip5%T$#>#$#!Dsftd64cUR7!8|TmzStyR7BAK8ryFbH|Rd*_^aOH@>@Zcm( z@N zgmE2xJN;Ri2@!bZByIO~jCxvKYM~bN7wZ{>#CU(I=v@o;S`0Wm`wl*hS`! z8!tsSYp6kCatz7pW&xu3V|{mot4fCU6&=hEPtA`e02#G^&dHpvv|_aTtLfsBNBUfP z7`-|hWL&;(AEek?X$q>L9;#Cqo^t`8^%rxBxaXcg#`HTr8AF&Dj?9~nj2L{-7jS?n z@LksAcp-s_puB(!ox>wsPeDn6Es$Sv!R?`u=B}4#R_|@r(=!efw7;(Bw4=GMT0Y5sL-*q`y)Ha&PCEz1a%>qszY^-fz!oeng&;XF9`c zy$8$OMcii_4gbWl`iy8s+a#kg(2IwrxA~f$pdFebHn;e!ju3zhdRmRc1Q^%1aV^H5 zjf!ElXj(r}&T!#JBKuFZ-PbsSlY`UZw#!_i8^zp6o(MRrv^=kSUW*1X*B2AA2{~DG z#V-F+oi+Rwj&j;mP3aPKozZjsp@mw=t2AJxzQ&D;y1Ba0wpVlCQbt4Bf}1?C8R5(0 zzN*=qWn+mw#A@FH+&8#HKQ&MOh%w)lfxqo6DZsXpu6>x)LSZeX11aEb= zYq1U&0loyY@+m!K<4F8Xq`4ba40`A0BL_jnGJ;kQh#m^LjOIpp{Tq)JjTid~S)tS6 zYQVk)Q!@w;ktSJA{tyA)__13B2%${s=!qE(2P5llX?pdfGck8!O0eso zF39D%;S?a$)vP<|PaC4{DVg{(yDKE787~0UEwO9>RKi*L?K=ntg;MRbG|F20D_~=S zp6x^(v{#c9DWjoUksMP9yauL_>n~WeR)GG7BsHhSQQ%#o;ptyrE>x~y*JD9$!ivPS z%3;)gSEv~*he(;_d}Bs12ww%!_f-v-OIBNTON!E^uyzYGv5>t~zmSC^@T5 z?ejW7A(k~CF&)felcF=kW+{hF%b3S3b7BE!UPGj(>%|9NZ-n6Ay6Yg=Ps9N>R^6v5 zqBrKbf61L1dPg)}0a|3a2ehag9523@$ECnJ*2S#;<2G_6yHo5p5=)-gU5u5%+|rcC z?mU*ui(TdSSMrpSI)Y7nc|?~rdw=(Azc^q@in^=?d6q<@e)ur$b?qH0 zZ~!0Ssg&c98u}FTd zOW{8>>}nad8oi{MGHGeOz_#vmtZ1~}ePQ-!nvRgDwC9p25csM9VGCpGt67yFn*&Pw-OY^$T zj%w1E`0C@ugV@+Lwkd6WD5az4AqBsSNZ5>Aqc6JroHqms<@RQW)4GN=Kj}e1Zyf>LmmWzo71_IPOXP zOe%w@tdNUu|5jWNMNW0%%A;dOP65FO$zj_gcas{g$PaK&(~nJ^k_fw!b@u3k?auyP ONDpRoqgwM$^#22P6B^P0 literal 0 HcmV?d00001 diff --git a/src/components/ConfigurationItem/ConfigurationItem.css b/src/components/ConfigurationItem/ConfigurationItem.css new file mode 100644 index 0000000..c880836 --- /dev/null +++ b/src/components/ConfigurationItem/ConfigurationItem.css @@ -0,0 +1,36 @@ +.ConfigurationItem { + margin: 0; + padding: 0; +} + +input.Input { + display: block; + margin: 0; + padding: 2px; + border-radius: var(--border_radius); + background: rgba(160, 160, 160, 0.1); + border: none; + box-shadow: none; + outline: none; + color: var(--text_color); + box-sizing: border-box; +} + +.Select { + display: block; + margin: 0; + padding: 2px; + border-radius: var(--border_radius); + background: rgba(160, 160, 160, 0.1); + border: none; + box-shadow: none; + outline: none; + color: var(--text_color); + box-sizing: border-box; +} + +.Option { + background: rgba(10, 10, 15, 0.8); + border-color: rgba(10, 10, 20, 0.9); + color: var(--text_color); +} \ No newline at end of file diff --git a/src/components/ConfigurationItem/ConfigurationItem.js b/src/components/ConfigurationItem/ConfigurationItem.js new file mode 100644 index 0000000..0f76ce2 --- /dev/null +++ b/src/components/ConfigurationItem/ConfigurationItem.js @@ -0,0 +1,107 @@ +import React from 'react'; +import CSSModules from 'react-css-modules'; +import styles from './ConfigurationItem.css'; + +export default CSSModules((props) => { + const handleChanged = (e) => { + const target = e.target; + if (target.type === 'checkbox') { + target.value = e.target.checked ? "true" : "false"; + } + props.changed(target); + }; + + let data; + switch (props.template.type) { + case "bool": + data = handleChanged(e)} + type={'checkbox'}/>; + break; + + case "double": + data = handleChanged(e)} + step={"0.01"} + styleName='Input' + type={'number'} + value={parseFloat(props.value).toFixed(2)}/>; + break; + + case "list": + const options = props.items.map((s, i) => { + return ( + + ); + }); + + data = ( + + ); + break; + + case "string": + data = handleChanged(e)} + styleName='Input' + type={'text'} + value={props.value}/>; + break; + + case "uint8": + data = handleChanged(e)} + styleName='Input' + type={'number'} + value={props.value}/>; + break; + + case "uint16": + data = handleChanged(e)} + styleName='Input' + type={'number'} + value={props.value}/>; + break; + + case "uint32": + data = handleChanged(e)} + styleName='Input' + type={'number'} + value={props.value}/>; + break; + + case "uint64": + data = handleChanged(e)} + styleName='Input' + type={'number'} + value={props.value}/>; + break; + + default: + data =
{props.value}
; + } + + return ( +
+ + + + + + + +
{props.label}{data}
+
+ ); +}, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/DependencyList/DependencyList.js b/src/components/DependencyList/DependencyList.js index 4a5b155..1d387a4 100644 --- a/src/components/DependencyList/DependencyList.js +++ b/src/components/DependencyList/DependencyList.js @@ -8,15 +8,15 @@ export default CSSModules((props) => { const items = props.dependencies.map((k, i)=> { return ( ); }); return ( - +

Missing Dependencies

diff --git a/src/components/DownloadProgress/DownloadProgress.js b/src/components/DownloadProgress/DownloadProgress.js index 7263e8e..60adaf9 100644 --- a/src/components/DownloadProgress/DownloadProgress.js +++ b/src/components/DownloadProgress/DownloadProgress.js @@ -6,7 +6,7 @@ import styles from './DownloadProgress.css'; export default CSSModules((props) => { return ( - +

{'Downloading ' + props.display}

diff --git a/src/components/MountItem/MountItem.js b/src/components/MountItem/MountItem.js index eb0c45c..cb516dc 100644 --- a/src/components/MountItem/MountItem.js +++ b/src/components/MountItem/MountItem.js @@ -4,21 +4,34 @@ import styles from './MountItem.css'; import DropDown from '../UI/DropDown/DropDown'; import Button from '../UI/Button/Button'; import Loader from 'react-loader-spinner'; +import configureImage from '../../assets/images/configure.png'; export default CSSModules((props) => { + let configButton = null; + if (props.allowConfig) { + configButton = ( + + ); + } + let inputControl = null; let mountWidth = '70%'; if (props.platform === 'win32') { - inputControl = ; + selected={props.items.indexOf(props.location)}/>; mountWidth = '18%'; } else { inputControl = ; + value={props.location}/>; } let actionDisplay = null; @@ -28,21 +41,29 @@ export default CSSModules((props) => { } else { actionDisplay = ; + type='Circles' + width='24px'/>; } + return (
-

{props.title}

- +
{configButton}

{props.title}

+ - - + diff --git a/src/components/UI/DropDown/DropDown.js b/src/components/UI/DropDown/DropDown.js index 5ec0ec4..cc16361 100644 --- a/src/components/UI/DropDown/DropDown.js +++ b/src/components/UI/DropDown/DropDown.js @@ -1,6 +1,6 @@ import React from 'react'; -import CSSModules from 'react-css-modules'; import styles from './DropDown.css'; +import CSSModules from 'react-css-modules'; export default CSSModules((props) => { const options = props.items.map((s, i) => { diff --git a/src/components/UpgradeIcon/UpgradeIcon.css b/src/components/UpgradeIcon/UpgradeIcon.css index 4225165..c70cc50 100644 --- a/src/components/UpgradeIcon/UpgradeIcon.css +++ b/src/components/UpgradeIcon/UpgradeIcon.css @@ -1,6 +1,6 @@ .UpgradeIcon { display: block; - margin: 0; + margin-right: 2px; padding: 0; width: 20px; height: 20px; diff --git a/src/components/UpgradeIcon/UpgradeIcon.js b/src/components/UpgradeIcon/UpgradeIcon.js index 11d5ee2..a6ef861 100644 --- a/src/components/UpgradeIcon/UpgradeIcon.js +++ b/src/components/UpgradeIcon/UpgradeIcon.js @@ -10,6 +10,10 @@ export default CSSModules((props) => { } return props.available ? - : + : null; }, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/UpgradeUI/UpgradeUI.js b/src/components/UpgradeUI/UpgradeUI.js index 7e795d6..3702c65 100644 --- a/src/components/UpgradeUI/UpgradeUI.js +++ b/src/components/UpgradeUI/UpgradeUI.js @@ -6,22 +6,22 @@ import styles from './UpgradeUI.css'; export default CSSModules((props) => { return ( - +

UI Upgrade Available

{inputControl} + {inputControl} + {actionDisplay} - Auto-mount + Auto-mount
- - - - + + + +
- - - -
+ + + +
); diff --git a/src/containers/Configuration/Configuration.css b/src/containers/Configuration/Configuration.css new file mode 100644 index 0000000..675f8c8 --- /dev/null +++ b/src/containers/Configuration/Configuration.css @@ -0,0 +1,6 @@ +.Configuration { + width: 90vw; + height: 90vh; + padding: 4px; + margin: 0; +} \ No newline at end of file diff --git a/src/containers/Configuration/Configuration.js b/src/containers/Configuration/Configuration.js new file mode 100644 index 0000000..f94e257 --- /dev/null +++ b/src/containers/Configuration/Configuration.js @@ -0,0 +1,287 @@ +import React, {Component} from 'react'; +import styles from './Configuration.css'; +import Box from '../../components/UI/Box/Box'; +import Button from '../../components/UI/Button/Button'; +import ConfigurationItem from '../../components/ConfigurationItem/ConfigurationItem'; +import CSSModules from 'react-css-modules'; +import Modal from '../../components/UI/Modal/Modal'; + +let ipcRenderer = null; +if (!process.versions.hasOwnProperty('electron')) { + ipcRenderer = ((window && window.require) ? window.require('electron').ipcRenderer : null); +} + +class Configuration extends Component { + constructor(props) { + super(props); + if (ipcRenderer) { + ipcRenderer.on('get_config_template_reply', this.onGetConfigTemplateReply); + ipcRenderer.on('get_config_reply', this.onGetConfigReply); + ipcRenderer.on('set_config_values_reply', this.onSetConfigValuesReply); + + ipcRenderer.send('get_config_template', { + Directory: this.props.directory, + StorageType: this.props.storageType, + Version: this.props.version, + }); + } + } + + state = { + ChangedItems: [], + ChangedObjectLookup: null, + ObjectLookup: {}, + OriginalItemList: [], + OriginalObjectLookup: {}, + ItemList: [], + Saving: false, + ShowAdvanced: false, + Template: {} + }; + + checkSaveRequired = () => { + const changedItems = []; + let i = 0; + for (const item of this.state.ItemList) { + if (this.state.OriginalItemList[i++].value !== item.value) { + changedItems.push(item); + } + } + + let changedObjectLookup = null; + for (const key of Object.keys(this.state.ObjectLookup)) { + const changedObjectItems = []; + let j = 0; + for (const item of this.state.ObjectLookup[key]) { + if (this.state.OriginalObjectLookup[key][j++].value !== item.value) { + changedObjectItems.push(item); + } + } + + if (changedObjectItems.length > 0) { + if (changedObjectLookup === null) { + changedObjectLookup = {}; + } + changedObjectLookup[key] = changedObjectItems; + } + } + + if ((changedItems.length > 0) || changedObjectLookup) { + this.setState({ + ChangedItems: changedItems, + ChangedObjectLookup: changedObjectLookup, + }); + } else { + this.props.closed(); + } + }; + + componentWillUnmount = () => { + if (ipcRenderer) { + ipcRenderer.removeListener('get_config_reply', this.onGetConfigReply); + ipcRenderer.removeListener('get_config_template_reply', this.onGetConfigTemplateReply); + ipcRenderer.removeListener('set_config_values', this.onSetConfigValuesReply); + } + }; + + createItemList = (config, template) => { + const objectList = []; + const itemList = Object + .keys(config) + .map(key => { + return { + advanced: template[key] ? template[key].advanced : false, + label: key, + value: config[key], + }; + }) + .filter(i=> { + let ret = template[i.label]; + if (ret && (template[i.label].type === 'object')) { + objectList.push(i); + ret = false; + } + return ret; + }); + + return { + ObjectList: objectList, + ItemList: itemList, + } + }; + + handleItemChanged = (target, idx) => { + const itemList = [ + ...this.state.ItemList + ]; + itemList[idx].value = target.value.toString(); + this.setState({ + ItemList: itemList + }); + }; + + handleObjectItemChanged = (target, name, idx) => { + const itemList = [ + ...this.state.ObjectLookup[name] + ]; + const objectLookup = { + ...this.state.ObjectLookup, + }; + + itemList[idx].value = target.value.toString(); + objectLookup[name] = itemList; + this.setState({ + ObjectLookup: objectLookup, + }); + }; + + onGetConfigReply = (event, arg) => { + if (arg.data.Success) { + const list = this.createItemList(arg.data.Config, this.state.Template); + const itemListCopy = JSON.parse(JSON.stringify(list.ItemList)); + + let objectLookup = {}; + for (const obj of list.ObjectList) { + const list2 = this.createItemList(obj.value, this.state.Template[obj.label].template); + objectLookup[obj.label] = list2.ItemList; + } + const objectLookupCopy = JSON.parse(JSON.stringify(objectLookup)); + + this.setState({ + ItemList: list.ItemList, + ObjectLookup: objectLookup, + OriginalItemList: itemListCopy, + OriginalObjectLookup: objectLookupCopy, + }); + } + }; + + onGetConfigTemplateReply = (event, arg) => { + if (arg.data.Success) { + this.setState({ + Template: arg.data.Template, + }); + ipcRenderer.send('get_config', { + Directory: this.props.directory, + StorageType: this.props.storageType, + Version: this.props.version, + }); + } + }; + + onSetConfigValuesReply = () => { + this.props.closed(); + }; + + saveAndClose = () => { + if (ipcRenderer) { + this.setState({ + Saving: true, + }); + + const changedItems = []; + for (const item of this.state.ChangedItems) { + changedItems.push({ + Name: item.label, + Value: item.value, + }); + } + + if (this.state.ChangedObjectLookup) { + for (const key of Object.keys(this.state.ChangedObjectLookup)) { + for (const item of this.state.ChangedObjectLookup[key]) { + changedItems.push({ + Name: key + '.' + item.label, + Value: item.value, + }); + } + } + } + + ipcRenderer.send('set_config_values', { + Directory: this.props.directory, + Items: changedItems, + StorageType: this.props.storageType, + Version: this.props.version, + }); + } + }; + + render() { + let confirmSave = null; + if ((this.state.ChangedItems.length > 0) || this.state.ChangedObjectLookup) { + confirmSave = ( + + +

Save Changes?

+ + + + + +
+
+
+ ); + } + + let configurationItems = this.state.ItemList + .map((k, i) => { + return ( + ((this.state.ShowAdvanced && k.advanced) || !k.advanced) ? + this.handleItemChanged(e, i)} + items={this.state.Template[k.label].items} + key={i} + label={k.label} + template={this.state.Template[k.label]} + value={k.value}/> : + null) + }); + + let objectItems = []; + for (const key of Object.keys(this.state.ObjectLookup)) { + objectItems.push(( +
+

{key}

+
+ { + this.state.ObjectLookup[key].map((k, i) => { + return ( + ((this.state.ShowAdvanced && k.advanced) || !k.advanced) ? + this.handleObjectItemChanged(e, key, i)} + items={this.state.Template[key].template[k.label].items} + key={i} + label={k.label} + template={this.state.Template[key].template[k.label]} + value={k.value}/> : + null) + }) + } +
+
+ )); + } + + return ( +
+ {confirmSave} + +
+ X +
+

{this.props.storageType + ' Configuration'}

+
+ {objectItems} +

Settings

+ {configurationItems} +
+
+
+ ); + } +} + +export default CSSModules(Configuration, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/containers/MountItems/MountItems.js b/src/containers/MountItems/MountItems.js index d0ce06d..a3268a9 100644 --- a/src/containers/MountItems/MountItems.js +++ b/src/containers/MountItems/MountItems.js @@ -13,66 +13,9 @@ class MountItems extends Component { constructor(props) { super(props); if (ipcRenderer) { - ipcRenderer.on('detect_mounts_reply', (event, arg) => { - if (arg.data.Success) { - const sia = { - ...this.state.Sia, - AllowMount: true, - DriveLetters: (arg.data.DriveLetters.Sia), - Mounted: (arg.data.Locations.Sia.length > 0), - PID: arg.data.PIDS.Sia, - }; - const hs = { - ...this.state.Hyperspace, - AllowMount: true, - DriveLetters: (arg.data.DriveLetters.Hyperspace), - Mounted: (arg.data.Locations.Hyperspace.length > 0), - PID: arg.data.PIDS.Hyperspace, - }; - - this.setState({ - Hyperspace: hs, - Sia: sia, - }); - - this.props.mountsBusy(hs.Mounted || sia.Mounted); - - let hsLocation = arg.data.Locations.Hyperspace; - if ((hsLocation.length === 0) && (this.props.platform === 'win32')) { - hsLocation = this.props.hyperspace.MountLocation || arg.data.DriveLetters.Hyperspace[0]; - } - if (hsLocation !== this.props.hyperspace.MountLocation) { - this.props.changed('Hyperspace', hsLocation); - } - - let siaLocation = arg.data.Locations.Sia; - if ((siaLocation.length === 0) && (this.props.platform === 'win32')) { - siaLocation = this.props.sia.MountLocation || arg.data.DriveLetters.Sia[0]; - } - if (siaLocation !== this.props.sia.MountLocation) { - this.props.changed('Sia', siaLocation); - } - - this.performAutoMount(); - } - }); - - ipcRenderer.on('mount_drive_reply', (event, arg) => { - const state = { - ...this.state[arg.data.StorageType], - PID: arg.data.PID, - Mounted: arg.data.Success, - }; - this.setState({ - [arg.data.StorageType]: state, - }); - - this.detectMounts(); - }); - - ipcRenderer.on('unmount_drive_reply', (event, arg) => { - this.detectMounts(); - }); + ipcRenderer.on('detect_mounts_reply', this.onDetectMountsReply); + ipcRenderer.on('mount_drive_reply', this.onMountDriveReply); + ipcRenderer.on('unmount_drive_reply', this.onUnmountDriveReply); this.detectMounts(); } @@ -93,6 +36,14 @@ class MountItems extends Component { }, }; + componentWillUnmount = () => { + if (ipcRenderer) { + ipcRenderer.removeListener('detect_mounts_reply', this.onDetectMountsReply); + ipcRenderer.removeListener('mount_drive_reply', this.onMountDriveReply); + ipcRenderer.removeListener('unmount_drive_reply', this.onUnmountDriveReply); + } + }; + detectMounts = ()=> { this.props.mountsBusy(true); ipcRenderer.send('detect_mounts', { @@ -141,6 +92,67 @@ class MountItems extends Component { } }; + onDetectMountsReply = (event, arg) => { + if (arg.data.Success) { + const sia = { + ...this.state.Sia, + AllowMount: true, + DriveLetters: (arg.data.DriveLetters.Sia), + Mounted: (arg.data.Locations.Sia.length > 0), + PID: arg.data.PIDS.Sia, + }; + const hs = { + ...this.state.Hyperspace, + AllowMount: true, + DriveLetters: (arg.data.DriveLetters.Hyperspace), + Mounted: (arg.data.Locations.Hyperspace.length > 0), + PID: arg.data.PIDS.Hyperspace, + }; + + this.setState({ + Hyperspace: hs, + Sia: sia, + }); + + this.props.mountsBusy(hs.Mounted || sia.Mounted); + + let hsLocation = arg.data.Locations.Hyperspace; + if ((hsLocation.length === 0) && (this.props.platform === 'win32')) { + hsLocation = this.props.hyperspace.MountLocation || arg.data.DriveLetters.Hyperspace[0]; + } + if (hsLocation !== this.props.hyperspace.MountLocation) { + this.props.changed('Hyperspace', hsLocation); + } + + let siaLocation = arg.data.Locations.Sia; + if ((siaLocation.length === 0) && (this.props.platform === 'win32')) { + siaLocation = this.props.sia.MountLocation || arg.data.DriveLetters.Sia[0]; + } + if (siaLocation !== this.props.sia.MountLocation) { + this.props.changed('Sia', siaLocation); + } + + this.performAutoMount(); + } + }; + + onMountDriveReply = (event, arg) => { + const state = { + ...this.state[arg.data.StorageType], + PID: arg.data.PID, + Mounted: arg.data.Success, + }; + this.setState({ + [arg.data.StorageType]: state, + }); + + this.detectMounts(); + }; + + onUnmountDriveReply = (event, arg) => { + this.detectMounts(); + }; + performAutoMount = ()=> { if (this.props.processAutoMount) { this.props.autoMountProcessed(); @@ -160,28 +172,32 @@ class MountItems extends Component { render() { return (
- this.props.autoMountChanged('Hyperspace', e)} - mounted={this.state.Hyperspace.Mounted} - items={this.state.Hyperspace.DriveLetters} - platform={this.props.platform} - title={'Hyperspace'} - location={this.props.hyperspace.MountLocation} changed={(e) => this.handleMountLocationChanged('Hyperspace', e.target.value)} clicked={this.handleMountUnMount} - pid={this.state.Hyperspace.PID}/> - this.props.configClicked('Hyperspace')} + items={this.state.Hyperspace.DriveLetters} + location={this.props.hyperspace.MountLocation} + mounted={this.state.Hyperspace.Mounted} + pid={this.state.Hyperspace.PID} + platform={this.props.platform} + title={'Hyperspace'}/> + this.props.autoMountChanged('Sia', e)} - mounted={this.state.Sia.Mounted} - items={this.state.Sia.DriveLetters} - platform={this.props.platform} - title={'Sia'} - location={this.props.sia.MountLocation} changed={(e) => this.handleMountLocationChanged('Sia', e.target.value)} clicked={this.handleMountUnMount} - pid={this.state.Sia.PID}/> + configClicked={()=>this.props.configClicked('Sia')} + items={this.state.Sia.DriveLetters} + location={this.props.sia.MountLocation} + mounted={this.state.Sia.Mounted} + pid={this.state.Sia.PID} + platform={this.props.platform} + title={'Sia'}/>
); } } diff --git a/src/index.css b/src/index.css index fe9fcd3..a2b349f 100644 --- a/src/index.css +++ b/src/index.css @@ -6,18 +6,18 @@ --control_border: 1px solid rgba(70, 70, 70, 0.9); --control_box_shadow: 1px 1px 1px black; --control_transparent_background: rgba(60, 60, 70, 0.4); - --control_dark_transparent_background: rgba(60, 60, 70, 0.4); + --control_dark_transparent_background: rgba(15, 15, 15, 0.8); - --text_color: rgba(200, 205, 220, 0.7); - --text_color_hover: rgba(200, 205, 220, 0.7); - --heading_text_color: rgba(194, 217, 255, 0.6); - --heading_other_text_color: rgba(200, 205, 220, 0.7); + --text_color: rgba(200, 205, 220, 0.75); + --text_color_hover: rgba(200, 205, 220, 0.75); + --heading_text_color: rgba(140, 169, 203, 0.75); + --heading_other_text_color: rgba(200, 205, 220, 0.75); --text_color_transition: color 0.3s; } * { font-family: 'Nunito', sans-serif; - font-size: 15px; + font-size: 14px; } *::-moz-focus-inner { From cf6b5b68d7774df1a02bc33fc1a57fd9cdec2bab Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sun, 30 Sep 2018 11:03:23 -0500 Subject: [PATCH 08/27] Fix configuration check --- src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 2635a6f..1826b04 100644 --- a/src/App.js +++ b/src/App.js @@ -465,7 +465,7 @@ class App extends Component { const allowMount = this.state.RepertoryVersion !== 'none'; const missingDependencies = (this.state.MissingDependencies.length > 0); const allowConfig = this.state.LocationsLookup[selectedVersion] && - !this.state.LocationsLookup[selectedVersion].config_allowed; + this.state.LocationsLookup[selectedVersion].config_allowed; const showDependencies = missingDependencies && !this.state.DownloadActive; From f2a7d1c1883d67c8e423d334ac7885354dda7221 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Mon, 1 Oct 2018 11:19:50 -0500 Subject: [PATCH 09/27] [Fix new release detection] [IPC names to constants] [Refactoring] --- src/App.js | 403 ++++++++++-------- src/constants.js | 52 ++- src/containers/Configuration/Configuration.js | 19 +- src/containers/MountItems/MountItems.js | 22 +- 4 files changed, 295 insertions(+), 201 deletions(-) diff --git a/src/App.js b/src/App.js index 1826b04..61bf48a 100644 --- a/src/App.js +++ b/src/App.js @@ -27,181 +27,18 @@ class App extends Component { super(props); if (ipcRenderer) { - ipcRenderer.on('get_platform_reply', (event, arg) => { - this.setState({ - Platform: arg.data, - }); - ipcRenderer.send('get_state', Constants.DATA_LOCATIONS[arg.data]); - }); + ipcRenderer.on(Constants.IPC_Check_Installed_Reply, this.onCheckInstalledReply); + ipcRenderer.on(Constants.IPC_Download_File_Complete, this.onDownloadFileComplete); + ipcRenderer.on(Constants.IPC_Download_File_Progress, this.onDownloadFileProgress); + ipcRenderer.on(Constants.IPC_Extract_Release_Complete, this.onExtractReleaseComplete); + ipcRenderer.on(Constants.IPC_Get_Platform_Reply, this.onGetPlatformReply); + ipcRenderer.on(Constants.IPC_Get_State_Reply, this.onGetStateReply); + ipcRenderer.on(Constants.IPC_Grab_Releases_Reply, this.onGrabReleasesReply); + ipcRenderer.on(Constants.IPC_Grab_UI_Releases_Reply, this.onGrabUiReleasesReply); + ipcRenderer.on(Constants.IPC_Install_Dependency_Reply, this.onInstallDependencyReply); + ipcRenderer.on(Constants.IPC_Install_Upgrade_Reply, this.onInstallUpgradeReply); - ipcRenderer.on('get_state_reply', (event, arg) => { - if (arg.data) { - if (arg.data.Hyperspace.AutoMount === undefined) { - arg.data.Hyperspace['AutoMount'] = false; - } - if (arg.data.Sia.AutoMount === undefined) { - arg.data.Sia['AutoMount'] = false; - } - this.setState({ - Hyperspace: arg.data.Hyperspace, - Release: arg.data.Release, - Sia: arg.data.Sia, - Version: arg.data.Version, - }); - } - this.grabReleases(); - }); - - ipcRenderer.on('grab_releases_reply', ()=> { - axios.get(Constants.RELEASES_URL) - .then(response => { - const versionLookup = { - Alpha: response.data.Versions.Alpha[this.state.Platform], - Beta: response.data.Versions.Beta[this.state.Platform], - RC: response.data.Versions.RC[this.state.Platform], - Release: response.data.Versions.Release[this.state.Platform], - }; - const locationsLookup = { - ...response.data.Locations[this.state.Platform], - }; - - const latestVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; - let version = this.state.Version; - if (version === -1) { - version = latestVersion; - } - - this.setState({ - AllowOptions: true, - LocationsLookup: locationsLookup, - Version: version, - VersionAvailable: version !== latestVersion, - VersionLookup: versionLookup, - }); - this.checkVersionInstalled(this.state.Release, version, versionLookup); - }).catch(error => { - console.log(error); - }); - }); - - ipcRenderer.on('grab_ui_releases_reply', ()=> { - axios.get(Constants.UI_RELEASES_URL) - .then(response => { - const data = response.data; - if (data.Versions && - data.Versions[this.state.Platform] && - (data.Versions[this.state.Platform].length > 0) && - (data.Versions[this.state.Platform][0] !== this.props.version)) { - this.setState({ - UpgradeAvailable: true, - UpgradeDismissed: false, - UpgradeData: data.Locations[this.state.Platform][data.Versions[this.state.Platform][0]], - }); - } - }).catch(error => { - console.log(error); - }); - }); - - ipcRenderer.on('download_file_progress', (event, arg) => { - this.setState({ - DownloadProgress: arg.data.Progress, - }); - }); - - ipcRenderer.on('download_file_complete', (event, arg) => { - if (this.state.DownloadingRelease) { - if (arg.data.Success) { - const selectedVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]][this.state.Version]; - ipcRenderer.send('extract_release', { - Directory: Constants.DATA_LOCATIONS[this.state.Platform], - Source: arg.data.Destination, - Version: selectedVersion, - }); - } - - this.setState({ - DownloadActive: false, - DownloadProgress: 0.0, - DownloadingRelease: false, - ExtractActive: arg.data.Success, - DownloadName: '', - }); - } else if (this.state.DownloadingDependency) { - if (arg.data.Success) { - ipcRenderer.send('install_dependency', { - Source: arg.data.Destination, - }); - } - - this.setState({ - DownloadActive: false, - DownloadProgress: 0.0, - DownloadingDependency: arg.data.Success, - DownloadName: '', - }); - } else if (this.state.DownloadingUpgrade) { - if (arg.data.Success) { - ipcRenderer.send('install_upgrade', { - Source: arg.data.Destination, - }); - } else { - this.setState({ - DownloadActive: false, - DownloadProgress: 0.0, - DownloadingUpgrade: false, - DownloadName: '', - }); - } - } else { - this.setState({ - DownloadActive: false, - DownloadProgress: 0.0, - DownloadName: '', - }); - } - }); - - ipcRenderer.on('extract_release_complete', (event, arg) => { - ipcRenderer.send('delete_file', { - FilePath: arg.data.Source, - }); - - this.setState({ - ExtractActive: false, - }); - this.checkVersionInstalled(this.state.Release, this.state.Version); - }); - - ipcRenderer.on('check_installed_reply', (event, arg) => { - this.setState({ - AllowDownload: true, - DownloadingDependency: false, - MissingDependencies: arg.data.Dependencies, - RepertoryVersion: arg.data.Success && arg.data.Exists ? arg.data.Version : 'none', - }); - }); - - ipcRenderer.on('install_dependency_reply', (event, arg) => { - ipcRenderer.send('delete_file', { - FilePath: arg.data.Source, - }); - this.checkVersionInstalled(this.state.Release, this.state.Version); - }); - - ipcRenderer.on('install_upgrade_reply', (event, arg) => { - ipcRenderer.sendSync('delete_file', { - FilePath: arg.data.Source, - }); - - this.setState({ - DownloadActive: false, - DownloadProgress: 0.0, - DownloadName: '', - }); - }); - - ipcRenderer.send('get_platform'); + ipcRenderer.send(Constants.IPC_Get_Platform); Scheduler.scheduleJob('23 11 * * *', this.updateCheckScheduledJob); } } @@ -275,7 +112,7 @@ class App extends Component { dependencies = this.state.LocationsLookup[selectedVersion].dependencies; } - ipcRenderer.send('check_installed', { + ipcRenderer.send(Constants.IPC_Check_Installed, { Dependencies: dependencies, Directory: Constants.DATA_LOCATIONS[this.state.Platform], Version: selectedVersion, @@ -283,11 +120,26 @@ class App extends Component { } }; + componentWillUnmount = () => { + if (ipcRenderer) { + ipcRenderer.removeListener(Constants.IPC_Check_Installed_Reply, this.onCheckInstalledReply); + ipcRenderer.removeListener(Constants.IPC_Download_File_Complete, this.onDownloadFileComplete); + ipcRenderer.removeListener(Constants.IPC_Download_File_Progress, this.onDownloadFileProgress); + ipcRenderer.removeListener(Constants.IPC_Extract_Release_Complete, this.onExtractReleaseComplete); + ipcRenderer.removeListener(Constants.IPC_Get_Platform_Reply, this.onGetPlatformReply); + ipcRenderer.removeListener(Constants.IPC_Get_State_Reply, this.onGetStateReply); + ipcRenderer.removeListener(Constants.IPC_Grab_Releases_Reply, this.onGrabReleasesReply); + ipcRenderer.removeListener(Constants.IPC_Grab_UI_Releases_Reply, this.onGrabUiReleasesReply); + ipcRenderer.removeListener(Constants.IPC_Install_Dependency_Reply, this.onInstallDependencyReply); + ipcRenderer.removeListener(Constants.IPC_Install_Upgrade_Reply, this.onInstallUpgradeReply); + } + }; + grabReleases = () => { if (this.state.Platform !== 'unknown') { if (ipcRenderer) { - ipcRenderer.send('grab_releases'); - ipcRenderer.send('grab_ui_releases'); + ipcRenderer.send(Constants.IPC_Grab_Releases); + ipcRenderer.send(Constants.IPC_Grab_UI_Releases); } } }; @@ -339,7 +191,7 @@ class App extends Component { DownloadName: fileName, }); - ipcRenderer.send('download_file', { + ipcRenderer.send(Constants.IPC_Download_File, { Directory: Constants.DATA_LOCATIONS[this.state.Platform], Filename: fileName, URL: url, @@ -386,7 +238,7 @@ class App extends Component { DownloadName: fileName, }); - ipcRenderer.send('download_file', { + ipcRenderer.send(Constants.IPC_Download_File, { Directory: Constants.DATA_LOCATIONS[this.state.Platform], Filename: fileName, URL: this.state.LocationsLookup[selectedVersion].urls[0], @@ -402,7 +254,7 @@ class App extends Component { DownloadName: 'UI Upgrade', }); - ipcRenderer.send('download_file', { + ipcRenderer.send(Constants.IPC_Download_File, { Directory: Constants.DATA_LOCATIONS[this.state.Platform], Filename: this.state.Platform === 'win32' ? 'upgrade.exe' : 'upgrade', URL: this.state.UpgradeData.urls[0], @@ -429,9 +281,196 @@ class App extends Component { this.setState({MountsBusy: busy}) }; + onCheckInstalledReply = (event, arg) => { + const repertoryVersion = arg.data.Success && arg.data.Exists ? arg.data.Version : 'none'; + let versionAvailable = false; + + if (repertoryVersion !== 'none') { + const latestVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; + let version = this.state.Version; + if (version === -1) { + version = latestVersion; + } + versionAvailable = version !== latestVersion; + } + + this.setState({ + AllowDownload: true, + DownloadingDependency: false, + MissingDependencies: arg.data.Dependencies, + RepertoryVersion: repertoryVersion, + VersionAvailable: versionAvailable, + }); + }; + + onDownloadFileComplete = (event, arg) => { + if (this.state.DownloadingRelease) { + if (arg.data.Success) { + const selectedVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]][this.state.Version]; + ipcRenderer.send(Constants.IPC_Extract_Release, { + Directory: Constants.DATA_LOCATIONS[this.state.Platform], + Source: arg.data.Destination, + Version: selectedVersion, + }); + } + + this.setState({ + DownloadActive: false, + DownloadProgress: 0.0, + DownloadingRelease: false, + ExtractActive: arg.data.Success, + DownloadName: '', + }); + } else if (this.state.DownloadingDependency) { + if (arg.data.Success) { + ipcRenderer.send(Constants.IPC_Install_Dependency, { + Source: arg.data.Destination, + }); + } + + this.setState({ + DownloadActive: false, + DownloadProgress: 0.0, + DownloadingDependency: arg.data.Success, + DownloadName: '', + }); + } else if (this.state.DownloadingUpgrade) { + if (arg.data.Success) { + ipcRenderer.send(Constants.IPC_Install_Upgrade, { + Source: arg.data.Destination, + }); + } else { + this.setState({ + DownloadActive: false, + DownloadProgress: 0.0, + DownloadingUpgrade: false, + DownloadName: '', + }); + } + } else { + this.setState({ + DownloadActive: false, + DownloadProgress: 0.0, + DownloadName: '', + }); + } + }; + + onDownloadFileProgress = (event, arg) => { + this.setState({ + DownloadProgress: arg.data.Progress, + }); + }; + + onExtractReleaseComplete = (event, arg) => { + ipcRenderer.send(Constants.IPC_Delete_File, { + FilePath: arg.data.Source, + }); + + this.setState({ + ExtractActive: false, + }); + this.checkVersionInstalled(this.state.Release, this.state.Version); + }; + + onGetPlatformReply = (event, arg) => { + this.setState({ + Platform: arg.data, + }); + ipcRenderer.send(Constants.IPC_Get_State, Constants.DATA_LOCATIONS[arg.data]); + }; + + onGetStateReply = (event, arg) => { + if (arg.data) { + if (arg.data.Hyperspace.AutoMount === undefined) { + arg.data.Hyperspace['AutoMount'] = false; + } + if (arg.data.Sia.AutoMount === undefined) { + arg.data.Sia['AutoMount'] = false; + } + this.setState({ + Hyperspace: arg.data.Hyperspace, + Release: arg.data.Release, + Sia: arg.data.Sia, + Version: arg.data.Version, + }); + } + this.grabReleases(); + }; + + onGrabReleasesReply = ()=> { + axios.get(Constants.RELEASES_URL) + .then(response => { + const versionLookup = { + Alpha: response.data.Versions.Alpha[this.state.Platform], + Beta: response.data.Versions.Beta[this.state.Platform], + RC: response.data.Versions.RC[this.state.Platform], + Release: response.data.Versions.Release[this.state.Platform], + }; + const locationsLookup = { + ...response.data.Locations[this.state.Platform], + }; + + const latestVersion = versionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; + let version = this.state.Version; + if (version === -1) { + version = latestVersion; + } + + this.setState({ + AllowOptions: true, + LocationsLookup: locationsLookup, + Version: version, + VersionAvailable: version !== latestVersion, + VersionLookup: versionLookup, + }); + this.checkVersionInstalled(this.state.Release, version, versionLookup); + }).catch(error => { + console.log(error); + }); + }; + + onGrabUiReleasesReply = ()=> { + axios.get(Constants.UI_RELEASES_URL) + .then(response => { + const data = response.data; + if (data.Versions && + data.Versions[this.state.Platform] && + (data.Versions[this.state.Platform].length > 0) && + (data.Versions[this.state.Platform][0] !== this.props.version)) { + this.setState({ + UpgradeAvailable: true, + UpgradeDismissed: false, + UpgradeData: data.Locations[this.state.Platform][data.Versions[this.state.Platform][0]], + }); + } + }).catch(error => { + console.log(error); + }); + }; + + onInstallDependencyReply = (event, arg) => { + ipcRenderer.send(Constants.IPC_Delete_File, { + FilePath: arg.data.Source, + }); + this.checkVersionInstalled(this.state.Release, this.state.Version); + }; + + onInstallUpgradeReply = (event, arg) => { + ipcRenderer.sendSync(Constants.IPC_Delete_File, { + FilePath: arg.data.Source, + }); + + this.setState({ + DownloadActive: false, + DownloadProgress: 0.0, + DownloadName: '', + }); + }; + saveState = (release, version, sia, hyperspace)=> { if (ipcRenderer) { - ipcRenderer.send('save_state', { + ipcRenderer.send(Constants.IPC_Save_State, { Directory: Constants.DATA_LOCATIONS[this.state.Platform], State: { Hyperspace: hyperspace, @@ -446,7 +485,7 @@ class App extends Component { updateCheckScheduledJob = () => { if (this.state.Platform !== 'unknown') { if (ipcRenderer) { - ipcRenderer.send('grab_ui_releases'); + ipcRenderer.send(Constants.IPC_Grab_UI_Releases); } } }; diff --git a/src/constants.js b/src/constants.js index 741afc9..1d53bd8 100644 --- a/src/constants.js +++ b/src/constants.js @@ -4,4 +4,54 @@ export const DATA_LOCATIONS = { darwin: '~/Library/Application Support/repertory/ui', win32: '%LOCALAPPDATA%\\repertory\\ui', }; -export const UI_RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory-ui/raw/master/releases.json'; \ No newline at end of file +export const UI_RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory-ui/raw/master/releases.json'; + +export const IPC_Check_Installed = 'check_installed'; +export const IPC_Check_Installed_Reply = 'check_installed_reply'; + +export const IPC_Delete_File = 'delete_file'; + +export const IPC_Detect_Mounts = 'detect_mounts'; +export const IPC_Detect_Mounts_Reply = 'detect_mounts_reply'; + +export const IPC_Download_File = 'download_file'; +export const IPC_Download_File_Complete = 'download_file_complete'; +export const IPC_Download_File_Progress = 'download_file_progress'; + +export const IPC_Extract_Release = 'extract_release'; +export const IPC_Extract_Release_Complete = 'extract_release_complete'; + +export const IPC_Get_Config = 'get_config'; +export const IPC_Get_Config_Reply = 'get_config_reply'; + +export const IPC_Get_Config_Template = 'get_config_template'; +export const IPC_Get_Config_Template_Reply = 'get_config_template_reply'; + +export const IPC_Get_Platform = 'get_platform'; +export const IPC_Get_Platform_Reply = 'get_platform_reply'; + +export const IPC_Get_State = 'get_state'; +export const IPC_Get_State_Reply = 'get_state_reply'; + +export const IPC_Grab_Releases = 'grab_releases'; +export const IPC_Grab_Releases_Reply = 'grab_releases_reply'; + +export const IPC_Grab_UI_Releases = 'grab_ui_releases'; +export const IPC_Grab_UI_Releases_Reply = 'grab_ui_releases_reply'; + +export const IPC_Install_Dependency = 'install_dependency'; +export const IPC_Install_Dependency_Reply = 'install_dependency_reply'; + +export const IPC_Install_Upgrade = 'install_upgrade'; +export const IPC_Install_Upgrade_Reply = 'install_upgrade_reply'; + +export const IPC_Mount_Drive = 'mount_drive'; +export const IPC_Mount_Drive_Reply = 'mount_drive_reply'; + +export const IPC_Save_State = 'save_state'; + +export const IPC_Set_Config_Values = 'set_config_values'; +export const IPC_Set_Config_Values_Reply = 'set_config_values_reply'; + +export const IPC_Unmount_Drive = 'unmount_drive'; +export const IPC_Unmount_Drive_Reply = 'unmount_drive_reply'; \ No newline at end of file diff --git a/src/containers/Configuration/Configuration.js b/src/containers/Configuration/Configuration.js index f94e257..5ce99c5 100644 --- a/src/containers/Configuration/Configuration.js +++ b/src/containers/Configuration/Configuration.js @@ -3,6 +3,7 @@ import styles from './Configuration.css'; import Box from '../../components/UI/Box/Box'; import Button from '../../components/UI/Button/Button'; import ConfigurationItem from '../../components/ConfigurationItem/ConfigurationItem'; +import * as Constants from '../../constants'; import CSSModules from 'react-css-modules'; import Modal from '../../components/UI/Modal/Modal'; @@ -15,11 +16,11 @@ class Configuration extends Component { constructor(props) { super(props); if (ipcRenderer) { - ipcRenderer.on('get_config_template_reply', this.onGetConfigTemplateReply); - ipcRenderer.on('get_config_reply', this.onGetConfigReply); - ipcRenderer.on('set_config_values_reply', this.onSetConfigValuesReply); + ipcRenderer.on(Constants.IPC_Get_Config_Template_Reply, this.onGetConfigTemplateReply); + ipcRenderer.on(Constants.IPC_Get_Config_Reply, this.onGetConfigReply); + ipcRenderer.on(Constants.IPC_Set_Config_Values_Reply, this.onSetConfigValuesReply); - ipcRenderer.send('get_config_template', { + ipcRenderer.send(Constants.IPC_Get_Config_Template, { Directory: this.props.directory, StorageType: this.props.storageType, Version: this.props.version, @@ -78,9 +79,9 @@ class Configuration extends Component { componentWillUnmount = () => { if (ipcRenderer) { - ipcRenderer.removeListener('get_config_reply', this.onGetConfigReply); - ipcRenderer.removeListener('get_config_template_reply', this.onGetConfigTemplateReply); - ipcRenderer.removeListener('set_config_values', this.onSetConfigValuesReply); + ipcRenderer.removeListener(Constants.IPC_Get_Config_Reply, this.onGetConfigReply); + ipcRenderer.removeListener(Constants.IPC_Get_Config_Template_Reply, this.onGetConfigTemplateReply); + ipcRenderer.removeListener(Constants.IPC_Set_Config_Values_Reply, this.onSetConfigValuesReply); } }; @@ -161,7 +162,7 @@ class Configuration extends Component { this.setState({ Template: arg.data.Template, }); - ipcRenderer.send('get_config', { + ipcRenderer.send(Constants.IPC_Get_Config, { Directory: this.props.directory, StorageType: this.props.storageType, Version: this.props.version, @@ -198,7 +199,7 @@ class Configuration extends Component { } } - ipcRenderer.send('set_config_values', { + ipcRenderer.send(Constants.IPC_Set_Config_Values, { Directory: this.props.directory, Items: changedItems, StorageType: this.props.storageType, diff --git a/src/containers/MountItems/MountItems.js b/src/containers/MountItems/MountItems.js index a3268a9..648d56f 100644 --- a/src/containers/MountItems/MountItems.js +++ b/src/containers/MountItems/MountItems.js @@ -1,8 +1,12 @@ import React from 'react'; import {Component} from 'react'; +import * as Constants from '../../constants'; import CSSModules from 'react-css-modules'; import styles from './MountItems.css'; import MountItem from '../../components/MountItem/MountItem'; +import {IPC_Detect_Mounts} from "../../constants"; +import {IPC_Mount_Drive} from "../../constants"; +import {IPC_Unmount_Drive} from "../../constants"; let ipcRenderer = null; if (!process.versions.hasOwnProperty('electron')) { @@ -13,9 +17,9 @@ class MountItems extends Component { constructor(props) { super(props); if (ipcRenderer) { - ipcRenderer.on('detect_mounts_reply', this.onDetectMountsReply); - ipcRenderer.on('mount_drive_reply', this.onMountDriveReply); - ipcRenderer.on('unmount_drive_reply', this.onUnmountDriveReply); + ipcRenderer.on(Constants.IPC_Detect_Mounts_Reply, this.onDetectMountsReply); + ipcRenderer.on(Constants.IPC_Mount_Drive_Reply, this.onMountDriveReply); + ipcRenderer.on(Constants.IPC_Unmount_Drive_Reply, this.onUnmountDriveReply); this.detectMounts(); } @@ -38,15 +42,15 @@ class MountItems extends Component { componentWillUnmount = () => { if (ipcRenderer) { - ipcRenderer.removeListener('detect_mounts_reply', this.onDetectMountsReply); - ipcRenderer.removeListener('mount_drive_reply', this.onMountDriveReply); - ipcRenderer.removeListener('unmount_drive_reply', this.onUnmountDriveReply); + ipcRenderer.removeListener(Constants.IPC_Detect_Mounts_Reply, this.onDetectMountsReply); + ipcRenderer.removeListener(Constants.IPC_Mount_Drive_Reply, this.onMountDriveReply); + ipcRenderer.removeListener(Constants.IPC_Unmount_Drive_Reply, this.onUnmountDriveReply); } }; detectMounts = ()=> { this.props.mountsBusy(true); - ipcRenderer.send('detect_mounts', { + ipcRenderer.send(IPC_Detect_Mounts, { Directory: this.props.directory, Version: this.props.version, }); @@ -74,14 +78,14 @@ class MountItems extends Component { this.props.mountsBusy(true); if (mount) { - ipcRenderer.send('mount_drive', { + ipcRenderer.send(IPC_Mount_Drive, { Directory: this.props.directory, Location: location, StorageType: storageType, Version: this.props.version, }); } else { - ipcRenderer.send('unmount_drive', { + ipcRenderer.send(IPC_Unmount_Drive, { Directory: this.props.directory, Location: location, PID: pid, From 85d8dc8c01e18976e069761e9d6b38c0f2715ad4 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 2 Oct 2018 16:13:45 -0500 Subject: [PATCH 10/27] [Added tooltips] [IPC constants] --- .gitignore | 1 + electron.js | 94 ++++++++++--------- package.json | 4 +- src/App.js | 52 +++++++--- src/components/MountItem/MountItem.css | 2 + src/components/UI/Box/Box.js | 3 +- src/components/UpgradeIcon/UpgradeIcon.css | 19 +++- src/components/UpgradeIcon/UpgradeIcon.js | 32 +++++-- src/constants.js | 77 +++++++-------- src/containers/Configuration/Configuration.js | 3 +- src/containers/MountItems/MountItems.css | 3 +- src/containers/MountItems/MountItems.js | 12 +-- 12 files changed, 187 insertions(+), 115 deletions(-) diff --git a/.gitignore b/.gitignore index 7106de7..f2b4e6d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ node_modules/ build/ chrome_data/ dist/ +/.cache diff --git a/electron.js b/electron.js index c943087..a5cfec8 100644 --- a/electron.js +++ b/electron.js @@ -2,7 +2,7 @@ const {app, BrowserWindow, Tray, nativeImage, Menu} = require('electron'); const {ipcMain} = require('electron'); - +const Constants = require('./src/constants'); const path = require('path'); const url = require('url'); require('electron-debug')(); @@ -76,6 +76,14 @@ function createWindow() { autoLauncher.disable(); } } + }, + { + type: 'separator' + }, + { + label: 'Exit', click(item) { + app.quit(); + } } ]); @@ -130,7 +138,7 @@ if (!instanceLock) { }); } -ipcMain.on('check_installed', (event, data) => { +ipcMain.on(Constants.IPC_Check_Installed, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); const destination = path.join(dataDirectory, data.Version); helpers @@ -141,7 +149,7 @@ ipcMain.on('check_installed', (event, data) => { exists = fs.existsSync(destination) && fs.lstatSync(destination).isDirectory(); } catch (e) { } - event.sender.send('check_installed_reply', { + event.sender.send(Constants.IPC_Check_Installed_Reply, { data: { Dependencies: dependencies, Exists: exists, @@ -150,7 +158,7 @@ ipcMain.on('check_installed', (event, data) => { } }); }).catch((e) => { - event.sender.send('check_installed_reply', { + event.sender.send(Constants.IPC_Check_Installed_Reply, { data: { Dependencies: [], Error: e, @@ -161,7 +169,7 @@ ipcMain.on('check_installed', (event, data) => { }); }); -ipcMain.on('delete_file', (event, data) => { +ipcMain.on(Constants.IPC_Delete_File, (event, data) => { try { if (fs.existsSync(data.FilePath)) { fs.unlinkSync(data.FilePath); @@ -170,7 +178,7 @@ ipcMain.on('delete_file', (event, data) => { } }); -ipcMain.on('detect_mounts', (event, data) => { +ipcMain.on(Constants.IPC_Detect_Mounts, (event, data) => { let driveLetters = { Hyperspace: [], Sia: [], @@ -218,7 +226,7 @@ ipcMain.on('detect_mounts', (event, data) => { siaLocation = siaLocation.toUpperCase(); grabDriveLetters(hsLocation, siaLocation); } - event.sender.send('detect_mounts_reply', { + event.sender.send(Constants.IPC_Detect_Mounts_Reply, { data: { DriveLetters: driveLetters, Locations: { @@ -236,7 +244,7 @@ ipcMain.on('detect_mounts', (event, data) => { .catch((err) => { grabDriveLetters('', ''); - event.sender.send('detect_mounts_reply', { + event.sender.send(Constants.IPC_Detect_Mounts_Reply, { data: { DriveLetters: driveLetters, Error: err, @@ -246,11 +254,11 @@ ipcMain.on('detect_mounts', (event, data) => { }); }); -ipcMain.on('download_file', (event, data) => { +ipcMain.on(Constants.IPC_Download_File, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); const destination = path.join(dataDirectory, data.Filename); helpers.downloadFile(data.URL, destination, (progress) => { - event.sender.send('download_file_progress', { + event.sender.send(Constants.IPC_Download_File_Progress, { data: { Destination: destination, Progress: progress, @@ -258,7 +266,7 @@ ipcMain.on('download_file', (event, data) => { } }); }, (success, err) => { - event.sender.send('download_file_complete', { + event.sender.send(Constants.IPC_Download_File_Complete, { data: { Destination: destination, Error: err, @@ -269,7 +277,7 @@ ipcMain.on('download_file', (event, data) => { }); }); -ipcMain.on('extract_release', (event, data) => { +ipcMain.on(Constants.IPC_Extract_Release, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); const destination = path.join(dataDirectory, data.Version); helpers.mkDirByPathSync(destination); @@ -283,7 +291,7 @@ ipcMain.on('extract_release', (event, data) => { } catch (e) { } stream.close(); - event.sender.send('extract_release_complete', { + event.sender.send(Constants.IPC_Extract_Release_Complete, { data: { Error: e, Source: data.Source, @@ -293,7 +301,7 @@ ipcMain.on('extract_release', (event, data) => { }) .on('finish', () => { stream.close(); - event.sender.send('extract_release_complete', { + event.sender.send(Constants.IPC_Extract_Release_Complete, { data: { Source: data.Source, Success: true, @@ -302,20 +310,20 @@ ipcMain.on('extract_release', (event, data) => { }); }); -ipcMain.on('get_config', (event, data) => { +ipcMain.on(Constants.IPC_Get_Config, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); helpers .getConfig(dataDirectory, data.Version, data.StorageType) .then((data) => { if (data.Code === 0) { - event.sender.send('get_config_reply', { + event.sender.send(Constants.IPC_Get_Config_Reply, { data: { Success: true, Config: data.Data, } }); } else { - event.sender.send('get_config_reply', { + event.sender.send(Constants.IPC_Get_Config_Reply, { data: { Error: data.Code, Success: false, @@ -324,7 +332,7 @@ ipcMain.on('get_config', (event, data) => { } }) .catch((e)=> { - event.sender.send('get_config_reply', { + event.sender.send(Constants.IPC_Get_Config_Reply, { data: { Error: e, Success: false, @@ -333,12 +341,12 @@ ipcMain.on('get_config', (event, data) => { }); }); -ipcMain.on('get_config_template', (event, data) => { +ipcMain.on(Constants.IPC_Get_Config_Template, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); helpers .getConfigTemplate(dataDirectory, data.Version, data.StorageType) .then((data) => { - event.sender.send('get_config_template_reply', { + event.sender.send(Constants.IPC_Get_Config_Template_Reply, { data: { Success: true, Template: data, @@ -346,7 +354,7 @@ ipcMain.on('get_config_template', (event, data) => { }); }) .catch((e)=> { - event.sender.send('get_config_template_reply', { + event.sender.send(Constants.IPC_Get_Config_Template_Reply, { data: { Error: e, Success: false, @@ -355,40 +363,40 @@ ipcMain.on('get_config_template', (event, data) => { }); }); -ipcMain.on('get_platform', (event) => { - event.sender.send('get_platform_reply', { +ipcMain.on(Constants.IPC_Get_Platform, (event) => { + event.sender.send(Constants.IPC_Get_Platform_Reply, { data: os.platform() }); }); -ipcMain.on('get_state', (event, data) => { +ipcMain.on(Constants.IPC_Get_State, (event, data) => { const dataDirectory = helpers.resolvePath(data); helpers.mkDirByPathSync(dataDirectory); const configFile = path.join(dataDirectory, 'settings.json'); if (fs.existsSync(configFile)) { - event.sender.send('get_state_reply', { + event.sender.send(Constants.IPC_Get_State_Reply, { data: JSON.parse(fs.readFileSync(configFile, 'utf8')), }); } else { - event.sender.send('get_state_reply', { + event.sender.send(Constants.IPC_Get_State_Reply, { data: null, }); } }); -ipcMain.on('grab_releases', (event) => { - event.sender.send('grab_releases_reply'); +ipcMain.on(Constants.IPC_Grab_Releases, (event) => { + event.sender.send(Constants.IPC_Grab_Releases_Reply); }); -ipcMain.on('grab_ui_releases', (event) => { - event.sender.send('grab_ui_releases_reply'); +ipcMain.on(Constants.IPC_Grab_UI_Releases, (event) => { + event.sender.send(Constants.IPC_Grab_UI_Releases_Reply); }); -ipcMain.on('install_dependency', (event, data) => { +ipcMain.on(Constants.IPC_Install_Dependency, (event, data) => { helpers .executeAndWait(data.Source) .then(()=> { - event.sender.send('install_dependency_reply', { + event.sender.send(Constants.IPC_Install_Dependency_Reply, { data: { Source: data.Source, Success: true, @@ -396,7 +404,7 @@ ipcMain.on('install_dependency', (event, data) => { }); }) .catch((e)=> { - event.sender.send('install_dependency_reply', { + event.sender.send(Constants.IPC_Install_Dependency_Reply, { data: { Error: e, Source: data.Source, @@ -406,14 +414,14 @@ ipcMain.on('install_dependency', (event, data) => { }); }); -ipcMain.on('install_upgrade', (event, data) => { +ipcMain.on(Constants.IPC_Install_Upgrade, (event, data) => { helpers .executeAsync(data.Source) .then(()=> { mainWindow.close(); }) .catch((e)=> { - event.sender.send('install_upgrade_reply', { + event.sender.send(Constants.IPC_Install_Upgrade_Reply, { data: { Error: e, Source: data.Source, @@ -423,11 +431,11 @@ ipcMain.on('install_upgrade', (event, data) => { }); }); -ipcMain.on('mount_drive', (event, data) => { +ipcMain.on(Constants.IPC_Mount_Drive, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); const errorHandler = (pid) => { mountedPIDs.splice(mountedPIDs.indexOf(pid), 1); - event.sender.send('unmount_drive_reply', { + event.sender.send(Constants.IPC_Unmount_Drive_Reply, { data: { PID: -1, StorageType: data.StorageType, @@ -442,7 +450,7 @@ ipcMain.on('mount_drive', (event, data) => { if (pid !== -1) { mountedPIDs.push(pid); } - event.sender.send('mount_drive_reply', { + event.sender.send(Constants.IPC_Mount_Drive_Reply, { data: { PID: pid, StorageType: data.StorageType, @@ -455,14 +463,14 @@ ipcMain.on('mount_drive', (event, data) => { }); }); -ipcMain.on('save_state', (event, data) => { +ipcMain.on(Constants.IPC_Save_State, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); helpers.mkDirByPathSync(dataDirectory); const configFile = path.join(dataDirectory, 'settings.json'); fs.writeFileSync(configFile, JSON.stringify(data.State), 'utf8'); }); -ipcMain.on('set_config_values', (event, data) => { +ipcMain.on(Constants.IPC_Set_Config_Values, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); const setConfigValue = (i) => { if (i < data.Items.length) { @@ -475,18 +483,18 @@ ipcMain.on('set_config_values', (event, data) => { setConfigValue(++i); }); } else { - event.sender.send('set_config_values_reply', {}); + event.sender.send(Constants.IPC_Set_Config_Values_Reply, {}); } }; setConfigValue(0); }); -ipcMain.on('unmount_drive', (event, data) => { +ipcMain.on(Constants.IPC_Unmount_Drive, (event, data) => { helpers .stopProcessByPID(data.PID) .then((pid)=> { if (mountedPIDs.indexOf(pid) === -1) { - event.sender.send('unmount_drive_reply'); + event.sender.send(Constants.IPC_Unmount_Drive_Reply); } }) .catch((e) => { diff --git a/package.json b/package.json index f201ce1..85f6bfd 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "react-dev-utils": "^5.0.1", "react-dom": "^16.4.1", "react-loader-spinner": "^2.0.6", + "react-tooltip": "^3.8.4", "resolve": "1.6.0", "style-loader": "0.19.0", "sw-precache-webpack-plugin": "0.11.4", @@ -68,7 +69,7 @@ }, "devDependencies": { "cross-env": "^5.2.0", - "electron": "3.0.0", + "electron": "^3.0.2", "electron-builder": "^20.28.4", "extract-text-webpack-plugin": "^3.0.2", "webpack-browser-plugin": "^1.0.20" @@ -121,6 +122,7 @@ "appId": "repertory-ui", "files": [ "./electron.js", + "./src/constants.js", "build/**/*", "node_modules/**/*", "./helpers.js" diff --git a/src/App.js b/src/App.js index 61bf48a..1085df0 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,4 @@ import React, {Component} from 'react'; -import * as Constants from './constants'; import axios from 'axios'; import styles from './App.css'; import Box from './components/UI/Box/Box'; @@ -15,6 +14,7 @@ import MountItems from './containers/MountItems/MountItems'; import UpgradeIcon from './components/UpgradeIcon/UpgradeIcon'; import UpgradeUI from './components/UpgradeUI/UpgradeUI'; +const Constants = require('./constants'); const Scheduler = require('node-schedule'); let ipcRenderer = null; @@ -399,18 +399,7 @@ class App extends Component { }; onGrabReleasesReply = ()=> { - axios.get(Constants.RELEASES_URL) - .then(response => { - const versionLookup = { - Alpha: response.data.Versions.Alpha[this.state.Platform], - Beta: response.data.Versions.Beta[this.state.Platform], - RC: response.data.Versions.RC[this.state.Platform], - Release: response.data.Versions.Release[this.state.Platform], - }; - const locationsLookup = { - ...response.data.Locations[this.state.Platform], - }; - + const doUpdate = (locationsLookup, versionLookup) => { const latestVersion = versionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; let version = this.state.Version; if (version === -1) { @@ -424,9 +413,40 @@ class App extends Component { VersionAvailable: version !== latestVersion, VersionLookup: versionLookup, }); + this.checkVersionInstalled(this.state.Release, version, versionLookup); + }; + + axios.get(Constants.RELEASES_URL) + .then(response => { + const versionLookup = { + Alpha: response.data.Versions.Alpha[this.state.Platform], + Beta: response.data.Versions.Beta[this.state.Platform], + RC: response.data.Versions.RC[this.state.Platform], + Release: response.data.Versions.Release[this.state.Platform], + }; + const locationsLookup = { + ...response.data.Locations[this.state.Platform], + }; + + window.localStorage.setItem('releases', JSON.stringify({ + LocationsLookup: locationsLookup, + VersionLookup: versionLookup + })); + + doUpdate(locationsLookup, versionLookup); }).catch(error => { console.log(error); + const releases = window.localStorage.getItem('releases'); + if (releases && (releases.length > 0)) { + const obj = JSON.parse(releases); + const locationsLookup = obj.LocationsLookup; + const versionLookup = obj.VersionLookup; + + doUpdate(locationsLookup, versionLookup); + } else { + // TODO Handle error + } }); }; @@ -446,6 +466,10 @@ class App extends Component { } }).catch(error => { console.log(error); + this.setState({ + UpgradeAvailable: false, + UpgradeData: {}, + }); }); }; @@ -648,7 +672,7 @@ class App extends Component { + width='100%'>
{ - const styleList = ['Box']; + const styleList = []; + styleList.push('Box'); if (props.dxDark) { styleList.push('Darker'); } diff --git a/src/components/UpgradeIcon/UpgradeIcon.css b/src/components/UpgradeIcon/UpgradeIcon.css index c70cc50..9b8513a 100644 --- a/src/components/UpgradeIcon/UpgradeIcon.css +++ b/src/components/UpgradeIcon/UpgradeIcon.css @@ -1,4 +1,4 @@ -.UpgradeIcon { +.Owner { display: block; margin-right: 2px; padding: 0; @@ -7,5 +7,20 @@ border: 0; box-sizing: border-box; cursor: pointer; +} + +.Owner p { + margin: 0; + padding: 0; +} + +.UpgradeIcon { + display: block; + margin: 0; + padding: 0; + border: 0; + width: 20px; + height: 20px; + box-sizing: border-box; opacity: 0.65; -} \ No newline at end of file + } \ No newline at end of file diff --git a/src/components/UpgradeIcon/UpgradeIcon.js b/src/components/UpgradeIcon/UpgradeIcon.js index a6ef861..64e8ea8 100644 --- a/src/components/UpgradeIcon/UpgradeIcon.js +++ b/src/components/UpgradeIcon/UpgradeIcon.js @@ -2,18 +2,34 @@ import React from 'react'; import CSSModules from 'react-css-modules'; import styles from './UpgradeIcon.css'; import availableImage from '../../assets/images/release_available.png'; +import ReactTooltip from 'react-tooltip'; export default CSSModules((props) => { let style; + let style2; + let placement = 'left'; + let toolTipText = 'UI Upgrade Available'; if (props.release) { - style = {float: 'right', marginRight: '5%', cursor: 'default'}; + placement='bottom'; + toolTipText = 'New Release Available'; + style = {float: 'right', marginRight: '5%', width: '15px', height: '15px', cursor: 'default'}; + style2 = {width: '15px', height: '15px'}; } - return props.available ? - : - null; + return props + .available ? + ( +
+

+ +

+ {toolTipText} +
+ ) + : null; }, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/constants.js b/src/constants.js index 1d53bd8..4b370d9 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,57 +1,60 @@ -export const RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory/raw/master/releases.json'; -export const DATA_LOCATIONS = { +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory/raw/1.0.0-alpha.2_branch/releases.json'; +exports.DATA_LOCATIONS = { linux: '~/.local/repertory/ui', darwin: '~/Library/Application Support/repertory/ui', - win32: '%LOCALAPPDATA%\\repertory\\ui', + win32: '%LOCALAPPDATA%\\repertory\\ui' }; -export const UI_RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory-ui/raw/master/releases.json'; +exports.UI_RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory-ui/raw/1.0.1_branch/releases.json'; -export const IPC_Check_Installed = 'check_installed'; -export const IPC_Check_Installed_Reply = 'check_installed_reply'; +exports.IPC_Check_Installed = 'check_installed'; +exports.IPC_Check_Installed_Reply = 'check_installed_reply'; -export const IPC_Delete_File = 'delete_file'; +exports.IPC_Delete_File = 'delete_file'; -export const IPC_Detect_Mounts = 'detect_mounts'; -export const IPC_Detect_Mounts_Reply = 'detect_mounts_reply'; +exports.IPC_Detect_Mounts = 'detect_mounts'; +exports.IPC_Detect_Mounts_Reply = 'detect_mounts_reply'; -export const IPC_Download_File = 'download_file'; -export const IPC_Download_File_Complete = 'download_file_complete'; -export const IPC_Download_File_Progress = 'download_file_progress'; +exports.IPC_Download_File = 'download_file'; +exports.IPC_Download_File_Complete = 'download_file_complete'; +exports.IPC_Download_File_Progress = 'download_file_progress'; -export const IPC_Extract_Release = 'extract_release'; -export const IPC_Extract_Release_Complete = 'extract_release_complete'; +exports.IPC_Extract_Release = 'extract_release'; +exports.IPC_Extract_Release_Complete = 'extract_release_complete'; -export const IPC_Get_Config = 'get_config'; -export const IPC_Get_Config_Reply = 'get_config_reply'; +exports.IPC_Get_Config = 'get_config'; +exports.IPC_Get_Config_Reply = 'get_config_reply'; -export const IPC_Get_Config_Template = 'get_config_template'; -export const IPC_Get_Config_Template_Reply = 'get_config_template_reply'; +exports.IPC_Get_Config_Template = 'get_config_template'; +exports.IPC_Get_Config_Template_Reply = 'get_config_template_reply'; -export const IPC_Get_Platform = 'get_platform'; -export const IPC_Get_Platform_Reply = 'get_platform_reply'; +exports.IPC_Get_Platform = 'get_platform'; +exports.IPC_Get_Platform_Reply = 'get_platform_reply'; -export const IPC_Get_State = 'get_state'; -export const IPC_Get_State_Reply = 'get_state_reply'; +exports.IPC_Get_State = 'get_state'; +exports.IPC_Get_State_Reply = 'get_state_reply'; -export const IPC_Grab_Releases = 'grab_releases'; -export const IPC_Grab_Releases_Reply = 'grab_releases_reply'; +exports.IPC_Grab_Releases = 'grab_releases'; +exports.IPC_Grab_Releases_Reply = 'grab_releases_reply'; -export const IPC_Grab_UI_Releases = 'grab_ui_releases'; -export const IPC_Grab_UI_Releases_Reply = 'grab_ui_releases_reply'; +exports.IPC_Grab_UI_Releases = 'grab_ui_releases'; +exports.IPC_Grab_UI_Releases_Reply = 'grab_ui_releases_reply'; -export const IPC_Install_Dependency = 'install_dependency'; -export const IPC_Install_Dependency_Reply = 'install_dependency_reply'; +exports.IPC_Install_Dependency = 'install_dependency'; +exports.IPC_Install_Dependency_Reply = 'install_dependency_reply'; -export const IPC_Install_Upgrade = 'install_upgrade'; -export const IPC_Install_Upgrade_Reply = 'install_upgrade_reply'; +exports.IPC_Install_Upgrade = 'install_upgrade'; +exports.IPC_Install_Upgrade_Reply = 'install_upgrade_reply'; -export const IPC_Mount_Drive = 'mount_drive'; -export const IPC_Mount_Drive_Reply = 'mount_drive_reply'; +exports.IPC_Mount_Drive = 'mount_drive'; +exports.IPC_Mount_Drive_Reply = 'mount_drive_reply'; -export const IPC_Save_State = 'save_state'; +exports.IPC_Save_State = 'save_state'; -export const IPC_Set_Config_Values = 'set_config_values'; -export const IPC_Set_Config_Values_Reply = 'set_config_values_reply'; +exports.IPC_Set_Config_Values = 'set_config_values'; +exports.IPC_Set_Config_Values_Reply = 'set_config_values_reply'; -export const IPC_Unmount_Drive = 'unmount_drive'; -export const IPC_Unmount_Drive_Reply = 'unmount_drive_reply'; \ No newline at end of file +exports.IPC_Unmount_Drive = 'unmount_drive'; +exports.IPC_Unmount_Drive_Reply = 'unmount_drive_reply'; \ No newline at end of file diff --git a/src/containers/Configuration/Configuration.js b/src/containers/Configuration/Configuration.js index 5ce99c5..bf82a7e 100644 --- a/src/containers/Configuration/Configuration.js +++ b/src/containers/Configuration/Configuration.js @@ -3,10 +3,11 @@ import styles from './Configuration.css'; import Box from '../../components/UI/Box/Box'; import Button from '../../components/UI/Button/Button'; import ConfigurationItem from '../../components/ConfigurationItem/ConfigurationItem'; -import * as Constants from '../../constants'; import CSSModules from 'react-css-modules'; import Modal from '../../components/UI/Modal/Modal'; +const Constants = require('../../constants'); + let ipcRenderer = null; if (!process.versions.hasOwnProperty('electron')) { ipcRenderer = ((window && window.require) ? window.require('electron').ipcRenderer : null); diff --git a/src/containers/MountItems/MountItems.css b/src/containers/MountItems/MountItems.css index f6e19ab..2414433 100644 --- a/src/containers/MountItems/MountItems.css +++ b/src/containers/MountItems/MountItems.css @@ -1,4 +1,5 @@ .MountItems { - margin-top: 10px; + padding: 0; + margin: 0; width: 100%; } \ No newline at end of file diff --git a/src/containers/MountItems/MountItems.js b/src/containers/MountItems/MountItems.js index 648d56f..363b1dd 100644 --- a/src/containers/MountItems/MountItems.js +++ b/src/containers/MountItems/MountItems.js @@ -1,12 +1,10 @@ import React from 'react'; import {Component} from 'react'; -import * as Constants from '../../constants'; import CSSModules from 'react-css-modules'; import styles from './MountItems.css'; import MountItem from '../../components/MountItem/MountItem'; -import {IPC_Detect_Mounts} from "../../constants"; -import {IPC_Mount_Drive} from "../../constants"; -import {IPC_Unmount_Drive} from "../../constants"; + +const Constants = require('../../constants'); let ipcRenderer = null; if (!process.versions.hasOwnProperty('electron')) { @@ -50,7 +48,7 @@ class MountItems extends Component { detectMounts = ()=> { this.props.mountsBusy(true); - ipcRenderer.send(IPC_Detect_Mounts, { + ipcRenderer.send(Constants.IPC_Detect_Mounts, { Directory: this.props.directory, Version: this.props.version, }); @@ -78,14 +76,14 @@ class MountItems extends Component { this.props.mountsBusy(true); if (mount) { - ipcRenderer.send(IPC_Mount_Drive, { + ipcRenderer.send(Constants.IPC_Mount_Drive, { Directory: this.props.directory, Location: location, StorageType: storageType, Version: this.props.version, }); } else { - ipcRenderer.send(IPC_Unmount_Drive, { + ipcRenderer.send(Constants.IPC_Unmount_Drive, { Directory: this.props.directory, Location: location, PID: pid, From aedcbdf898b0620ecce0235912214f0e41230f56 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 2 Oct 2018 16:20:14 -0500 Subject: [PATCH 11/27] Fix configuration detection --- src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 1085df0..61651b6 100644 --- a/src/App.js +++ b/src/App.js @@ -528,7 +528,7 @@ class App extends Component { const allowMount = this.state.RepertoryVersion !== 'none'; const missingDependencies = (this.state.MissingDependencies.length > 0); const allowConfig = this.state.LocationsLookup[selectedVersion] && - this.state.LocationsLookup[selectedVersion].config_allowed; + this.state.LocationsLookup[selectedVersion].config_support; const showDependencies = missingDependencies && !this.state.DownloadActive; From 51ca79fd4fac3f9b8f6a0577c2b12ec987147a5b Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 2 Oct 2018 16:45:02 -0500 Subject: [PATCH 12/27] Fix release change crash --- src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 61651b6..277f2cb 100644 --- a/src/App.js +++ b/src/App.js @@ -219,7 +219,7 @@ class App extends Component { handleReleaseChanged = (e) => { const val = parseInt(e.target.value, 10); - const versionIndex = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; + const versionIndex = this.state.VersionLookup[this.state.ReleaseTypes[val]].length - 1; this.setState({ Release: val, Version: versionIndex From 7e82690f5e24ab36cd797b16b5676390d1a51aff Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 2 Oct 2018 18:43:02 -0500 Subject: [PATCH 13/27] [Partial error handling changes] [Standardize IPC replies] --- electron.js | 221 +++++++----------- helpers.js | 6 +- releases.json | 5 + src/App.js | 62 +++-- src/containers/Configuration/Configuration.js | 2 +- 5 files changed, 136 insertions(+), 160 deletions(-) diff --git a/electron.js b/electron.js index a5cfec8..428e275 100644 --- a/electron.js +++ b/electron.js @@ -26,6 +26,7 @@ function createWindow() { width: 425, height: height, resizable: false, + title: 'Repertory UI', webPreferences: { webSecurity: !process.env.ELECTRON_START_URL } @@ -138,6 +139,16 @@ if (!instanceLock) { }); } +const standardIPCReply = (event, channel, data, error) => { + event.sender.send(channel, { + data: { + ...data, + Error: error, + Success: !error, + } + }); +}; + ipcMain.on(Constants.IPC_Check_Installed, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); const destination = path.join(dataDirectory, data.Version); @@ -149,23 +160,16 @@ ipcMain.on(Constants.IPC_Check_Installed, (event, data) => { exists = fs.existsSync(destination) && fs.lstatSync(destination).isDirectory(); } catch (e) { } - event.sender.send(Constants.IPC_Check_Installed_Reply, { - data: { - Dependencies: dependencies, - Exists: exists, - Success: true, - Version: data.Version, - } - }); - }).catch((e) => { - event.sender.send(Constants.IPC_Check_Installed_Reply, { - data: { - Dependencies: [], - Error: e, - Success: false, - Version: data.Version, - } + standardIPCReply(event, Constants.IPC_Check_Installed_Reply, { + Dependencies: dependencies, + Exists: exists, + Version: data.Version, }); + }).catch(error => { + standardIPCReply(event, Constants.IPC_Check_Installed_Reply, { + Dependencies: [], + Version: data.Version, + }, error); }); }); @@ -226,31 +230,23 @@ ipcMain.on(Constants.IPC_Detect_Mounts, (event, data) => { siaLocation = siaLocation.toUpperCase(); grabDriveLetters(hsLocation, siaLocation); } - event.sender.send(Constants.IPC_Detect_Mounts_Reply, { - data: { - DriveLetters: driveLetters, - Locations: { - Hyperspace: hsLocation, - Sia: siaLocation, - }, - Success: true, - PIDS: { - Hyperspace: results.Hyperspace.PID, - Sia: results.Sia.PID, - } + standardIPCReply(event, Constants.IPC_Detect_Mounts_Reply, { + DriveLetters: driveLetters, + Locations: { + Hyperspace: hsLocation, + Sia: siaLocation, + }, + PIDS: { + Hyperspace: results.Hyperspace.PID, + Sia: results.Sia.PID, } }); }) - .catch((err) => { + .catch(error => { grabDriveLetters('', ''); - - event.sender.send(Constants.IPC_Detect_Mounts_Reply, { - data: { - DriveLetters: driveLetters, - Error: err, - Success: false, - } - }); + standardIPCReply(event, Constants.IPC_Detect_Mounts_Reply, { + DriveLetters: driveLetters, + }, error); }); }); @@ -258,22 +254,16 @@ ipcMain.on(Constants.IPC_Download_File, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); const destination = path.join(dataDirectory, data.Filename); helpers.downloadFile(data.URL, destination, (progress) => { - event.sender.send(Constants.IPC_Download_File_Progress, { - data: { - Destination: destination, - Progress: progress, - URL: data.URL, - } - }); - }, (success, err) => { - event.sender.send(Constants.IPC_Download_File_Complete, { - data: { - Destination: destination, - Error: err, - Success: success, - URL: data.URL, - } + standardIPCReply(event, Constants.IPC_Download_File_Progress, { + Destination: destination, + Progress: progress, + URL: data.URL, }); + }, error => { + standardIPCReply(event, Constants.IPC_Download_File_Complete, { + Destination: destination, + URL: data.URL, + }, error); }); }); @@ -285,27 +275,20 @@ ipcMain.on(Constants.IPC_Extract_Release, (event, data) => { const stream = fs.createReadStream(data.Source); stream .pipe(unzip.Extract({ path: destination })) - .on('error', (e) => { + .on('error', error => { try { helpers.removeDirectoryRecursively(destination); } catch (e) { } stream.close(); - event.sender.send(Constants.IPC_Extract_Release_Complete, { - data: { - Error: e, - Source: data.Source, - Success: false, - } - }); + standardIPCReply(event, Constants.IPC_Extract_Release_Complete, { + Source: data.Source, + }, error); }) .on('finish', () => { stream.close(); - event.sender.send(Constants.IPC_Extract_Release_Complete, { - data: { - Source: data.Source, - Success: true, - } + standardIPCReply(event, Constants.IPC_Extract_Release_Complete, { + Source: data.Source, }); }); }); @@ -316,28 +299,15 @@ ipcMain.on(Constants.IPC_Get_Config, (event, data) => { .getConfig(dataDirectory, data.Version, data.StorageType) .then((data) => { if (data.Code === 0) { - event.sender.send(Constants.IPC_Get_Config_Reply, { - data: { - Success: true, - Config: data.Data, - } + standardIPCReply(event, Constants.IPC_Get_Config_Reply, { + Config: data.Data, }); } else { - event.sender.send(Constants.IPC_Get_Config_Reply, { - data: { - Error: data.Code, - Success: false, - } - }); + standardIPCReply(event, Constants.IPC_Get_Config_Reply, {}, data.Code); } }) - .catch((e)=> { - event.sender.send(Constants.IPC_Get_Config_Reply, { - data: { - Error: e, - Success: false, - } - }); + .catch(error => { + standardIPCReply(event, Constants.IPC_Get_Config_Reply, {}, error); }); }); @@ -346,20 +316,12 @@ ipcMain.on(Constants.IPC_Get_Config_Template, (event, data) => { helpers .getConfigTemplate(dataDirectory, data.Version, data.StorageType) .then((data) => { - event.sender.send(Constants.IPC_Get_Config_Template_Reply, { - data: { - Success: true, - Template: data, - } + standardIPCReply(event, Constants.IPC_Get_Config_Template_Reply, { + Template: data, }); }) - .catch((e)=> { - event.sender.send(Constants.IPC_Get_Config_Template_Reply, { - data: { - Error: e, - Success: false, - } - }); + .catch(error => { + standardIPCReply(event, Constants.IPC_Get_Config_Template_Reply, {}, error); }); }); @@ -385,32 +347,25 @@ ipcMain.on(Constants.IPC_Get_State, (event, data) => { }); ipcMain.on(Constants.IPC_Grab_Releases, (event) => { - event.sender.send(Constants.IPC_Grab_Releases_Reply); + standardIPCReply(event, Constants.IPC_Grab_Releases_Reply); }); ipcMain.on(Constants.IPC_Grab_UI_Releases, (event) => { - event.sender.send(Constants.IPC_Grab_UI_Releases_Reply); + standardIPCReply(event, Constants.IPC_Grab_UI_Releases_Reply); }); ipcMain.on(Constants.IPC_Install_Dependency, (event, data) => { helpers .executeAndWait(data.Source) .then(()=> { - event.sender.send(Constants.IPC_Install_Dependency_Reply, { - data: { - Source: data.Source, - Success: true, - } + standardIPCReply(event, Constants.IPC_Install_Dependency_Reply, { + Source: data.Source, }); }) - .catch((e)=> { - event.sender.send(Constants.IPC_Install_Dependency_Reply, { - data: { - Error: e, - Source: data.Source, - Success: false, - } - }); + .catch(error => { + standardIPCReply(event, Constants.IPC_Install_Dependency_Reply, { + Source: data.Source, + }, error); }); }); @@ -420,46 +375,36 @@ ipcMain.on(Constants.IPC_Install_Upgrade, (event, data) => { .then(()=> { mainWindow.close(); }) - .catch((e)=> { - event.sender.send(Constants.IPC_Install_Upgrade_Reply, { - data: { - Error: e, - Source: data.Source, - Success: false, - } - }); + .catch(error => { + standardIPCReply(event, Constants.IPC_Install_Upgrade_Reply, { + Source: data.Source, + }, error); }); }); ipcMain.on(Constants.IPC_Mount_Drive, (event, data) => { const dataDirectory = helpers.resolvePath(data.Directory); - const errorHandler = (pid) => { + const errorHandler = (pid, error) => { mountedPIDs.splice(mountedPIDs.indexOf(pid), 1); - event.sender.send(Constants.IPC_Unmount_Drive_Reply, { - data: { - PID: -1, - StorageType: data.StorageType, - Success: false, - } - }); + standardIPCReply(event, Constants.IPC_Unmount_Drive_Reply, { + PID: -1, + StorageType: data.StorageType, + }, error || Error(data.StorageType + ' Unmounted')); }; - helpers.executeMount(dataDirectory, data.Version, data.StorageType, data.Location, (_, pid)=> { - errorHandler(pid); + helpers.executeMount(dataDirectory, data.Version, data.StorageType, data.Location, (error, pid) => { + errorHandler(pid, error); }) - .then(pid=> { + .then(pid => { if (pid !== -1) { mountedPIDs.push(pid); } - event.sender.send(Constants.IPC_Mount_Drive_Reply, { - data: { - PID: pid, - StorageType: data.StorageType, - Success: true, - } + standardIPCReply(event, Constants.IPC_Mount_Drive_Reply, { + PID: pid, + StorageType: data.StorageType, }); }) - .catch((_, pid) => { - errorHandler(pid); + .catch(error => { + errorHandler(-1, error); }); }); @@ -483,7 +428,7 @@ ipcMain.on(Constants.IPC_Set_Config_Values, (event, data) => { setConfigValue(++i); }); } else { - event.sender.send(Constants.IPC_Set_Config_Values_Reply, {}); + standardIPCReply(event, Constants.IPC_Set_Config_Values_Reply, {}); } }; setConfigValue(0); diff --git a/helpers.js b/helpers.js index 7564a12..c88b27e 100644 --- a/helpers.js +++ b/helpers.js @@ -80,18 +80,18 @@ module.exports.downloadFile = (url, destination, progressCallback, completeCallb response.data.on('end', () => { stream.end(() => { - completeCallback(true); + completeCallback(); }); }); response.data.on('error', (e) => { stream.end(() => { - completeCallback(false, e); + completeCallback(e); }); }); }) .catch((e)=> { - completeCallback(false, e); + completeCallback(e); }); }; diff --git a/releases.json b/releases.json index f1be4a9..e8f7485 100644 --- a/releases.json +++ b/releases.json @@ -1,6 +1,10 @@ { "Locations": { "win32": { + "1.0.1": { + "hash": "", + "urls": [] + }, "1.0.0": { "hash": "", "urls": [ @@ -11,6 +15,7 @@ }, "Versions": { "win32": [ + "1.0.1", "1.0.0" ] } diff --git a/src/App.js b/src/App.js index 277f2cb..e776027 100644 --- a/src/App.js +++ b/src/App.js @@ -48,6 +48,9 @@ class App extends Component { AllowDownload: false, AutoMountChecked: false, ConfigStorageType: null, + DisplayError: false, + Error: null, + ErrorAction: null, DownloadActive: false, DownloadProgress: 0.0, DownloadingDependency: false, @@ -280,27 +283,35 @@ class App extends Component { notifyMountsBusy = (busy) => { this.setState({MountsBusy: busy}) }; - + onCheckInstalledReply = (event, arg) => { - const repertoryVersion = arg.data.Success && arg.data.Exists ? arg.data.Version : 'none'; - let versionAvailable = false; + const action = () => { + const repertoryVersion = arg.data.Success && arg.data.Exists ? arg.data.Version : 'none'; + let versionAvailable = false; - if (repertoryVersion !== 'none') { - const latestVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; - let version = this.state.Version; - if (version === -1) { - version = latestVersion; + if (repertoryVersion !== 'none') { + const latestVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; + let version = this.state.Version; + if (version === -1) { + version = latestVersion; + } + versionAvailable = version !== latestVersion; } - versionAvailable = version !== latestVersion; - } - this.setState({ - AllowDownload: true, - DownloadingDependency: false, - MissingDependencies: arg.data.Dependencies, - RepertoryVersion: repertoryVersion, - VersionAvailable: versionAvailable, - }); + this.setState({ + AllowDownload: true, + DownloadingDependency: false, + MissingDependencies: arg.data.Dependencies, + RepertoryVersion: repertoryVersion, + VersionAvailable: versionAvailable, + }); + }; + + if (arg.data.Success) { + action(); + } else { + this.setErrorState(arg.data.Error, action); + } }; onDownloadFileComplete = (event, arg) => { @@ -506,6 +517,14 @@ class App extends Component { } }; + setErrorState = (error, action) => { + this.setState({ + DisplayError: true, + Error: error, + ErrorAction: action, + }); + }; + updateCheckScheduledJob = () => { if (this.state.Platform !== 'unknown') { if (ipcRenderer) { @@ -537,12 +556,18 @@ class App extends Component { this.state.ConfigStorageType && allowConfig; - const showUpgrade = !showConfig && + const showUpgrade = !this.state.DisplayError && + !showConfig && !missingDependencies && !this.state.DownloadActive && this.state.UpgradeAvailable && !this.state.UpgradeDismissed; + let errorDisplay = null; + if (this.state.DisplayError) { + + } + let configDisplay = null; if (showConfig) { configDisplay = ( @@ -664,6 +689,7 @@ class App extends Component { return (
+ {errorDisplay} {dependencyDisplay} {upgradeDisplay} {downloadDisplay} diff --git a/src/containers/Configuration/Configuration.js b/src/containers/Configuration/Configuration.js index bf82a7e..9baeaaf 100644 --- a/src/containers/Configuration/Configuration.js +++ b/src/containers/Configuration/Configuration.js @@ -277,7 +277,7 @@ class Configuration extends Component {

{this.props.storageType + ' Configuration'}

{objectItems} -

Settings

+ {(configurationItems.length > 0) ?

Settings

: null} {configurationItems}
From c55020fe0f533faee762e0c93d11e07d3175efa1 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 2 Oct 2018 22:59:33 -0500 Subject: [PATCH 14/27] Error handling --- electron.js | 4 + src/App.js | 126 ++++++++++-------- src/components/ErrorDetails/ErrorDetails.css | 11 ++ src/components/ErrorDetails/ErrorDetails.js | 18 +++ src/components/UI/Modal/Modal.css | 8 ++ src/components/UI/Modal/Modal.js | 13 +- src/constants.js | 2 + src/containers/Configuration/Configuration.js | 10 +- src/containers/MountItems/MountItems.js | 2 + src/index.css | 10 +- src/index.js | 18 ++- 11 files changed, 158 insertions(+), 64 deletions(-) create mode 100644 src/components/ErrorDetails/ErrorDetails.css create mode 100644 src/components/ErrorDetails/ErrorDetails.js diff --git a/electron.js b/electron.js index 428e275..22708eb 100644 --- a/electron.js +++ b/electron.js @@ -434,6 +434,10 @@ ipcMain.on(Constants.IPC_Set_Config_Values, (event, data) => { setConfigValue(0); }); +ipcMain.on(Constants.IPC_Shutdown, () => { + app.quit(); +}); + ipcMain.on(Constants.IPC_Unmount_Drive, (event, data) => { helpers .stopProcessByPID(data.PID) diff --git a/src/App.js b/src/App.js index e776027..6e9c39e 100644 --- a/src/App.js +++ b/src/App.js @@ -8,6 +8,7 @@ import CSSModules from 'react-css-modules'; import DependencyList from './components/DependencyList/DependencyList'; import DownloadProgress from './components/DownloadProgress/DownloadProgress'; import DropDown from './components/UI/DropDown/DropDown'; +import ErrorDetails from './components/ErrorDetails/ErrorDetails'; import Loading from './components/UI/Loading/Loading'; import Modal from './components/UI/Modal/Modal'; import MountItems from './containers/MountItems/MountItems'; @@ -31,14 +32,13 @@ class App extends Component { ipcRenderer.on(Constants.IPC_Download_File_Complete, this.onDownloadFileComplete); ipcRenderer.on(Constants.IPC_Download_File_Progress, this.onDownloadFileProgress); ipcRenderer.on(Constants.IPC_Extract_Release_Complete, this.onExtractReleaseComplete); - ipcRenderer.on(Constants.IPC_Get_Platform_Reply, this.onGetPlatformReply); ipcRenderer.on(Constants.IPC_Get_State_Reply, this.onGetStateReply); ipcRenderer.on(Constants.IPC_Grab_Releases_Reply, this.onGrabReleasesReply); ipcRenderer.on(Constants.IPC_Grab_UI_Releases_Reply, this.onGrabUiReleasesReply); ipcRenderer.on(Constants.IPC_Install_Dependency_Reply, this.onInstallDependencyReply); ipcRenderer.on(Constants.IPC_Install_Upgrade_Reply, this.onInstallUpgradeReply); - ipcRenderer.send(Constants.IPC_Get_Platform); + ipcRenderer.send(Constants.IPC_Get_State, Constants.DATA_LOCATIONS[this.props.platform]); Scheduler.scheduleJob('23 11 * * *', this.updateCheckScheduledJob); } } @@ -46,11 +46,12 @@ class App extends Component { state = { AllowOptions: false, AllowDownload: false, - AutoMountChecked: false, + AutoMountProcessed: false, ConfigStorageType: null, DisplayError: false, Error: null, ErrorAction: null, + ErrorCritical: false, DownloadActive: false, DownloadProgress: 0.0, DownloadingDependency: false, @@ -109,16 +110,35 @@ class App extends Component { AllowDownload: false, }); - if (ipcRenderer) { - let dependencies = []; - if (this.state.LocationsLookup[selectedVersion] && this.state.LocationsLookup[selectedVersion].dependencies) { - dependencies = this.state.LocationsLookup[selectedVersion].dependencies; - } + if (selectedVersion !== 'unavailable') { + if (ipcRenderer) { + let dependencies = []; + if (this.state.LocationsLookup[selectedVersion] && this.state.LocationsLookup[selectedVersion].dependencies) { + dependencies = this.state.LocationsLookup[selectedVersion].dependencies; + } - ipcRenderer.send(Constants.IPC_Check_Installed, { - Dependencies: dependencies, - Directory: Constants.DATA_LOCATIONS[this.state.Platform], - Version: selectedVersion, + ipcRenderer.send(Constants.IPC_Check_Installed, { + Dependencies: dependencies, + Directory: Constants.DATA_LOCATIONS[this.props.platform], + Version: selectedVersion, + }); + } + } + }; + + closeErrorDisplay = () => { + if (this.state.ErrorAction) { + this.state.ErrorAction(); + } + + if (this.state.ErrorCritical) { + if (ipcRenderer) { + ipcRenderer.send(Constants.IPC_Shutdown); + } + } else { + this.setState({ + DisplayError: false, + Error: null, }); } }; @@ -129,7 +149,6 @@ class App extends Component { ipcRenderer.removeListener(Constants.IPC_Download_File_Complete, this.onDownloadFileComplete); ipcRenderer.removeListener(Constants.IPC_Download_File_Progress, this.onDownloadFileProgress); ipcRenderer.removeListener(Constants.IPC_Extract_Release_Complete, this.onExtractReleaseComplete); - ipcRenderer.removeListener(Constants.IPC_Get_Platform_Reply, this.onGetPlatformReply); ipcRenderer.removeListener(Constants.IPC_Get_State_Reply, this.onGetStateReply); ipcRenderer.removeListener(Constants.IPC_Grab_Releases_Reply, this.onGrabReleasesReply); ipcRenderer.removeListener(Constants.IPC_Grab_UI_Releases_Reply, this.onGrabUiReleasesReply); @@ -137,9 +156,9 @@ class App extends Component { ipcRenderer.removeListener(Constants.IPC_Install_Upgrade_Reply, this.onInstallUpgradeReply); } }; - + grabReleases = () => { - if (this.state.Platform !== 'unknown') { + if (this.props.platform !== 'unknown') { if (ipcRenderer) { ipcRenderer.send(Constants.IPC_Grab_Releases); ipcRenderer.send(Constants.IPC_Grab_UI_Releases); @@ -195,7 +214,7 @@ class App extends Component { }); ipcRenderer.send(Constants.IPC_Download_File, { - Directory: Constants.DATA_LOCATIONS[this.state.Platform], + Directory: Constants.DATA_LOCATIONS[this.props.platform], Filename: fileName, URL: url, }); @@ -242,7 +261,7 @@ class App extends Component { }); ipcRenderer.send(Constants.IPC_Download_File, { - Directory: Constants.DATA_LOCATIONS[this.state.Platform], + Directory: Constants.DATA_LOCATIONS[this.props.platform], Filename: fileName, URL: this.state.LocationsLookup[selectedVersion].urls[0], }); @@ -258,8 +277,8 @@ class App extends Component { }); ipcRenderer.send(Constants.IPC_Download_File, { - Directory: Constants.DATA_LOCATIONS[this.state.Platform], - Filename: this.state.Platform === 'win32' ? 'upgrade.exe' : 'upgrade', + Directory: Constants.DATA_LOCATIONS[this.props.platform], + Filename: this.props.platform === 'win32' ? 'upgrade.exe' : 'upgrade', URL: this.state.UpgradeData.urls[0], }); } else { @@ -277,7 +296,7 @@ class App extends Component { }; notifyAutoMountProcessed = () => { - this.setState({AutoMountChecked: true}); + this.setState({AutoMountProcessed: true}); }; notifyMountsBusy = (busy) => { @@ -319,7 +338,7 @@ class App extends Component { if (arg.data.Success) { const selectedVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]][this.state.Version]; ipcRenderer.send(Constants.IPC_Extract_Release, { - Directory: Constants.DATA_LOCATIONS[this.state.Platform], + Directory: Constants.DATA_LOCATIONS[this.props.platform], Source: arg.data.Destination, Version: selectedVersion, }); @@ -384,13 +403,6 @@ class App extends Component { this.checkVersionInstalled(this.state.Release, this.state.Version); }; - onGetPlatformReply = (event, arg) => { - this.setState({ - Platform: arg.data, - }); - ipcRenderer.send(Constants.IPC_Get_State, Constants.DATA_LOCATIONS[arg.data]); - }; - onGetStateReply = (event, arg) => { if (arg.data) { if (arg.data.Hyperspace.AutoMount === undefined) { @@ -431,13 +443,13 @@ class App extends Component { axios.get(Constants.RELEASES_URL) .then(response => { const versionLookup = { - Alpha: response.data.Versions.Alpha[this.state.Platform], - Beta: response.data.Versions.Beta[this.state.Platform], - RC: response.data.Versions.RC[this.state.Platform], - Release: response.data.Versions.Release[this.state.Platform], + Alpha: response.data.Versions.Alpha[this.props.platform], + Beta: response.data.Versions.Beta[this.props.platform], + RC: response.data.Versions.RC[this.props.platform], + Release: response.data.Versions.Release[this.props.platform], }; const locationsLookup = { - ...response.data.Locations[this.state.Platform], + ...response.data.Locations[this.props.platform], }; window.localStorage.setItem('releases', JSON.stringify({ @@ -447,7 +459,6 @@ class App extends Component { doUpdate(locationsLookup, versionLookup); }).catch(error => { - console.log(error); const releases = window.localStorage.getItem('releases'); if (releases && (releases.length > 0)) { const obj = JSON.parse(releases); @@ -456,7 +467,7 @@ class App extends Component { doUpdate(locationsLookup, versionLookup); } else { - // TODO Handle error + this.setErrorState(error, null, true); } }); }; @@ -466,17 +477,16 @@ class App extends Component { .then(response => { const data = response.data; if (data.Versions && - data.Versions[this.state.Platform] && - (data.Versions[this.state.Platform].length > 0) && - (data.Versions[this.state.Platform][0] !== this.props.version)) { + data.Versions[this.props.platform] && + (data.Versions[this.props.platform].length > 0) && + (data.Versions[this.props.platform][0] !== this.props.version)) { this.setState({ UpgradeAvailable: true, UpgradeDismissed: false, - UpgradeData: data.Locations[this.state.Platform][data.Versions[this.state.Platform][0]], + UpgradeData: data.Locations[this.props.platform][data.Versions[this.props.platform][0]], }); } - }).catch(error => { - console.log(error); + }).catch(() => { this.setState({ UpgradeAvailable: false, UpgradeData: {}, @@ -506,7 +516,7 @@ class App extends Component { saveState = (release, version, sia, hyperspace)=> { if (ipcRenderer) { ipcRenderer.send(Constants.IPC_Save_State, { - Directory: Constants.DATA_LOCATIONS[this.state.Platform], + Directory: Constants.DATA_LOCATIONS[this.props.platform], State: { Hyperspace: hyperspace, Release: release, @@ -517,19 +527,18 @@ class App extends Component { } }; - setErrorState = (error, action) => { + setErrorState = (error, action, critical) => { this.setState({ DisplayError: true, Error: error, ErrorAction: action, + ErrorCritical: critical, }); }; updateCheckScheduledJob = () => { - if (this.state.Platform !== 'unknown') { - if (ipcRenderer) { - ipcRenderer.send(Constants.IPC_Grab_UI_Releases); - } + if (this.props.platform !== 'unknown') { + this.grabReleases(); } }; @@ -556,16 +565,22 @@ class App extends Component { this.state.ConfigStorageType && allowConfig; - const showUpgrade = !this.state.DisplayError && + const showUpgrade = this.state.UpgradeAvailable && + !this.state.DisplayError && !showConfig && !missingDependencies && !this.state.DownloadActive && - this.state.UpgradeAvailable && !this.state.UpgradeDismissed; let errorDisplay = null; if (this.state.DisplayError) { - + errorDisplay = ( + + + + ); } let configDisplay = null; @@ -573,7 +588,8 @@ class App extends Component { configDisplay = ( @@ -587,12 +603,12 @@ class App extends Component { autoMountProcessed={this.notifyAutoMountProcessed} changed={this.handleMountLocationChanged} configClicked={this.handleConfigClicked} - directory={Constants.DATA_LOCATIONS[this.state.Platform]} - disabled={!allowMount} + directory={Constants.DATA_LOCATIONS[this.props.platform]} + errorHandler={this.setErrorState} hyperspace={this.state.Hyperspace} mountsBusy={this.notifyMountsBusy} - platform={this.state.Platform} - processAutoMount={!this.state.AutoMountChecked} + platform={this.props.platform} + processAutoMount={!this.state.AutoMountProcessed} sia={this.state.Sia} version={this.state.RepertoryVersion}/>; } diff --git a/src/components/ErrorDetails/ErrorDetails.css b/src/components/ErrorDetails/ErrorDetails.css new file mode 100644 index 0000000..62616a8 --- /dev/null +++ b/src/components/ErrorDetails/ErrorDetails.css @@ -0,0 +1,11 @@ +.Heading { + color: var(--text_color_error); + text-align: center; + margin-bottom: 4px; +} + +.Content { + max-height: 60vh; + overflow-y: auto; + margin-bottom: 8px; +} \ No newline at end of file diff --git a/src/components/ErrorDetails/ErrorDetails.js b/src/components/ErrorDetails/ErrorDetails.js new file mode 100644 index 0000000..6bff639 --- /dev/null +++ b/src/components/ErrorDetails/ErrorDetails.js @@ -0,0 +1,18 @@ +import React from 'react'; +import Box from '../UI/Box/Box'; +import Button from '../UI/Button/Button'; +import CSSModules from 'react-css-modules'; +import styles from './ErrorDetails.css'; + +export default CSSModules((props) => { + return ( + +

Application Error

+
+

{props.error.toString()}

+
+ +
+ ); + +}, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/UI/Modal/Modal.css b/src/components/UI/Modal/Modal.css index c5090ac..19e5f32 100644 --- a/src/components/UI/Modal/Modal.css +++ b/src/components/UI/Modal/Modal.css @@ -17,3 +17,11 @@ transform: translate(-50%, -50%); z-index: 2001; } + +.Modal.Critical { + z-index: 2100; +} + +.Content.Critical { + z-index: 2101; +} diff --git a/src/components/UI/Modal/Modal.js b/src/components/UI/Modal/Modal.js index 057f05b..6dc7223 100644 --- a/src/components/UI/Modal/Modal.js +++ b/src/components/UI/Modal/Modal.js @@ -3,11 +3,20 @@ import CSSModules from 'react-css-modules'; import styles from './Modal.css' export default CSSModules((props) => { + let modalStyles = []; + let contentStyles = []; + modalStyles.push('Modal'); + contentStyles.push('Content'); + if (props.critical) { + modalStyles.push('Critical'); + contentStyles.push('Critical'); + } + return (
-
+
{props.children}
); diff --git a/src/constants.js b/src/constants.js index 4b370d9..0726858 100644 --- a/src/constants.js +++ b/src/constants.js @@ -56,5 +56,7 @@ exports.IPC_Save_State = 'save_state'; exports.IPC_Set_Config_Values = 'set_config_values'; exports.IPC_Set_Config_Values_Reply = 'set_config_values_reply'; +exports.IPC_Shutdown = 'shutdown'; + exports.IPC_Unmount_Drive = 'unmount_drive'; exports.IPC_Unmount_Drive_Reply = 'unmount_drive_reply'; \ No newline at end of file diff --git a/src/containers/Configuration/Configuration.js b/src/containers/Configuration/Configuration.js index 9baeaaf..5e3e393 100644 --- a/src/containers/Configuration/Configuration.js +++ b/src/containers/Configuration/Configuration.js @@ -155,6 +155,8 @@ class Configuration extends Component { OriginalItemList: itemListCopy, OriginalObjectLookup: objectLookupCopy, }); + } else { + this.props.errorHandler(arg.data.Error); } }; @@ -168,6 +170,10 @@ class Configuration extends Component { StorageType: this.props.storageType, Version: this.props.version, }); + } else { + this.props.errorHandler(arg.data.Error, () => { + this.props.closed(); + }); } }; @@ -218,7 +224,7 @@ class Configuration extends Component {

Save Changes?

- +
@@ -227,7 +233,7 @@ class Configuration extends Component { ); } - let configurationItems = this.state.ItemList + const configurationItems = this.state.ItemList .map((k, i) => { return ( ((this.state.ShowAdvanced && k.advanced) || !k.advanced) ? diff --git a/src/containers/MountItems/MountItems.js b/src/containers/MountItems/MountItems.js index 363b1dd..ba40100 100644 --- a/src/containers/MountItems/MountItems.js +++ b/src/containers/MountItems/MountItems.js @@ -135,6 +135,8 @@ class MountItems extends Component { } this.performAutoMount(); + } else { + this.props.errorHandler(arg.data.Error); } }; diff --git a/src/index.css b/src/index.css index a2b349f..0baabf1 100644 --- a/src/index.css +++ b/src/index.css @@ -9,6 +9,7 @@ --control_dark_transparent_background: rgba(15, 15, 15, 0.8); --text_color: rgba(200, 205, 220, 0.75); + --text_color_error: rgba(203, 120, 120, 0.75); --text_color_hover: rgba(200, 205, 220, 0.75); --heading_text_color: rgba(140, 169, 203, 0.75); --heading_other_text_color: rgba(200, 205, 220, 0.75); @@ -17,7 +18,7 @@ * { font-family: 'Nunito', sans-serif; - font-size: 14px; + font-size: 5vh; } *::-moz-focus-inner { @@ -61,3 +62,10 @@ h1 { h2, h3 { color: var(--heading_other_text_color); } + +p { + margin: 0; + padding: 0; + font-weight: normal; + color: var(--text_color); +} diff --git a/src/index.js b/src/index.js index 46a1b71..a7d5c00 100644 --- a/src/index.js +++ b/src/index.js @@ -1,10 +1,20 @@ import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; - import App from './App'; -import registerServiceWorker from './registerServiceWorker'; import packageJson from '../package.json'; +import registerServiceWorker from './registerServiceWorker'; + +const Constants = require('./constants'); + +if (!process.versions.hasOwnProperty('electron')) { + const ipcRenderer = ((window && window.require) ? window.require('electron').ipcRenderer : null); + if (ipcRenderer) { + ipcRenderer.on(Constants.IPC_Get_Platform_Reply, (event, arg) => { + ReactDOM.render(, document.getElementById('root')); + registerServiceWorker(); + }); + ipcRenderer.send(Constants.IPC_Get_Platform); + } +} -ReactDOM.render(, document.getElementById('root')); -registerServiceWorker(); From ee40dfefeb139095023b1dff24c8a1402357291b Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 2 Oct 2018 23:16:25 -0500 Subject: [PATCH 15/27] Added margin --- src/containers/MountItems/MountItems.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/containers/MountItems/MountItems.css b/src/containers/MountItems/MountItems.css index 2414433..291e3c1 100644 --- a/src/containers/MountItems/MountItems.css +++ b/src/containers/MountItems/MountItems.css @@ -1,5 +1,5 @@ .MountItems { padding: 0; - margin: 0; + margin-top: 8px; width: 100%; } \ No newline at end of file From b4aa381023054fc508aac410e02fbcb4d8d9bf8f Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Tue, 2 Oct 2018 23:30:18 -0500 Subject: [PATCH 16/27] Added changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c43859d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog # +## 1.0.0 ## +* Initial release +* Windows support + +## 1.0.1 ## +* Added configuration settings for Repertory 1.0.0-alpha.2 and above +* Fixed memory leak on component unmount +* Added error display +* Various fixes and layout changes From b430465b7bae1ca4289ea9369d51425905fd3194 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 3 Oct 2018 14:54:05 -0500 Subject: [PATCH 17/27] Component refactoring --- electron.js | 2 +- src/App.js | 177 +++++++----------- .../ReleaseVersionDisplay.css | 0 .../ReleaseVersionDisplay.js | 74 ++++++++ src/components/UI/Button/Button.css | 3 +- src/components/UI/DropDown/DropDown.css | 2 + src/components/UI/Grid/Grid.css | 18 ++ src/components/UI/Grid/Grid.js | 121 ++++++++++++ .../UI/Grid/GridComponent/GridComponent.css | 7 + .../UI/Grid/GridComponent/GridComponent.js | 21 +++ src/components/UI/Text/Text.css | 39 ++++ src/components/UI/Text/Text.js | 28 +++ src/components/UpgradeIcon/UpgradeIcon.css | 17 +- src/components/UpgradeIcon/UpgradeIcon.js | 8 +- src/containers/MountItems/MountItems.css | 1 - 15 files changed, 390 insertions(+), 128 deletions(-) create mode 100644 src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.css create mode 100644 src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.js create mode 100644 src/components/UI/Grid/Grid.css create mode 100644 src/components/UI/Grid/Grid.js create mode 100644 src/components/UI/Grid/GridComponent/GridComponent.css create mode 100644 src/components/UI/Grid/GridComponent/GridComponent.js create mode 100644 src/components/UI/Text/Text.css create mode 100644 src/components/UI/Text/Text.js diff --git a/electron.js b/electron.js index 22708eb..31247fb 100644 --- a/electron.js +++ b/electron.js @@ -21,7 +21,7 @@ let mountedPIDs = []; function createWindow() { // Create the browser window. - const height = process.env.ELECTRON_START_URL ? 340 : 320; + const height = process.env.ELECTRON_START_URL ? 344 : 324; mainWindow = new BrowserWindow({ width: 425, height: height, diff --git a/src/App.js b/src/App.js index 6e9c39e..d82ce3e 100644 --- a/src/App.js +++ b/src/App.js @@ -2,16 +2,17 @@ import React, {Component} from 'react'; import axios from 'axios'; import styles from './App.css'; import Box from './components/UI/Box/Box'; -import Button from './components/UI/Button/Button'; import Configuration from './containers/Configuration/Configuration'; import CSSModules from 'react-css-modules'; import DependencyList from './components/DependencyList/DependencyList'; import DownloadProgress from './components/DownloadProgress/DownloadProgress'; -import DropDown from './components/UI/DropDown/DropDown'; import ErrorDetails from './components/ErrorDetails/ErrorDetails'; +import Grid from './components/UI/Grid/Grid'; import Loading from './components/UI/Loading/Loading'; import Modal from './components/UI/Modal/Modal'; import MountItems from './containers/MountItems/MountItems'; +import ReleaseVersionDisplay from './components/ReleaseVersionDisplay/ReleaseVersionDisplay'; +import Text from './components/UI/Text/Text'; import UpgradeIcon from './components/UpgradeIcon/UpgradeIcon'; import UpgradeUI from './components/UpgradeUI/UpgradeUI'; @@ -44,11 +45,11 @@ class App extends Component { } state = { - AllowOptions: false, AllowDownload: false, AutoMountProcessed: false, ConfigStorageType: null, DisplayError: false, + DisplayMainContent: false, Error: null, ErrorAction: null, ErrorCritical: false, @@ -74,7 +75,7 @@ class App extends Component { 'Beta', 'Alpha', ], - RepertoryVersion: 'none', + InstalledVersion: 'none', Sia: { AutoMount: false, MountLocation: '', @@ -305,10 +306,10 @@ class App extends Component { onCheckInstalledReply = (event, arg) => { const action = () => { - const repertoryVersion = arg.data.Success && arg.data.Exists ? arg.data.Version : 'none'; + const installedVersion = arg.data.Success && arg.data.Exists ? arg.data.Version : 'none'; let versionAvailable = false; - if (repertoryVersion !== 'none') { + if (installedVersion !== 'none') { const latestVersion = this.state.VersionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; let version = this.state.Version; if (version === -1) { @@ -321,7 +322,7 @@ class App extends Component { AllowDownload: true, DownloadingDependency: false, MissingDependencies: arg.data.Dependencies, - RepertoryVersion: repertoryVersion, + InstalledVersion: installedVersion, VersionAvailable: versionAvailable, }); }; @@ -430,7 +431,7 @@ class App extends Component { } this.setState({ - AllowOptions: true, + DisplayMainContent: true, LocationsLookup: locationsLookup, Version: version, VersionAvailable: version !== latestVersion, @@ -551,9 +552,9 @@ class App extends Component { !this.state.MountsBusy && !this.state.DownloadActive && (selectedVersion !== 'unavailable') && - (selectedVersion !== this.state.RepertoryVersion); + (selectedVersion !== this.state.InstalledVersion); - const allowMount = this.state.RepertoryVersion !== 'none'; + const allowMount = this.state.InstalledVersion !== 'none'; const missingDependencies = (this.state.MissingDependencies.length > 0); const allowConfig = this.state.LocationsLookup[selectedVersion] && this.state.LocationsLookup[selectedVersion].config_support; @@ -596,23 +597,6 @@ class App extends Component { ); } - let mountDisplay = null; - if (allowMount) { - mountDisplay = ; - } - let dependencyDisplay = null; if (showDependencies) { dependencyDisplay = ( @@ -634,14 +618,6 @@ class App extends Component { ); } - let releaseDisplay = null; - if (this.state.ExtractActive) { - releaseDisplay =

{'Activating <' + selectedVersion + '>'}

- } else { - releaseDisplay = ; - } - let upgradeDisplay = null; if (showUpgrade) { upgradeDisplay = ( @@ -652,53 +628,47 @@ class App extends Component { ); } - let mainContent = null; - if (this.state.AllowOptions) { - mainContent = ( - - - - - - - - - - - - - - - - - - - -
-

Release

-
-

Version

-
-

Installed

-
- - - - - {this.state.RepertoryVersion} -
- {releaseDisplay} -
- {mountDisplay} -
); + let mainContent = []; + if (this.state.DisplayMainContent) { + let key = 0; + mainContent.push(( +
+ +
+ )); + + if (allowMount) { + mainContent.push(( +
+ +
+ )); + } } else { mainContent = } @@ -710,32 +680,25 @@ class App extends Component { {upgradeDisplay} {downloadDisplay} {configDisplay} - - - - - - - - -
- -

{'Repertory UI v' + this.props.version}

-
- this.setState({UpgradeDismissed: false})}/> -
+ + + + this.setState({UpgradeDismissed: false})} + col={dimensions => dimensions.columns - 7} + colSpan={6} + row={0} + rowSpan={'remain'}/> + - + {mainContent}
diff --git a/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.css b/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.js b/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.js new file mode 100644 index 0000000..f918152 --- /dev/null +++ b/src/components/ReleaseVersionDisplay/ReleaseVersionDisplay.js @@ -0,0 +1,74 @@ +import React from 'react'; +import styles from './ReleaseVersionDisplay.css'; +import CSSModules from 'react-css-modules'; +import DropDown from '../UI/DropDown/DropDown'; +import Grid from '../UI/Grid/Grid'; +import Text from '../UI/Text/Text'; +import Button from '../UI/Button/Button'; +import UpgradeIcon from '../UpgradeIcon/UpgradeIcon'; + +export default CSSModules((props) => { + let optionsDisplay = null; + if (props.releaseExtracting) { + optionsDisplay = '}/> + } else { + optionsDisplay = ; + } + + return ( + + columns / 3} + rowSpan={4} + text={'Release'} + textAlign={'left'} + type={'Heading2'}/> + remain / 3 - 1} + disabled={props.disabled} + items={props.releaseTypes} + row={5} + rowSpan={7} + selected={props.release}/> + dimensions.columns / 3} + colSpan={remain=>remain / 2} + rowSpan={4} + text={'Version'} + textAlign={'left'} + type={'Heading2'}/> + ((dimensions.columns / 3) * 2) - 6} + colSpan={4} + release + rowSpan={4}/> + dimensions.columns / 3} + colSpan={remain=>remain / 2 - 1} + disabled={props.disabled} + items={props.versions} + row={5} + rowSpan={7} + selected={props.version}/> + (dimensions.columns / 3) * 2} + colSpan={'remain'} + rowSpan={4} + text={'Installed'} + textAlign={'left'} + type={'Heading2'}/> + (dimensions.columns / 3) * 2} + colSpan={'remain'} + row={5} + rowSpan={7} + text={props.installedVersion} + textAlign={'left'}/> + {optionsDisplay} + + ); +}, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/UI/Button/Button.css b/src/components/UI/Button/Button.css index c1164b1..cb0bdc2 100644 --- a/src/components/UI/Button/Button.css +++ b/src/components/UI/Button/Button.css @@ -10,7 +10,8 @@ border: none; text-decoration: none; text-outline: none; - width: 70px; + height: 100%; + width: 100%; } .Button:hover:enabled { diff --git a/src/components/UI/DropDown/DropDown.css b/src/components/UI/DropDown/DropDown.css index b05cc4b..187a3f5 100644 --- a/src/components/UI/DropDown/DropDown.css +++ b/src/components/UI/DropDown/DropDown.css @@ -1,5 +1,7 @@ .DropDown { + display: block; width: 100%; + height: 100%; margin: 0; padding: 0; } diff --git a/src/components/UI/Grid/Grid.css b/src/components/UI/Grid/Grid.css new file mode 100644 index 0000000..185b7af --- /dev/null +++ b/src/components/UI/Grid/Grid.css @@ -0,0 +1,18 @@ +.Grid { + margin: 0; + padding: 0; + display: grid; + box-sizing: border-box; + height: 100%; + width: 100%; + overflow-y: auto; + overflow-x: auto; +} + +.GridOwner { + padding: 0; + margin: 0; + width: 100%; + height: 100%; + box-sizing: border-box; +} \ No newline at end of file diff --git a/src/components/UI/Grid/Grid.js b/src/components/UI/Grid/Grid.js new file mode 100644 index 0000000..8df6a23 --- /dev/null +++ b/src/components/UI/Grid/Grid.js @@ -0,0 +1,121 @@ +import React, {Component} from 'react'; +import CSSModules from 'react-css-modules'; +import styles from './Grid.css'; +import GridComponent from './GridComponent/GridComponent'; + +export default CSSModules(class extends Component { + constructor(props) { + super(props); + window.addEventListener("resize", this.updateSizeAsync); + } + + state = { + calculated: false, + dimensions: { + columns: 0, + rows: 0 + } + }; + + calculateDimensions = (size) => { + return { + columns: Math.floor(size.width / 4), + rows: Math.floor(size.height / 4) + }; + }; + + getSize = () => { + const elem = this.refs.GridOwner; + return { + height: elem ? elem.clientHeight : 0, + width: elem ? elem.clientWidth : 0 + }; + }; + + updateSize = () => { + const state = { + ...this.state + }; + const size = this.getSize(); + const dimensions = this.calculateDimensions(size); + if (state.dimensions !== dimensions) { + this.setState({ + calculated: true, + dimensions: dimensions + }) + } + }; + + updateSizeAsync = () => { + return new Promise((done) => { + this.updateSize(); + done(); + }); + }; + + componentDidMount = () => { + this.updateSizeAsync(); + }; + + componentWillUnmount = () => { + window.removeEventListener("resize", this.updateSizeAsync); + }; + + render() { + let children = null; + const dimensions = this.state.dimensions; + if (this.state.calculated) { + children = React.Children.map(this.props.children, (child, i) => { + let row = child.props.row || 0; + if (typeof(row) === 'function') { + row = row(dimensions); + } + + let col = child.props.col || 0; + if (typeof(col) === 'function') { + col = col(dimensions); + } + + let rowSpan = child.props.rowSpan; + if (typeof(rowSpan) === 'function') { + rowSpan = rowSpan(dimensions.rows - row, dimensions.rows); + } + + let colSpan = child.props.colSpan; + if (typeof(colSpan) === 'function') { + colSpan = colSpan(dimensions.columns - col, dimensions.columns); + } + + rowSpan = rowSpan ? (rowSpan === 'remain' ? (dimensions.rows - row) : rowSpan) : null; + colSpan = colSpan ? (colSpan === 'remain' ? dimensions.columns - col : colSpan) : null; + + return {child}; + }); + } + + const style = { + style: { + gridTemplateColumns: '4px '.repeat(dimensions.columns).trim(), + gridTemplateRows: '4px '.repeat(dimensions.rows).trim(), + gridAutoColumns: '4px', + gridAutoRows: '4px' + } + }; + + return ( +
+
+ {children} +
+
+ ) + }; + +}, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/UI/Grid/GridComponent/GridComponent.css b/src/components/UI/Grid/GridComponent/GridComponent.css new file mode 100644 index 0000000..ca842fa --- /dev/null +++ b/src/components/UI/Grid/GridComponent/GridComponent.css @@ -0,0 +1,7 @@ +.GridComponent { + padding: 0; + margin: 0; + display: flex; + justify-content: center; + align-items: center; +} \ No newline at end of file diff --git a/src/components/UI/Grid/GridComponent/GridComponent.js b/src/components/UI/Grid/GridComponent/GridComponent.js new file mode 100644 index 0000000..686fa3e --- /dev/null +++ b/src/components/UI/Grid/GridComponent/GridComponent.js @@ -0,0 +1,21 @@ +import React from 'react'; +import CSSModules from 'react-css-modules'; +import styles from './GridComponent.css'; + +export default CSSModules((props) => { + const style = { + style: { + gridRowStart: Math.floor(props.row + 1), + gridRowEnd: 'span ' + Math.floor(props.rowSpan || 1), + gridColumnStart: Math.floor(props.col + 1), + gridColumnEnd: 'span ' + Math.floor(props.colSpan || 1) + } + }; + + return ( +
+ {props.children} +
+ ); + +}, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/UI/Text/Text.css b/src/components/UI/Text/Text.css new file mode 100644 index 0000000..b03a3ae --- /dev/null +++ b/src/components/UI/Text/Text.css @@ -0,0 +1,39 @@ +.TextOwner { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; +} + +.Text { + display: inline-block; + padding: 0; + margin: 0; + text-decoration: none; + text-align: center; + vertical-align: center; + color: var(--text_color); +} + +.Heading1 { + font-weight: bold; + color: var(--heading_text_color); +} + +.Heading2 { + font-weight: bold; + color: var(--heading_other_text_color); +} + +.Heading3 { + font-weight: bold; + color: var(--heading_other_text_color); +} + +.AltTextColor { + color: var(--heading_other_text_color); +} \ No newline at end of file diff --git a/src/components/UI/Text/Text.js b/src/components/UI/Text/Text.js new file mode 100644 index 0000000..6cc5a05 --- /dev/null +++ b/src/components/UI/Text/Text.js @@ -0,0 +1,28 @@ +import React from 'react'; +import CSSModules from 'react-css-modules'; +import styles from './Text.css'; + +export default CSSModules((props) => { + const styleList = []; + styleList.push('Text'); + if (props.type) { + styleList.push(props.type); + } + + let style = {...props.style}; + if (props.textAlign) { + style['textAlign'] = props.textAlign.toLowerCase(); + } + + const text = ( +
{props.text} +
); + + return props.noOwner ? text : ( +
+ {text} +
); + +}, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/UpgradeIcon/UpgradeIcon.css b/src/components/UpgradeIcon/UpgradeIcon.css index 9b8513a..8afe7ce 100644 --- a/src/components/UpgradeIcon/UpgradeIcon.css +++ b/src/components/UpgradeIcon/UpgradeIcon.css @@ -1,26 +1,21 @@ .Owner { - display: block; - margin-right: 2px; padding: 0; - width: 20px; - height: 20px; + margin: 0; + width: 100%; + height: 100%; border: 0; box-sizing: border-box; cursor: pointer; } -.Owner p { - margin: 0; - padding: 0; -} - .UpgradeIcon { display: block; margin: 0; padding: 0; + object-fit: contain; border: 0; - width: 20px; - height: 20px; + max-width: 100%; + max-height: 100%; box-sizing: border-box; opacity: 0.65; } \ No newline at end of file diff --git a/src/components/UpgradeIcon/UpgradeIcon.js b/src/components/UpgradeIcon/UpgradeIcon.js index 64e8ea8..7165531 100644 --- a/src/components/UpgradeIcon/UpgradeIcon.js +++ b/src/components/UpgradeIcon/UpgradeIcon.js @@ -5,27 +5,21 @@ import availableImage from '../../assets/images/release_available.png'; import ReactTooltip from 'react-tooltip'; export default CSSModules((props) => { - let style; - let style2; let placement = 'left'; let toolTipText = 'UI Upgrade Available'; if (props.release) { placement='bottom'; toolTipText = 'New Release Available'; - style = {float: 'right', marginRight: '5%', width: '15px', height: '15px', cursor: 'default'}; - style2 = {width: '15px', height: '15px'}; } return props .available ? ( -
+

{toolTipText} diff --git a/src/containers/MountItems/MountItems.css b/src/containers/MountItems/MountItems.css index 291e3c1..d1d3aed 100644 --- a/src/containers/MountItems/MountItems.css +++ b/src/containers/MountItems/MountItems.css @@ -1,5 +1,4 @@ .MountItems { padding: 0; - margin-top: 8px; width: 100%; } \ No newline at end of file From ddb8a72c21ae1e9745de9e1c93547f9c840601a8 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 3 Oct 2018 14:56:41 -0500 Subject: [PATCH 18/27] Fix upgrade detection --- src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index d82ce3e..49cb4a4 100644 --- a/src/App.js +++ b/src/App.js @@ -690,7 +690,7 @@ class App extends Component { textAlign={'center'} type={'Heading1'}/> this.setState({UpgradeDismissed: false})} col={dimensions => dimensions.columns - 7} colSpan={6} From 9b186fbfac7319545447de001cd6d7261508674d Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 3 Oct 2018 15:18:59 -0500 Subject: [PATCH 19/27] Updated image --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 257ba39..55811b1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Repertory UI -![alt text](https://image.ibb.co/dpncxU/repertory_windows.png) - +![alt text](https://image.ibb.co/mnhA1z/repertory_1_0_1.png) ### GUI for [Repertory](https://bitbucket.org/blockstorage/repertory) ### Repertory allows you to mount Hyperspace or Sia blockchain storage solutions via FUSE on Linux/OS X or via WinFSP on Windows. # Downloads # From aee85ed0a6f9aa5e6d57e703e031b81e21f0634e Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 3 Oct 2018 16:57:00 -0500 Subject: [PATCH 20/27] Updated Windows tray images --- electron.js | 21 ++++++++++++++++++++- public/favicon.ico | Bin 370070 -> 370070 bytes public/favicon_old.ico | Bin 0 -> 370070 bytes public/icon.ico | Bin 370070 -> 370070 bytes public/icon_old.ico | Bin 0 -> 370070 bytes public/logo.png | Bin 0 -> 3449 bytes public/logo_both.png | Bin 0 -> 3450 bytes public/logo_hs.png | Bin 0 -> 3471 bytes public/logo_sia.png | Bin 0 -> 3471 bytes 9 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 public/favicon_old.ico create mode 100644 public/icon_old.ico create mode 100644 public/logo.png create mode 100644 public/logo_both.png create mode 100644 public/logo_hs.png create mode 100644 public/logo_sia.png diff --git a/electron.js b/electron.js index 31247fb..3d8d809 100644 --- a/electron.js +++ b/electron.js @@ -54,7 +54,7 @@ function createWindow() { path: path.resolve(path.join(app.getAppPath(), '..\\..\\repertory-ui.exe')), }); - const image = nativeImage.createFromPath(path.join(__dirname, '/build/icon.ico')); + const image = nativeImage.createFromPath(path.join(__dirname, '/build/logo.png')); mainContextWindow = Menu.buildFromTemplate([ { label: 'Visible', type: 'checkbox', click(item) { @@ -219,6 +219,23 @@ ipcMain.on(Constants.IPC_Detect_Mounts, (event, data) => { } }; + const setImage = (hsLocation, siaLocation) => { + if (os.platform() === 'win32') { + let image; + if ((siaLocation.length > 0) && (hsLocation.length > 0)) { + image = nativeImage.createFromPath(path.join(__dirname, '/build/logo_both.png')); + } else if (hsLocation.length > 0) { + image = nativeImage.createFromPath(path.join(__dirname, '/build/logo_hs.png')); + } else if (siaLocation.length > 0) { + image = nativeImage.createFromPath(path.join(__dirname, '/build/logo_sia.png')); + } else { + image = nativeImage.createFromPath(path.join(__dirname, '/build/logo.png')); + } + + mainWindowTray.setImage(image); + } + }; + const dataDirectory = helpers.resolvePath(data.Directory); helpers .detectRepertoryMounts(dataDirectory, data.Version) @@ -230,6 +247,7 @@ ipcMain.on(Constants.IPC_Detect_Mounts, (event, data) => { siaLocation = siaLocation.toUpperCase(); grabDriveLetters(hsLocation, siaLocation); } + setImage(hsLocation, siaLocation); standardIPCReply(event, Constants.IPC_Detect_Mounts_Reply, { DriveLetters: driveLetters, Locations: { @@ -244,6 +262,7 @@ ipcMain.on(Constants.IPC_Detect_Mounts, (event, data) => { }) .catch(error => { grabDriveLetters('', ''); + setImage('', ''); standardIPCReply(event, Constants.IPC_Detect_Mounts_Reply, { DriveLetters: driveLetters, }, error); diff --git a/public/favicon.ico b/public/favicon.ico index 530403fddc6e4a216a3686b344250e71ea990695..1c44c7ebc96dd23761a4acd5bc6febf0b215f9a0 100644 GIT binary patch literal 370070 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 Lw-cetmYni0C2xnQ literal 0 HcmV?d00001 diff --git a/public/logo_hs.png b/public/logo_hs.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ce38cb2f85142671093e7b6bd2268c299e980b GIT binary patch literal 3471 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 literal 0 HcmV?d00001 diff --git a/public/logo_sia.png b/public/logo_sia.png new file mode 100644 index 0000000000000000000000000000000000000000..bf5c63da289e266f69c94f3e7d5e6988845d777c GIT binary patch literal 3471 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 literal 0 HcmV?d00001 From 43fa638c06f05e811ea2111b0baaaa3841209caa Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 3 Oct 2018 18:45:10 -0500 Subject: [PATCH 21/27] Updated CHANGELOG --- CHANGELOG.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c43859d..fb5b637 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,12 @@ # Changelog # -## 1.0.0 ## -* Initial release -* Windows support - ## 1.0.1 ## * Added configuration settings for Repertory 1.0.0-alpha.2 and above * Fixed memory leak on component unmount * Added error display -* Various fixes and layout changes +* Lighter tray icon on Windows +* Tray icon indicates mount status on Windows +* Various fixes/layout changes + +## 1.0.0 ## +* Initial release +* Windows support From b5171f2b1bd38aa5672ff1d291e46790cc6e629e Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 3 Oct 2018 21:35:01 -0500 Subject: [PATCH 22/27] Fix sizing --- src/App.css | 21 ++++++++++++++++++++- src/App.js | 46 ++++++++++++++++++++++++++-------------------- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/src/App.css b/src/App.css index 35d4011..990a2b2 100644 --- a/src/App.css +++ b/src/App.css @@ -2,10 +2,29 @@ display: flex; flex-direction: column; margin: 0; - padding: 10px; + padding: 8px; box-sizing: border-box; height: 100vh; width: 100vw; background-image: url('./assets/images/background.jpg'); background-size: cover; +} + +.Container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + box-sizing: border-box; +} + +.Header { + height: 28px; + margin-bottom: 8px; + box-sizing: border-box; +} + +.Content { + flex: 1; + box-sizing: border-box; } \ No newline at end of file diff --git a/src/App.js b/src/App.js index 49cb4a4..b196019 100644 --- a/src/App.js +++ b/src/App.js @@ -680,27 +680,33 @@ class App extends Component { {upgradeDisplay} {downloadDisplay} {configDisplay} - - - +
+ + + + this.setState({UpgradeDismissed: false})} + col={dimensions => dimensions.columns - 7} + colSpan={6} row={0} - colSpan={'remain'} - rowSpan={'remain'} - text={'Repertory UI v' + this.props.version} - textAlign={'center'} - type={'Heading1'}/> - this.setState({UpgradeDismissed: false})} - col={dimensions => dimensions.columns - 7} - colSpan={6} - row={0} - rowSpan={'remain'}/> - - - - {mainContent} - + rowSpan={'remain'}/> + + +
+
+ + {mainContent} + +
+
); } From 4e5cf652c94bbf222559cf2b70e5ce11ab8df7ce Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 3 Oct 2018 22:05:34 -0500 Subject: [PATCH 23/27] Auto-start for Linux --- electron.js | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/electron.js b/electron.js index 3d8d809..fdee93f 100644 --- a/electron.js +++ b/electron.js @@ -48,10 +48,14 @@ function createWindow() { mainWindow = null }); - if (os.platform() === 'win32') { + if ((os.platform() === 'win32') || (os.platform() === 'linux')) { + const appPath = (os.platform() === 'win32') ? + path.resolve(path.join(app.getAppPath(), '..\\..\\repertory-ui.exe')) : + process.env.APPIMAGE; + const autoLauncher = new AutoLaunch({ name: 'Repertory UI', - path: path.resolve(path.join(app.getAppPath(), '..\\..\\repertory-ui.exe')), + path: appPath, }); const image = nativeImage.createFromPath(path.join(__dirname, '/build/logo.png')); @@ -89,17 +93,18 @@ function createWindow() { ]); mainContextWindow.items[0].checked = true; - autoLauncher.isEnabled() - .then((enabled) => { - mainContextWindow.items[1].checked = enabled; + autoLauncher + .isEnabled() + .then((enabled) => { + mainContextWindow.items[1].checked = enabled; - mainWindowTray = new Tray(image); - mainWindowTray.setToolTip('Repertory UI'); - mainWindowTray.setContextMenu(mainContextWindow) - }) - .catch(() => { - app.quit(); - }); + mainWindowTray = new Tray(image); + mainWindowTray.setToolTip('Repertory UI'); + mainWindowTray.setContextMenu(mainContextWindow) + }) + .catch(() => { + app.quit(); + }); } } From 712ad932becca43fc542b6ca0204b613943485f9 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 3 Oct 2018 22:38:51 -0500 Subject: [PATCH 24/27] Added padding --- src/components/MountItem/MountItem.css | 1 + src/containers/MountItems/MountItems.css | 1 + src/containers/MountItems/MountItems.js | 1 + src/index.css | 10 +++++----- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/MountItem/MountItem.css b/src/components/MountItem/MountItem.css index f4cda55..7f31c62 100644 --- a/src/components/MountItem/MountItem.css +++ b/src/components/MountItem/MountItem.css @@ -2,5 +2,6 @@ padding: 0; margin: 0; width: 100%; + box-sizing: border-box; } diff --git a/src/containers/MountItems/MountItems.css b/src/containers/MountItems/MountItems.css index d1d3aed..bbbdc81 100644 --- a/src/containers/MountItems/MountItems.css +++ b/src/containers/MountItems/MountItems.css @@ -1,4 +1,5 @@ .MountItems { padding: 0; width: 100%; + box-sizing: border-box; } \ No newline at end of file diff --git a/src/containers/MountItems/MountItems.js b/src/containers/MountItems/MountItems.js index ba40100..c2c77ea 100644 --- a/src/containers/MountItems/MountItems.js +++ b/src/containers/MountItems/MountItems.js @@ -189,6 +189,7 @@ class MountItems extends Component { pid={this.state.Hyperspace.PID} platform={this.props.platform} title={'Hyperspace'}/> +
Date: Thu, 4 Oct 2018 00:49:49 -0500 Subject: [PATCH 25/27] [Layout changes] [Prepare for release] --- src/App.css | 2 +- src/App.js | 11 ++++++----- src/constants.js | 4 ++-- src/index.css | 27 ++++++++++++++++++++++----- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/App.css b/src/App.css index 990a2b2..93e8859 100644 --- a/src/App.css +++ b/src/App.css @@ -2,7 +2,7 @@ display: flex; flex-direction: column; margin: 0; - padding: 8px; + padding: 10px; box-sizing: border-box; height: 100vh; width: 100vw; diff --git a/src/App.js b/src/App.js index b196019..286adac 100644 --- a/src/App.js +++ b/src/App.js @@ -426,8 +426,9 @@ class App extends Component { const doUpdate = (locationsLookup, versionLookup) => { const latestVersion = versionLookup[this.state.ReleaseTypes[this.state.Release]].length - 1; let version = this.state.Version; - if (version === -1) { + if ((version === -1) || !versionLookup[this.state.ReleaseTypes[this.state.Release]][version]) { version = latestVersion; + this.saveState(this.state.Release, version, this.state.Sia, this.state.Hyperspace); } this.setState({ @@ -694,10 +695,10 @@ class App extends Component { this.setState({UpgradeDismissed: false})} - col={dimensions => dimensions.columns - 7} - colSpan={6} - row={0} - rowSpan={'remain'}/> + col={dimensions => dimensions.columns - 6} + colSpan={5} + row={1} + rowSpan={remain=>remain - 2}/>
diff --git a/src/constants.js b/src/constants.js index 0726858..06b1a92 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,13 +1,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory/raw/1.0.0-alpha.2_branch/releases.json'; +exports.RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory/raw/master/releases.json'; exports.DATA_LOCATIONS = { linux: '~/.local/repertory/ui', darwin: '~/Library/Application Support/repertory/ui', win32: '%LOCALAPPDATA%\\repertory\\ui' }; -exports.UI_RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory-ui/raw/1.0.1_branch/releases.json'; +exports.UI_RELEASES_URL = 'https://bitbucket.org/blockstorage/repertory-ui/raw/master/releases.json'; exports.IPC_Check_Installed = 'check_installed'; exports.IPC_Check_Installed_Reply = 'check_installed_reply'; diff --git a/src/index.css b/src/index.css index 630e5f6..0b69062 100644 --- a/src/index.css +++ b/src/index.css @@ -5,14 +5,14 @@ --control_background_hover: rgba(150, 150, 190, .3); --control_border: 1px solid rgba(70, 70, 70, 0.9); --control_box_shadow: 1px 1px 1px black; - --control_transparent_background: rgba(60, 60, 70, 0.4); + --control_transparent_background: rgba(40, 40, 55, 0.45); --control_dark_transparent_background: rgba(15, 15, 15, 0.8); - --text_color: rgba(200, 205, 220, 0.8); - --text_color_hover: rgba(200, 205, 220, 0.8); + --text_color: rgba(200, 205, 220, 0.7); + --text_color_hover: rgba(200, 205, 220, 0.7); --text_color_error: rgba(203, 120, 120, 0.8); - --heading_text_color: rgba(140, 169, 203, 0.8); - --heading_other_text_color: rgba(200, 205, 220, 0.8); + --heading_text_color: rgba(166, 177, 219, 0.7); + --heading_other_text_color: var(--heading_text_color); --text_color_transition: color 0.3s; } @@ -69,3 +69,20 @@ p { font-weight: normal; color: var(--text_color); } + +.scrollable-content { + overflow-x: hidden; + overflow-y: scroll; +} + +.scrollable-content, ::-webkit-scrollbar { + width: 10px; +} + +.scrollable-content, ::-webkit-scrollbar * { + background: transparent; +} + +.scrollable-content, ::-webkit-scrollbar-thumb { + background: rgba(90, 90, 90, 0.6) !important; +} From 93f16eb929c632817508d89ed24e88b210d51b90 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 4 Oct 2018 15:09:42 -0500 Subject: [PATCH 26/27] Layout changes --- electron.js | 2 +- src/App.js | 4 +- src/components/MountItem/MountItem.css | 7 -- src/components/MountItem/MountItem.js | 112 ++++++++++++++--------- src/components/UI/Button/Button.css | 5 +- src/components/UI/DropDown/DropDown.css | 13 +++ src/components/UI/Grid/Grid.js | 63 +++++++------ src/containers/MountItems/MountItems.css | 1 + src/hoc/RootElem/RootElem.js | 9 ++ src/index.css | 4 +- 10 files changed, 132 insertions(+), 88 deletions(-) create mode 100644 src/hoc/RootElem/RootElem.js diff --git a/electron.js b/electron.js index fdee93f..1cbcd7b 100644 --- a/electron.js +++ b/electron.js @@ -21,7 +21,7 @@ let mountedPIDs = []; function createWindow() { // Create the browser window. - const height = process.env.ELECTRON_START_URL ? 344 : 324; + const height = process.env.ELECTRON_START_URL ? 324 : 304; mainWindow = new BrowserWindow({ width: 425, height: height, diff --git a/src/App.js b/src/App.js index 286adac..fe29cf7 100644 --- a/src/App.js +++ b/src/App.js @@ -634,7 +634,7 @@ class App extends Component { let key = 0; mainContent.push((
+ style={{height: '44%'}}> + style={{height: '56%'}}> { let configButton = null; + let secondRow = 6; if (props.allowConfig) { configButton = ( - + + + ); } + let inputColumnSpan; let inputControl = null; - let mountWidth = '70%'; if (props.platform === 'win32') { + inputColumnSpan = 20; inputControl = ; - mountWidth = '18%'; + } else { - inputControl = ; + inputColumnSpan = 60; + inputControl = ( + + + ); } - let actionDisplay = null; - if (props.allowMount) { - actionDisplay = ; - } else { - actionDisplay = ; - } + const buttonDisplay = props.allowMount ? + (props.mounted ? 'Unmount' : 'Mount') : + ; + + const actionsDisplay = ( + ); + + const autoMountControl = ( + + Auto-mount + + ); return ( -
-
{configButton}

{props.title}

- - - - - - - - -
{inputControl} - - {actionDisplay} - - Auto-mount -
-
+ + {configButton} + + {inputControl} + {actionsDisplay} + {autoMountControl} + ); }, styles, {allowMultiple: true}); \ No newline at end of file diff --git a/src/components/UI/Button/Button.css b/src/components/UI/Button/Button.css index cb0bdc2..9aa5877 100644 --- a/src/components/UI/Button/Button.css +++ b/src/components/UI/Button/Button.css @@ -1,7 +1,6 @@ .Button { display: block; text-align: center; - margin: 0; padding: 4px; outline: 0; color: var(--text_color); @@ -10,8 +9,10 @@ border: none; text-decoration: none; text-outline: none; + vertical-align: center; height: 100%; width: 100%; + overflow: hidden; } .Button:hover:enabled { @@ -21,7 +22,7 @@ } .Button:hover:disabled { - cursor: default; + cursor: no-drop; } .Button:active, diff --git a/src/components/UI/DropDown/DropDown.css b/src/components/UI/DropDown/DropDown.css index 187a3f5..fcc23c7 100644 --- a/src/components/UI/DropDown/DropDown.css +++ b/src/components/UI/DropDown/DropDown.css @@ -23,4 +23,17 @@ background: rgba(10, 10, 15, 0.8); border-color: rgba(10, 10, 20, 0.9); color: var(--text_color); +} + +.Select:hover:enabled { + cursor: pointer; +} + +.Select:hover:disabled { + cursor: no-drop; +} + +.Select:active, +.Select.active { + cursor: pointer; } \ No newline at end of file diff --git a/src/components/UI/Grid/Grid.js b/src/components/UI/Grid/Grid.js index 8df6a23..ad92a61 100644 --- a/src/components/UI/Grid/Grid.js +++ b/src/components/UI/Grid/Grid.js @@ -66,36 +66,41 @@ export default CSSModules(class extends Component { const dimensions = this.state.dimensions; if (this.state.calculated) { children = React.Children.map(this.props.children, (child, i) => { - let row = child.props.row || 0; - if (typeof(row) === 'function') { - row = row(dimensions); + if (child) { + let row = child.props.row || 0; + if (typeof(row) === 'function') { + row = row(dimensions); + } + + let col = child.props.col || 0; + if (typeof(col) === 'function') { + col = col(dimensions); + } + + let rowSpan = child.props.rowSpan; + if (typeof(rowSpan) === 'function') { + rowSpan = rowSpan(dimensions.rows - row, dimensions.rows); + } + + let colSpan = child.props.colSpan; + if (typeof(colSpan) === 'function') { + colSpan = colSpan(dimensions.columns - col, dimensions.columns); + } + + rowSpan = rowSpan ? (rowSpan === 'remain' ? (dimensions.rows - row) : rowSpan) : null; + colSpan = colSpan ? (colSpan === 'remain' ? dimensions.columns - col : colSpan) : null; + + return {child}; + } else { + return null; } - - let col = child.props.col || 0; - if (typeof(col) === 'function') { - col = col(dimensions); - } - - let rowSpan = child.props.rowSpan; - if (typeof(rowSpan) === 'function') { - rowSpan = rowSpan(dimensions.rows - row, dimensions.rows); - } - - let colSpan = child.props.colSpan; - if (typeof(colSpan) === 'function') { - colSpan = colSpan(dimensions.columns - col, dimensions.columns); - } - - rowSpan = rowSpan ? (rowSpan === 'remain' ? (dimensions.rows - row) : rowSpan) : null; - colSpan = colSpan ? (colSpan === 'remain' ? dimensions.columns - col : colSpan) : null; - - return {child}; - }); + }) + .filter(i => i !== null); } const style = { diff --git a/src/containers/MountItems/MountItems.css b/src/containers/MountItems/MountItems.css index bbbdc81..d9fbcb3 100644 --- a/src/containers/MountItems/MountItems.css +++ b/src/containers/MountItems/MountItems.css @@ -1,5 +1,6 @@ .MountItems { padding: 0; + margin: 0; width: 100%; box-sizing: border-box; } \ No newline at end of file diff --git a/src/hoc/RootElem/RootElem.js b/src/hoc/RootElem/RootElem.js new file mode 100644 index 0000000..a40dcf7 --- /dev/null +++ b/src/hoc/RootElem/RootElem.js @@ -0,0 +1,9 @@ +import React from 'react'; + +export default (props) => { + return ( +
+ {props.children} +
+ ) +}; \ No newline at end of file diff --git a/src/index.css b/src/index.css index 0b69062..9a4c0ce 100644 --- a/src/index.css +++ b/src/index.css @@ -2,7 +2,7 @@ --border_radius: 4px; --control_background: rgba(150, 150, 190, .15); - --control_background_hover: rgba(150, 150, 190, .3); + --control_background_hover: rgba(150, 150, 190, .35); --control_border: 1px solid rgba(70, 70, 70, 0.9); --control_box_shadow: 1px 1px 1px black; --control_transparent_background: rgba(40, 40, 55, 0.45); @@ -11,7 +11,7 @@ --text_color: rgba(200, 205, 220, 0.7); --text_color_hover: rgba(200, 205, 220, 0.7); --text_color_error: rgba(203, 120, 120, 0.8); - --heading_text_color: rgba(166, 177, 219, 0.7); + --heading_text_color: rgba(161, 190, 219, 0.7); --heading_other_text_color: var(--heading_text_color); --text_color_transition: color 0.3s; } From d6e82e03b4c2ddd3a021822ef0c91b950b632004 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 4 Oct 2018 15:14:54 -0500 Subject: [PATCH 27/27] Update releases --- releases.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/releases.json b/releases.json index e8f7485..b7563ef 100644 --- a/releases.json +++ b/releases.json @@ -3,7 +3,9 @@ "win32": { "1.0.1": { "hash": "", - "urls": [] + "urls": [ + "https://sia.pixeldrain.com/api/file/Alo1IF1u/download" + ] }, "1.0.0": { "hash": "",