diff options
| -rw-r--r-- | CHANGELOG.md | 3 | ||||
| -rw-r--r-- | gui/packages/desktop/src/main/gui-settings.js | 11 | ||||
| -rw-r--r-- | gui/packages/desktop/src/main/index.js | 4 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/app.js | 30 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/components/Preferences.js | 14 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/containers/PreferencesPage.js | 6 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/redux/settings/reducers.js | 3 | ||||
| -rw-r--r-- | gui/packages/desktop/src/shared/gui-settings-state.js | 1 | ||||
| -rw-r--r-- | gui/packages/desktop/src/shared/ipc-event-channel.js | 5 |
9 files changed, 58 insertions, 19 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e9d2afc13..c5183fae9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,9 @@ Line wrap the file at 100 chars. Th ### Changed - Disable buttons and menus that open external links when the app knows that there is no internet connection. +- The auto-start and auto-connect toggles in the GUI have been reworked so that auto-connect + configures the GUI to automatically connect when it starts and so that it will only auto-connect + on boot when both settings are set. ### Fixed - Stop GUI from glitching during the short reconnect state. diff --git a/gui/packages/desktop/src/main/gui-settings.js b/gui/packages/desktop/src/main/gui-settings.js index b5e1ad2e8c..a6a6efd30b 100644 --- a/gui/packages/desktop/src/main/gui-settings.js +++ b/gui/packages/desktop/src/main/gui-settings.js @@ -9,6 +9,7 @@ import type { GuiSettingsState } from '../shared/gui-settings-state'; export default class GuiSettings { _state: GuiSettingsState = { + autoConnect: true, monochromaticIcon: false, startMinimized: false, }; @@ -21,6 +22,8 @@ export default class GuiSettings { const contents = fs.readFileSync(settingsFile, 'utf8'); const settings = JSON.parse(contents); + this._state.autoConnect = + typeof settings.autoConnect === 'boolean' ? settings.autoConnect : true; this._state.monochromaticIcon = settings.monochromaticIcon || false; this._state.startMinimized = settings.startMinimized || false; } catch (error) { @@ -42,6 +45,14 @@ export default class GuiSettings { return this._state; } + set autoConnect(newValue: boolean) { + this._changeStateAndNotify({ ...this._state, autoConnect: newValue }); + } + + get autoConnect(): boolean { + return this._state.autoConnect; + } + set monochromaticIcon(newValue: boolean) { this._changeStateAndNotify({ ...this._state, monochromaticIcon: newValue }); } diff --git a/gui/packages/desktop/src/main/index.js b/gui/packages/desktop/src/main/index.js index 5da25f39de..683ec5db55 100644 --- a/gui/packages/desktop/src/main/index.js +++ b/gui/packages/desktop/src/main/index.js @@ -760,6 +760,10 @@ const ApplicationMain = { guiSettings: this._guiSettings.state, })); + IpcMainEventChannel.guiSettings.handleAutoConnect((autoConnect: boolean) => { + this._guiSettings.autoConnect = autoConnect; + }); + IpcMainEventChannel.guiSettings.handleStartMinimized((startMinimized: boolean) => { this._guiSettings.startMinimized = startMinimized; }); diff --git a/gui/packages/desktop/src/renderer/app.js b/gui/packages/desktop/src/renderer/app.js index 793b0a9224..7235a6a836 100644 --- a/gui/packages/desktop/src/renderer/app.js +++ b/gui/packages/desktop/src/renderer/app.js @@ -14,6 +14,7 @@ import { createMemoryHistory } from 'history'; import { InvalidAccountError } from '../main/errors'; import makeRoutes from './routes'; +import { getOpenAtLogin, setOpenAtLogin } from './lib/autostart'; import configureStore from './redux/store'; import accountActions from './redux/account/actions'; @@ -343,10 +344,28 @@ export default class AppRenderer { async setAutoConnect(autoConnect: boolean) { const actions = this._reduxActions; - await this._daemonRpc.setAutoConnect(autoConnect); + await IpcRendererEventChannel.guiSettings.setAutoConnect(autoConnect); + await this._setDaemonAutoConnect(autoConnect, getOpenAtLogin()); actions.settings.updateAutoConnect(autoConnect); } + _getAutoConnect(): boolean { + return this._reduxStore.getState().settings.guiSettings.autoConnect; + } + + async setAutoStart(autoStart: boolean) { + await setOpenAtLogin(autoStart); + await this._setDaemonAutoConnect(this._getAutoConnect(), autoStart); + } + + async _setDaemonAutoConnect(guiAutoConnect: boolean, autoStart: boolean) { + const daemonAutoConnect = guiAutoConnect && autoStart; + + if (daemonAutoConnect !== this._settings.autoConnect) { + await this._daemonRpc.setAutoConnect(daemonAutoConnect); + } + } + setStartMinimized(startMinimized: boolean) { IpcRendererEventChannel.guiSettings.setStartMinimized(startMinimized); } @@ -435,15 +454,17 @@ export default class AppRenderer { const accountToken = this._settings.accountToken; if (accountToken) { - if (process.env.NODE_ENV !== 'development') { + if (process.env.NODE_ENV === 'development') { + log.debug('Skip autoconnect in development'); + } else if (!this._getAutoConnect()) { + log.debug('Skip autoconnect because GUI setting is disabled'); + } else { try { log.debug('Autoconnect the tunnel'); await this.connectTunnel(); } catch (error) { log.error(`Failed to autoconnect the tunnel: ${error.message}`); } - } else { - log.debug('Skip autoconnect in development'); } } else { log.debug('Skip autoconnect because account token is not set'); @@ -490,7 +511,6 @@ export default class AppRenderer { const reduxSettings = this._reduxActions.settings; reduxSettings.updateAllowLan(newSettings.allowLan); - reduxSettings.updateAutoConnect(newSettings.autoConnect); reduxSettings.updateEnableIpv6(newSettings.tunnelOptions.enableIpv6); reduxSettings.updateBlockWhenDisconnected(newSettings.blockWhenDisconnected); reduxSettings.updateOpenVpnMssfix(newSettings.tunnelOptions.openvpn.mssfix); diff --git a/gui/packages/desktop/src/renderer/components/Preferences.js b/gui/packages/desktop/src/renderer/components/Preferences.js index 53ed912798..19ae96f338 100644 --- a/gui/packages/desktop/src/renderer/components/Preferences.js +++ b/gui/packages/desktop/src/renderer/components/Preferences.js @@ -64,20 +64,16 @@ export default class Preferences extends Component<PreferencesProps, State> { <View style={styles.preferences__content}> <Cell.Container> - <Cell.Label>Auto-connect</Cell.Label> - <Switch isOn={this.props.autoConnect} onChange={this.props.setAutoConnect} /> + <Cell.Label>Launch app on start-up</Cell.Label> + <Switch isOn={this.state.autoStart} onChange={this._onChangeAutoStart} /> </Cell.Container> - <Cell.Footer> - Automatically connect to the VPN at the earliest moment during computer - boot-up. - </Cell.Footer> <Cell.Container> - <Cell.Label>Auto-launch</Cell.Label> - <Switch isOn={this.state.autoStart} onChange={this._onChangeAutoStart} /> + <Cell.Label>Auto-connect</Cell.Label> + <Switch isOn={this.props.autoConnect} onChange={this.props.setAutoConnect} /> </Cell.Container> <Cell.Footer> - Automatically launch the app when logging in to the computer. + Automatically connect to a server when the app launches. </Cell.Footer> <Cell.Container> diff --git a/gui/packages/desktop/src/renderer/containers/PreferencesPage.js b/gui/packages/desktop/src/renderer/containers/PreferencesPage.js index a64381aa86..565160c528 100644 --- a/gui/packages/desktop/src/renderer/containers/PreferencesPage.js +++ b/gui/packages/desktop/src/renderer/containers/PreferencesPage.js @@ -5,13 +5,13 @@ import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { goBack } from 'connected-react-router'; import Preferences from '../components/Preferences'; -import { getOpenAtLogin, setOpenAtLogin } from '../lib/autostart'; +import { getOpenAtLogin } from '../lib/autostart'; import type { ReduxState, ReduxDispatch } from '../redux/store'; import type { SharedRouteProps } from '../routes'; const mapStateToProps = (state: ReduxState) => ({ - autoConnect: state.settings.autoConnect, + autoConnect: state.settings.guiSettings.autoConnect, allowLan: state.settings.allowLan, monochromaticIcon: state.settings.guiSettings.monochromaticIcon, startMinimized: state.settings.guiSettings.startMinimized, @@ -28,7 +28,7 @@ const mapDispatchToProps = (dispatch: ReduxDispatch, props: SharedRouteProps) => }, setAutoStart: async (autoStart) => { try { - await setOpenAtLogin(autoStart); + await props.app.setAutoStart(autoStart); } catch (error) { log.error(`Cannot set auto-start: ${error.message}`); } diff --git a/gui/packages/desktop/src/renderer/redux/settings/reducers.js b/gui/packages/desktop/src/renderer/redux/settings/reducers.js index 99795c41ba..7f5d1c42ef 100644 --- a/gui/packages/desktop/src/renderer/redux/settings/reducers.js +++ b/gui/packages/desktop/src/renderer/redux/settings/reducers.js @@ -48,7 +48,6 @@ export type SettingsReduxState = { guiSettings: GuiSettingsState, relaySettings: RelaySettingsRedux, relayLocations: Array<RelayLocationRedux>, - autoConnect: boolean, allowLan: boolean, enableIpv6: boolean, blockWhenDisconnected: boolean, @@ -59,6 +58,7 @@ export type SettingsReduxState = { const initialState: SettingsReduxState = { guiSettings: { + autoConnect: true, monochromaticIcon: false, startMinimized: false, }, @@ -70,7 +70,6 @@ const initialState: SettingsReduxState = { }, }, relayLocations: [], - autoConnect: false, allowLan: false, enableIpv6: true, blockWhenDisconnected: false, diff --git a/gui/packages/desktop/src/shared/gui-settings-state.js b/gui/packages/desktop/src/shared/gui-settings-state.js index 4a7ccb572e..336e019d1d 100644 --- a/gui/packages/desktop/src/shared/gui-settings-state.js +++ b/gui/packages/desktop/src/shared/gui-settings-state.js @@ -1,6 +1,7 @@ // @flow export type GuiSettingsState = { + autoConnect: boolean, monochromaticIcon: boolean, startMinimized: boolean, }; diff --git a/gui/packages/desktop/src/shared/ipc-event-channel.js b/gui/packages/desktop/src/shared/ipc-event-channel.js index 06c5f9620e..d54009dfdb 100644 --- a/gui/packages/desktop/src/shared/ipc-event-channel.js +++ b/gui/packages/desktop/src/shared/ipc-event-channel.js @@ -35,11 +35,13 @@ interface Receiver<T> { } interface GuiSettingsMethods { + setAutoConnect: (boolean) => void; setStartMinimized: (boolean) => void; setMonochromaticIcon: (boolean) => void; } interface GuiSettingsHandlers { + handleAutoConnect: ((boolean) => void) => void; handleStartMinimized: ((boolean) => void) => void; handleMonochromaticIcon: ((boolean) => void) => void; } @@ -66,6 +68,7 @@ const CURRENT_VERSION_CHANGED = 'current-version-changed'; const UPGRADE_VERSION_CHANGED = 'upgrade-version-changed'; const GUI_SETTINGS_CHANGED = 'gui-settings-changed'; +const SET_AUTO_CONNECT = 'set-auto-connect'; const SET_MONOCHROMATIC_ICON = 'set-monochromatic-icon'; const SET_START_MINIMIZED = 'set-start-minimized'; const GET_APP_STATE = 'get-app-state'; @@ -119,6 +122,7 @@ export class IpcRendererEventChannel { static guiSettings: Receiver<GuiSettingsState> & GuiSettingsMethods = { listen: listen(GUI_SETTINGS_CHANGED), + setAutoConnect: set(SET_AUTO_CONNECT), setMonochromaticIcon: set(SET_MONOCHROMATIC_ICON), setStartMinimized: set(SET_START_MINIMIZED), }; @@ -172,6 +176,7 @@ export class IpcMainEventChannel { static guiSettings: Sender<GuiSettingsState> & GuiSettingsHandlers = { notify: sender(GUI_SETTINGS_CHANGED), + handleAutoConnect: handler(SET_AUTO_CONNECT), handleMonochromaticIcon: handler(SET_MONOCHROMATIC_ICON), handleStartMinimized: handler(SET_START_MINIMIZED), }; |
