summaryrefslogtreecommitdiffhomepage
path: root/gui/src/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'gui/src/renderer')
-rw-r--r--gui/src/renderer/app.tsx4
-rw-r--r--gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx33
2 files changed, 25 insertions, 12 deletions
diff --git a/gui/src/renderer/app.tsx b/gui/src/renderer/app.tsx
index 739ac48ffe..4c79cc2192 100644
--- a/gui/src/renderer/app.tsx
+++ b/gui/src/renderer/app.tsx
@@ -20,7 +20,7 @@ import { ILinuxSplitTunnelingApplication } from '../shared/application-types';
import { messages, relayLocations } from '../shared/gettext';
import { IGuiSettingsState, SYSTEM_PREFERRED_LOCALE_KEY } from '../shared/gui-settings-state';
import log, { ConsoleOutput } from '../shared/logging';
-import { IRelayListPair } from '../shared/ipc-schema';
+import { IRelayListPair, LaunchApplicationResult } from '../shared/ipc-schema';
import consumePromise from '../shared/promise';
import History from './lib/history';
import { loadTranslations } from './lib/load-translations';
@@ -421,7 +421,7 @@ export default class AppRenderer {
public launchExcludedApplication(
application: ILinuxSplitTunnelingApplication | string,
- ): Promise<void> {
+ ): Promise<LaunchApplicationResult> {
return IpcRendererEventChannel.splitTunneling.launchApplication(application);
}
diff --git a/gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx b/gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx
index 6a87a73a5a..cb7c497011 100644
--- a/gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx
+++ b/gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx
@@ -107,10 +107,20 @@ export default function LinuxSplitTunnelingSettings() {
const [applications, setApplications] = useState<ILinuxSplitTunnelingApplication[]>();
const [applicationListHeight, setApplicationListHeight] = useState<number>();
const [browsing, setBrowsing] = useState(false);
- const [showBrowseFailureDialog, setShowBrowseFailureDialog] = 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({
@@ -120,15 +130,11 @@ export default function LinuxSplitTunnelingSettings() {
setBrowsing(false);
if (file.filePaths[0]) {
- try {
- await launchExcludedApplication(file.filePaths[0]);
- } catch (e) {
- setShowBrowseFailureDialog(true);
- }
+ await launchApplication(file.filePaths[0]);
}
}, []);
- const hideBrowseFailureDialog = useCallback(() => setShowBrowseFailureDialog(false), []);
+ const hideBrowseFailureDialog = useCallback(() => setBrowseError(undefined), []);
useEffect(() => {
consumePromise(getSplitTunnelingApplications().then(setApplications));
@@ -188,7 +194,7 @@ export default function LinuxSplitTunnelingSettings() {
<ApplicationRow
key={application.absolutepath}
application={application}
- launchApplication={launchExcludedApplication}
+ launchApplication={launchApplication}
/>
))
)}
@@ -203,11 +209,18 @@ export default function LinuxSplitTunnelingSettings() {
</NavigationContainer>
</StyledContainer>
</Layout>
- {showBrowseFailureDialog && (
+ {browseError && (
<ModalAlert
type={ModalAlertType.warning}
iconColor={colors.red}
- message={messages.pgettext('split-tunneling-view', 'Failed to launch application')}
+ 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')}