import * as React from 'react'; import { sprintf } from 'sprintf-js'; import { strings } from '../../config.json'; import { TunnelProtocol } from '../../shared/daemon-rpc-types'; import { messages } from '../../shared/gettext'; import { StyledNavigationScrollbars, StyledSelectorForFooter, StyledTunnelProtocolContainer, } from './AdvancedSettingsStyles'; import * as AppButton from './AppButton'; import { AriaDescription, AriaInput, AriaInputGroup, AriaLabel } from './AriaGroup'; import * as Cell from './cell'; import { ISelectorItem } from './cell/Selector'; import CustomDnsSettings from './CustomDnsSettings'; import { BackAction } from './KeyboardNavigation'; import { Layout, SettingsContainer } from './Layout'; import { ModalAlert, ModalAlertType, ModalMessage } from './Modal'; import { NavigationBar, NavigationContainer, NavigationItems, TitleBarItem } from './NavigationBar'; import SettingsHeader, { HeaderTitle } from './SettingsHeader'; import Switch from './Switch'; type OptionalTunnelProtocol = TunnelProtocol | undefined; interface IProps { enableIpv6: boolean; blockWhenDisconnected: boolean; tunnelProtocol?: TunnelProtocol; setEnableIpv6: (value: boolean) => void; setBlockWhenDisconnected: (value: boolean) => void; setTunnelProtocol: (value: OptionalTunnelProtocol) => void; onViewWireguardSettings: () => void; onViewOpenVpnSettings: () => void; onViewSplitTunneling: () => void; onClose: () => void; } interface IState { showConfirmBlockWhenDisconnectedAlert: boolean; } export default class AdvancedSettings extends React.Component { public state = { showConfirmBlockWhenDisconnectedAlert: false, }; private blockWhenDisconnectedRef = React.createRef(); private tunnelProtocolItems: Array>; public constructor(props: IProps) { super(props); this.tunnelProtocolItems = [ { label: messages.gettext('Automatic'), value: undefined, }, { label: strings.wireguard, value: 'wireguard', }, { label: strings.openvpn, value: 'openvpn', }, ]; } public render() { return ( { // TRANSLATORS: Title label in navigation bar messages.pgettext('advanced-settings-nav', 'Advanced') } {messages.pgettext('advanced-settings-view', 'Advanced')} {messages.pgettext('advanced-settings-view', 'Enable IPv6')} {messages.pgettext( 'advanced-settings-view', 'Enable IPv6 communication through the tunnel.', )} {messages.pgettext('advanced-settings-view', 'Always require VPN')} {messages.pgettext( 'advanced-settings-view', 'If you disconnect or quit the app, this setting will block your internet.', )} {(window.env.platform === 'linux' || window.env.platform === 'win32') && ( {strings.splitTunneling} )} {sprintf( // TRANSLATORS: %(wireguard)s will be replaced with the string "WireGuard" messages.pgettext('advanced-settings-view', '%(wireguard)s settings'), { wireguard: strings.wireguard }, )} {sprintf( // TRANSLATORS: %(openvpn)s will be replaced with the string "OpenVPN" messages.pgettext('advanced-settings-view', '%(openvpn)s settings'), { openvpn: strings.openvpn }, )} {this.renderConfirmBlockWhenDisconnectedAlert()} ); } private renderConfirmBlockWhenDisconnectedAlert = () => { return ( {messages.gettext('Enable anyway')} , {messages.gettext('Back')} , ]} close={this.hideConfirmBlockWhenDisconnectedAlert}> {messages.pgettext( 'advanced-settings-view', 'Attention: enabling this will always require a Mullvad VPN connection in order to reach the internet.', )} {messages.pgettext( 'advanced-settings-view', 'The app’s built-in kill switch is always on. This setting will additionally block the internet if clicking Disconnect or Quit.', )} ); }; private setBlockWhenDisconnected = (newValue: boolean) => { if (newValue) { this.setState({ showConfirmBlockWhenDisconnectedAlert: true }); } else { this.props.setBlockWhenDisconnected(false); } }; private hideConfirmBlockWhenDisconnectedAlert = () => { this.setState({ showConfirmBlockWhenDisconnectedAlert: false }); }; private confirmEnableBlockWhenDisconnected = () => { this.setState({ showConfirmBlockWhenDisconnectedAlert: false }); this.props.setBlockWhenDisconnected(true); }; private onSelectTunnelProtocol = (protocol?: TunnelProtocol) => { this.props.setTunnelProtocol(protocol); }; }