From d52a2f7291ea045424cb4284e9e9645d39846591 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sun, 6 Oct 2019 21:39:14 -0500 Subject: [PATCH] Add remote mount --- src/App.js | 18 +-- .../AddRemoteMount/AddRemoteMount.js | 17 --- .../AddRemoteMount/AddRemoteMount.css | 0 .../AddRemoteMount/AddRemoteMount.js | 111 ++++++++++++++++++ src/containers/Configuration/Configuration.js | 14 ++- src/containers/MountItems/MountItems.js | 2 +- src/redux/actions/mount_actions.js | 37 ++++++ src/redux/reducers/mount_reducer.js | 22 ++++ 8 files changed, 188 insertions(+), 33 deletions(-) delete mode 100644 src/components/AddRemoteMount/AddRemoteMount.js rename src/{components => containers}/AddRemoteMount/AddRemoteMount.css (100%) create mode 100644 src/containers/AddRemoteMount/AddRemoteMount.js diff --git a/src/App.js b/src/App.js index 1a03dcd..056095e 100644 --- a/src/App.js +++ b/src/App.js @@ -162,15 +162,6 @@ class App extends IPCContainer { return (
- {selectAppPlatformDisplay} - {dependencyDisplay} - {upgradeDisplay} - {configDisplay} - {infoDisplay} - {confirmDisplay} - {downloadDisplay} - {rebootDisplay} - {errorDisplay}
@@ -198,6 +189,15 @@ class App extends IPCContainer {
+ {selectAppPlatformDisplay} + {dependencyDisplay} + {upgradeDisplay} + {configDisplay} + {infoDisplay} + {confirmDisplay} + {downloadDisplay} + {rebootDisplay} + {errorDisplay}
); } diff --git a/src/components/AddRemoteMount/AddRemoteMount.js b/src/components/AddRemoteMount/AddRemoteMount.js deleted file mode 100644 index f2329ec..0000000 --- a/src/components/AddRemoteMount/AddRemoteMount.js +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; -import './AddRemoteMount.css'; -import {connect} from 'react-redux'; -import Button from '../UI/Button/Button'; - -const mapDispatchToProps = dispatch => { - return { - } -}; - -export default connect(null, mapDispatchToProps)(props => { - return ( -
- -
- ); -}); \ No newline at end of file diff --git a/src/components/AddRemoteMount/AddRemoteMount.css b/src/containers/AddRemoteMount/AddRemoteMount.css similarity index 100% rename from src/components/AddRemoteMount/AddRemoteMount.css rename to src/containers/AddRemoteMount/AddRemoteMount.css diff --git a/src/containers/AddRemoteMount/AddRemoteMount.js b/src/containers/AddRemoteMount/AddRemoteMount.js new file mode 100644 index 0000000..933c2ae --- /dev/null +++ b/src/containers/AddRemoteMount/AddRemoteMount.js @@ -0,0 +1,111 @@ +import React from 'react'; +import {Component} from 'react'; +import './AddRemoteMount.css'; +import {connect} from 'react-redux'; +import Button from '../../components/UI/Button/Button'; +import Modal from '../../components/UI/Modal/Modal'; +import Box from '../../components/UI/Box/Box'; +import Text from '../../components/UI/Text/Text'; +import {notifyError} from '../../redux/actions/error_actions'; +import {addRemoteMount} from '../../redux/actions/mount_actions'; + +const mapDispatchToProps = dispatch => { + return { + addRemoteMount: (hostNameOrIp, port, token) => dispatch(addRemoteMount(hostNameOrIp, port, token)), + notifyError: (msg, critical, callback) => dispatch(notifyError(msg, critical, callback)), + } +}; + +export default connect(null, mapDispatchToProps)(class extends Component { + state = { + Display: false, + HostNameOrIp: '', + Port: 20000, + Token: '', + }; + + addRemoteMount = () => { + if (this.state.HostNameOrIp.length === 0) { + this.props.notifyError('Hostname or IP cannot be empty.'); + } else { + this.setState({ + Display: false + }, () => { + this.props.addRemoteMount(this.state.HostNameOrIp, this.state.Port, this.state.Token); + this.setState({ + HostNameOrIp: '', + Port: 20000, + Token: '', + }); + }); + } + }; + + createModalConditionally = (condition, jsx, critical) => { + const modalProps = {critical: critical}; + return condition ? ({jsx}) : null; + }; + + handleAddRemoteMount = () => { + this.setState({ + Display: true, + }); + }; + + render() { + const displayAdd = this.createModalConditionally(this.state.Display, ( + +

Add Remote Mount

+ + this.setState({HostNameOrIp: e.target.value.trim()})} + className={'ConfigurationItemInput'} + type={'text'} + value={this.state.HostNameOrIp}/> +
+ + this.setState({Port: e.target.value})} + className={'ConfigurationItemInput'} + type={'number'} + value={this.state.Port}/> +
+ + this.setState({Token: e.target.value})} + className={'ConfigurationItemInput'} + type={'text'} + value={this.state.Token}/> +
+ + + + + + + +
+ + + +
+ + )); + + return ( +
+ {displayAdd} + +
+ ); + } +}); \ No newline at end of file diff --git a/src/containers/Configuration/Configuration.js b/src/containers/Configuration/Configuration.js index 7be2f64..e231565 100644 --- a/src/containers/Configuration/Configuration.js +++ b/src/containers/Configuration/Configuration.js @@ -216,13 +216,15 @@ class Configuration extends IPCContainer { item.remote && this.props.remoteSupported && (item.label !== 'IsRemoteMount')) { - const isRemoteMount = JSON.parse(itemList.find(s=>s.label === 'IsRemoteMount').value); - const enableRemoteMount = JSON.parse(itemList.find(s=>s.label === 'EnableRemoteMount').value); - return (item.label === 'RemoteHostNameOrIp') || (item.label === 'RemotePort') || (item.label === 'RemoteToken') ? + const isRemoteMount = JSON.parse(itemList.find(s => s.label === 'IsRemoteMount').value); + const enableRemoteMount = JSON.parse(itemList.find(s => s.label === 'EnableRemoteMount').value); + return (item.label === 'RemoteHostNameOrIp') ? isRemoteMount : - (item.label === 'EnableRemoteMount') ? - !isRemoteMount : - enableRemoteMount; + (item.label === 'RemotePort') || (item.label === 'RemoteToken') ? + isRemoteMount || enableRemoteMount : + (item.label === 'EnableRemoteMount') ? + !isRemoteMount : + enableRemoteMount; } return false; }; diff --git a/src/containers/MountItems/MountItems.js b/src/containers/MountItems/MountItems.js index eaeb91c..ad56158 100644 --- a/src/containers/MountItems/MountItems.js +++ b/src/containers/MountItems/MountItems.js @@ -1,5 +1,5 @@ import React from 'react'; -import AddRemoteMount from '../../components/AddRemoteMount/AddRemoteMount'; +import AddRemoteMount from '../AddRemoteMount/AddRemoteMount'; import Box from '../../components/UI/Box/Box'; import Button from '../../components/UI/Button/Button'; import {connect} from 'react-redux'; diff --git a/src/redux/actions/mount_actions.js b/src/redux/actions/mount_actions.js index 90b48e6..f7d85a6 100644 --- a/src/redux/actions/mount_actions.js +++ b/src/redux/actions/mount_actions.js @@ -5,6 +5,43 @@ import { confirmYesNo, saveState } from './common_actions'; +import {notifyError} from './error_actions'; + +export const addRemoteMount = (hostNameOrIp, port, token) => { + return (dispatch, getState) => { + const ipcRenderer = getIPCRenderer(); + + const provider = 'Remote' + hostNameOrIp + ':' + port; + dispatch(addRemoteMount2(provider)); + dispatch(setBusy(true)); + + ipcRenderer.once(Constants.IPC_Set_Config_Values_Reply, (_, arg) => { + if (arg.data.Success) { + ipcRenderer.send(Constants.IPC_Detect_Mounts, { + RemoteMounts: getState().mounts.RemoteMounts, + Version: getState().relver.InstalledVersion, + }); + } else { + dispatch(notifyError('Failed to set \'RemoteToken\': ' + arg.data.Error)); + dispatch(setBusy(false)); + } + }); + + ipcRenderer.send(Constants.IPC_Set_Config_Values, { + Items: [ + {Name: 'RemoteMount.RemoteHostNameOrIp', Value: hostNameOrIp}, + {Name: 'RemoteMount.RemoteToken', Value: token}, + {Name: 'RemoteMount.RemotePort', Value: port}, + {Name: 'RemoteMount.IsRemoteMount', Value: 'true'}, + ], + Provider: provider, + Remote: true, + Version: getState().relver.InstalledVersion, + }); + }; +}; + +export const addRemoteMount2 = createAction('mounts/addRemoteMount2'); export const DISPLAY_CONFIGURATION = 'mounts/displayConfiguration'; export const displayConfiguration = (provider, remote) => { diff --git a/src/redux/reducers/mount_reducer.js b/src/redux/reducers/mount_reducer.js index e4e2837..1b6e11e 100644 --- a/src/redux/reducers/mount_reducer.js +++ b/src/redux/reducers/mount_reducer.js @@ -1,6 +1,7 @@ import * as Constants from '../../constants'; import {createReducer} from 'redux-starter-kit'; import { + addRemoteMount2, DISPLAY_CONFIGURATION, removeRemoteMount3, RESET_MOUNTS_STATE, @@ -56,6 +57,27 @@ export const createMountReducer = state => { ProviderState: providerState, RemoteMounts: state.RemoteMounts ? state.RemoteMounts : ['Remotelocalhost:20000'], }, { + [addRemoteMount2]: (state, action) => { + let mountState = {...state.MountState}; + mountState[action.payload] = { + AllowMount: false, + DriveLetters: [], + Mounted: false, + }; + + let providerState = {...state.ProviderState}; + providerState[action.payload] = { + AutoMount: false, + AutoRestart: false, + MountLocation: '', + }; + return { + ...state, + MountState: mountState, + ProviderState: providerState, + RemoteMounts: [...state.RemoteMounts, action.payload], + } + }, [DISPLAY_CONFIGURATION]: (state, action) => { return { ...state,