diff options
Diffstat (limited to 'gui/src/renderer')
| -rw-r--r-- | gui/src/renderer/app.tsx | 4 | ||||
| -rw-r--r-- | gui/src/renderer/components/LinuxSplitTunnelingSettings.tsx | 33 |
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')} |
