summaryrefslogtreecommitdiffhomepage
path: root/gui/src
diff options
context:
space:
mode:
authorOskar Nyberg <oskar@mullvad.net>2022-07-25 11:56:02 +0200
committerOskar Nyberg <oskar@mullvad.net>2022-07-25 11:56:02 +0200
commit51176121fa7770fd4c7fea3e515221f9e81976f4 (patch)
treecb99df85127cf94434042d0c4ef0c41f62ba18a2 /gui/src
parentd7d89095619d0bc66c2abc8e382c44969ab57bdf (diff)
parent8679035f7ee27eefc685e6955f76737d750e9a98 (diff)
downloadmullvadvpn-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.tsx48
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')}
+ />
</>
);
}