diff options
| author | Oskar Nyberg <oskar@mullvad.net> | 2022-07-25 11:56:02 +0200 |
|---|---|---|
| committer | Oskar Nyberg <oskar@mullvad.net> | 2022-07-25 11:56:02 +0200 |
| commit | 51176121fa7770fd4c7fea3e515221f9e81976f4 (patch) | |
| tree | cb99df85127cf94434042d0c4ef0c41f62ba18a2 /gui/src | |
| parent | d7d89095619d0bc66c2abc8e382c44969ab57bdf (diff) | |
| parent | 8679035f7ee27eefc685e6955f76737d750e9a98 (diff) | |
| download | mullvadvpn-51176121fa7770fd4c7fea3e515221f9e81976f4.tar.xz mullvadvpn-51176121fa7770fd4c7fea3e515221f9e81976f4.zip | |
Merge branch 'handle-remove-device-error'
Diffstat (limited to 'gui/src')
| -rw-r--r-- | gui/src/renderer/components/TooManyDevices.tsx | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/gui/src/renderer/components/TooManyDevices.tsx b/gui/src/renderer/components/TooManyDevices.tsx index aeed50afd2..f5acffb44c 100644 --- a/gui/src/renderer/components/TooManyDevices.tsx +++ b/gui/src/renderer/components/TooManyDevices.tsx @@ -5,6 +5,7 @@ import styled from 'styled-components'; import { colors } from '../../config.json'; import { IDevice } from '../../shared/daemon-rpc-types'; import { messages } from '../../shared/gettext'; +import log from '../../shared/logging'; import { capitalizeEveryWord } from '../../shared/string-helpers'; import { useAppContext } from '../context'; import { transitions, useHistory } from '../lib/history'; @@ -181,14 +182,41 @@ interface IDeviceProps { } function Device(props: IDeviceProps) { + const { fetchDevices } = useAppContext(); + const accountToken = useSelector((state) => state.account.accountToken)!; const [confirmationVisible, showConfirmation, hideConfirmation] = useBoolean(false); - const [deleting, setDeleting] = useBoolean(false); + const [deleting, setDeleting, unsetDeleting] = useBoolean(false); + const [error, setError, resetError] = useBoolean(false); + + const handleError = useCallback( + async (error: Error) => { + log.error(`Failede to remove device: ${error.message}`); + + let devices: Array<IDevice> | undefined = undefined; + try { + devices = await fetchDevices(accountToken); + } catch { + /* no-op */ + } + + if (devices === undefined || devices.find((device) => device.id === props.device.id)) { + hideConfirmation(); + unsetDeleting(); + setError(); + } + }, + [fetchDevices, accountToken, hideConfirmation, setError], + ); const onRemove = useCallback(async () => { - await props.onRemove(props.device.id); - hideConfirmation(); setDeleting(); - }, [props.onRemove, props.device.id, hideConfirmation, setDeleting]); + try { + await props.onRemove(props.device.id); + hideConfirmation(); + } catch (e) { + await handleError(e as Error); + } + }, [props.onRemove, props.device.id, hideConfirmation, setDeleting, handleError]); const capitalizedDeviceName = capitalizeEveryWord(props.device.name); @@ -262,6 +290,18 @@ function Device(props: IDeviceProps) { </> )} </ModalAlert> + <ModalAlert + isOpen={error} + type={ModalAlertType.warning} + iconColor={colors.red} + buttons={[ + <AppButton.BlueButton key="close" onClick={resetError}> + {messages.gettext('Close')} + </AppButton.BlueButton>, + ]} + close={resetError} + message={messages.pgettext('device-management', 'Failed to remove device')} + /> </> ); } |
