import { useCallback } from 'react';
import { sprintf } from 'sprintf-js';
import styled from 'styled-components';
import { strings } from '../../config.json';
import { messages } from '../../shared/gettext';
import log from '../../shared/logging';
import { useRelaySettingsUpdater } from '../lib/constraint-updater';
import { useHistory } from '../lib/history';
import { useSelector } from '../redux/store';
import { AriaDescription, AriaInput, AriaInputGroup, AriaLabel } from './AriaGroup';
import * as Cell from './cell';
import { StyledIllustration } from './DaitaSettings';
import { BackAction } from './KeyboardNavigation';
import { Layout, SettingsContainer } from './Layout';
import {
NavigationBar,
NavigationContainer,
NavigationItems,
NavigationScrollbars,
TitleBarItem,
} from './NavigationBar';
import SettingsHeader, { HeaderSubTitle, HeaderTitle } from './SettingsHeader';
const StyledContent = styled.div({
display: 'flex',
flexDirection: 'column',
flex: 1,
marginBottom: '2px',
});
export default function MultihopSettings() {
const { pop } = useHistory();
return (
{messages.pgettext('wireguard-settings-view', 'Multihop')}
{messages.pgettext('wireguard-settings-view', 'Multihop')}
{messages.pgettext(
'wireguard-settings-view',
'Multihop routes your traffic into one WireGuard server and out another, making it harder to trace. This results in increased latency but increases anonymity online.',
)}
);
}
function MultihopSetting() {
const relaySettings = useSelector((state) => state.settings.relaySettings);
const relaySettingsUpdater = useRelaySettingsUpdater();
const multihop = 'normal' in relaySettings ? relaySettings.normal.wireguard.useMultihop : false;
const unavailable =
'normal' in relaySettings ? relaySettings.normal.tunnelProtocol === 'openvpn' : true;
const setMultihop = useCallback(
async (enabled: boolean) => {
try {
await relaySettingsUpdater((settings) => {
settings.wireguardConstraints.useMultihop = enabled;
return settings;
});
} catch (e) {
const error = e as Error;
log.error('Failed to update WireGuard multihop settings', error.message);
}
},
[relaySettingsUpdater],
);
return (
<>
{messages.gettext('Enable')}
{unavailable ? (
{featureUnavailableMessage()}
) : null}
>
);
}
function featureUnavailableMessage() {
const automatic = messages.gettext('Automatic');
const tunnelProtocol = messages.pgettext('vpn-settings-view', 'Tunnel protocol');
const multihop = messages.pgettext('wireguard-settings-view', 'Multihop');
return sprintf(
messages.pgettext(
'wireguard-settings-view',
'Switch to ā%(wireguard)sā or ā%(automatic)sā in Settings > %(tunnelProtocol)s to make %(setting)s available.',
),
{ wireguard: strings.wireguard, automatic, tunnelProtocol, setting: multihop },
);
}