diff options
Diffstat (limited to 'gui/src/renderer/lib')
| -rw-r--r-- | gui/src/renderer/lib/constraint-updater.ts | 111 |
1 files changed, 82 insertions, 29 deletions
diff --git a/gui/src/renderer/lib/constraint-updater.ts b/gui/src/renderer/lib/constraint-updater.ts index 3ebbcccbc0..054f063465 100644 --- a/gui/src/renderer/lib/constraint-updater.ts +++ b/gui/src/renderer/lib/constraint-updater.ts @@ -1,36 +1,89 @@ -import RelaySettingsBuilder from '../../shared/relay-settings-builder'; -import { RelaySettingsRedux } from '../redux/settings/reducers'; +import { useCallback } from 'react'; -export function createWireguardRelayUpdater( - relaySettings: RelaySettingsRedux, -): ReturnType<typeof RelaySettingsBuilder['normal']> { - if ('normal' in relaySettings) { - const constraints = relaySettings.normal.wireguard; +import { + IOpenVpnConstraints, + IRelaySettingsNormal, + IWireguardConstraints, + Ownership, + wrapConstraint, +} from '../../shared/daemon-rpc-types'; +import { useAppContext } from '../context'; +import { NormalRelaySettingsRedux } from '../redux/settings/reducers'; +import { useNormalRelaySettings } from './utilityHooks'; - const relayUpdate = RelaySettingsBuilder.normal().tunnel.wireguard((wireguard) => { - if (constraints.port === 'any') { - wireguard.port.any(); - } else { - wireguard.port.exact(constraints.port); - } +export function wrapRelaySettingsOrDefault( + relaySettings?: NormalRelaySettingsRedux, +): IRelaySettingsNormal<IOpenVpnConstraints, IWireguardConstraints> { + if (relaySettings) { + const openvpnPort = wrapConstraint(relaySettings.openvpn.port); + const openvpnProtocol = wrapConstraint(relaySettings.openvpn.protocol); + const wgPort = wrapConstraint(relaySettings.wireguard.port); + const wgIpVersion = wrapConstraint(relaySettings.wireguard.ipVersion); + const wgEntryLocation = wrapConstraint(relaySettings.wireguard.entryLocation); + const location = wrapConstraint(relaySettings.location); + const tunnelProtocol = wrapConstraint(relaySettings.tunnelProtocol); - if (constraints.ipVersion === 'any') { - wireguard.ipVersion.any(); - } else { - wireguard.ipVersion.exact(constraints.ipVersion); - } + return { + providers: [...relaySettings.providers], + ownership: relaySettings.ownership, + tunnelProtocol, + openvpnConstraints: { + port: openvpnPort, + protocol: openvpnProtocol, + }, + wireguardConstraints: { + port: wgPort, + ipVersion: wgIpVersion, + useMultihop: relaySettings.wireguard.useMultihop, + entryLocation: wgEntryLocation, + }, + location, + }; + } + + return { + location: 'any', + tunnelProtocol: 'any', + providers: [], + ownership: Ownership.any, + openvpnConstraints: { + port: 'any', + protocol: 'any', + }, + wireguardConstraints: { + port: 'any', + ipVersion: 'any', + useMultihop: false, + entryLocation: 'any', + }, + }; +} - wireguard.useMultihop(constraints.useMultihop); +type UpdateFunction = ( + settings: IRelaySettingsNormal<IOpenVpnConstraints, IWireguardConstraints>, +) => IRelaySettingsNormal<IOpenVpnConstraints, IWireguardConstraints>; - if (constraints.entryLocation === 'any') { - wireguard.entryLocation.any(); - } else if (constraints.entryLocation !== undefined) { - wireguard.entryLocation.exact(constraints.entryLocation); - } - }); +export function useRelaySettingsModifier() { + const relaySettings = useNormalRelaySettings(); - return relayUpdate; - } else { - return RelaySettingsBuilder.normal(); - } + return useCallback( + (fn: UpdateFunction) => { + const settings = wrapRelaySettingsOrDefault(relaySettings); + return fn(settings); + }, + [relaySettings], + ); +} + +export function useRelaySettingsUpdater() { + const { setRelaySettings } = useAppContext(); + const modifyRelaySettings = useRelaySettingsModifier(); + + return useCallback( + async (fn: UpdateFunction) => { + const modifiedSettings = modifyRelaySettings(fn); + await setRelaySettings({ normal: modifiedSettings }); + }, + [setRelaySettings, modifyRelaySettings], + ); } |
