summaryrefslogtreecommitdiffhomepage
path: root/gui/src/renderer/components
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2021-03-03 11:18:47 +0100
committerOskar Nyberg <oskar@mullvad.net>2021-03-03 11:18:47 +0100
commit51f65df92aa311f934ce0d642dd5fa6a0cf934e5 (patch)
tree2ba685f3d459dd0bd84bfd1e468724df9d22935b /gui/src/renderer/components
parent8bb44773424a1139dc7e72a804899ea877b9ff3e (diff)
parent8f48eb4bc95a1439644936214c849573234fe7a7 (diff)
downloadmullvadvpn-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.tsx37
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>
</>
);