diff options
| author | Oskar Nyberg <oskar@mullvad.net> | 2021-03-03 11:18:47 +0100 |
|---|---|---|
| committer | Oskar Nyberg <oskar@mullvad.net> | 2021-03-03 11:18:47 +0100 |
| commit | 51f65df92aa311f934ce0d642dd5fa6a0cf934e5 (patch) | |
| tree | 2ba685f3d459dd0bd84bfd1e468724df9d22935b /gui/src/renderer/components | |
| parent | 8bb44773424a1139dc7e72a804899ea877b9ff3e (diff) | |
| parent | 8f48eb4bc95a1439644936214c849573234fe7a7 (diff) | |
| download | mullvadvpn-51f65df92aa311f934ce0d642dd5fa6a0cf934e5.tar.xz mullvadvpn-51f65df92aa311f934ce0d642dd5fa6a0cf934e5.zip | |
Merge branch 'improve-linux-split-tunnel'
Diffstat (limited to 'gui/src/renderer/components')
| -rw-r--r-- | gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx b/gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx index 3c07e7eca0..cb7c497011 100644 --- a/gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx +++ b/gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx @@ -107,9 +107,20 @@ export default function LinuxSplitTunnelingSettings() { const [applications, setApplications] = useState<ILinuxSplitTunnelingApplication[]>(); const [applicationListHeight, setApplicationListHeight] = useState<number>(); const [browsing, setBrowsing] = useState(false); + const [browseError, setBrowseError] = useState<string>(); const applicationListRef = useRef() as React.RefObject<HTMLDivElement>; + const launchApplication = useCallback( + async (application: ILinuxSplitTunnelingApplication | string) => { + const result = await launchExcludedApplication(application); + if ('error' in result) { + setBrowseError(result.error); + } + }, + [], + ); + const launchWithFilePicker = useCallback(async () => { setBrowsing(true); const file = await showOpenDialog({ @@ -119,10 +130,12 @@ export default function LinuxSplitTunnelingSettings() { setBrowsing(false); if (file.filePaths[0]) { - launchExcludedApplication(file.filePaths[0]); + await launchApplication(file.filePaths[0]); } }, []); + const hideBrowseFailureDialog = useCallback(() => setBrowseError(undefined), []); + useEffect(() => { consumePromise(getSplitTunnelingApplications().then(setApplications)); }, []); @@ -181,7 +194,7 @@ export default function LinuxSplitTunnelingSettings() { <ApplicationRow key={application.absolutepath} application={application} - launchApplication={launchExcludedApplication} + launchApplication={launchApplication} /> )) )} @@ -196,6 +209,26 @@ export default function LinuxSplitTunnelingSettings() { </NavigationContainer> </StyledContainer> </Layout> + {browseError && ( + <ModalAlert + type={ModalAlertType.warning} + iconColor={colors.red} + message={sprintf( + // TRANSLATORS: Error message showed in a dialog when an application failes to launch. + messages.pgettext( + 'split-tunneling-view', + 'Unable to launch selection. %(detailedErrorMessage)s', + ), + { detailedErrorMessage: browseError }, + )} + buttons={[ + <AppButton.BlueButton key="close" onClick={hideBrowseFailureDialog}> + {messages.gettext('Close')} + </AppButton.BlueButton>, + ]} + close={hideBrowseFailureDialog} + /> + )} </ModalContainer> </> ); |
