Skip to content

Commit 16933a1

Browse files
authored
Split access method confirmation from adding an access method (dfinity#3205)
* Split access method confirmation from adding an access method. * Split access method confirmation from adding an access method. * Split access method confirmation from adding an access method. * Split access method confirmation from adding an access method. * Add missing aria-label * Fix filename * Close modal when other device has been registered.
1 parent fbe4720 commit 16933a1

10 files changed

Lines changed: 225 additions & 320 deletions

src/frontend/src/lib/components/views/AddAccessMethodDialog.svelte

Lines changed: 0 additions & 167 deletions
This file was deleted.

src/frontend/src/lib/components/wizards/addAccessMethod/AddAccessMethodWizard.svelte

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,12 @@
44
import SystemOverlayBackdrop from "$lib/components/utils/SystemOverlayBackdrop.svelte";
55
import { AddAccessMethodFlow } from "$lib/flows/addAccessMethodFlow.svelte.js";
66
import type {
7-
AuthnMethodConfirmationError,
87
AuthnMethodData,
98
OpenIdCredential,
109
} from "$lib/generated/internet_identity_types";
11-
import AuthorizeNewDevice from "$lib/components/wizards/addAccessMethod/views/AuthorizeNewDevice.svelte";
12-
import ContinueOnAnotherDevice from "$lib/components/wizards/addAccessMethod/views/ContinueOnAnotherDevice.svelte";
13-
import ContinueOnNewDevice from "$lib/components/wizards/addAccessMethod/views/ContinueOnNewDevice.svelte";
1410
import AddAccessMethod from "$lib/components/wizards/addAccessMethod/views/AddAccessMethod.svelte";
1511
import AddPasskey from "$lib/components/wizards/addAccessMethod/views/AddPasskey.svelte";
16-
import { isCanisterError } from "$lib/utils/utils";
17-
import { nonNullish } from "@dfinity/utils";
12+
import { ConfirmAccessMethodWizard } from "$lib/components/wizards/confirmAccessMethod";
1813
1914
interface Props {
2015
onGoogleLinked: (credential: OpenIdCredential) => void;
@@ -43,6 +38,8 @@
4338
isMaxOpenIdCredentialsReached,
4439
});
4540
41+
let isContinueOnAnotherDeviceVisible = $state(false);
42+
4643
const handleContinueWithGoogle = async () => {
4744
try {
4845
onGoogleLinked(await addAccessMethodFlow.linkGoogleAccount());
@@ -59,49 +56,29 @@
5956
onError(error);
6057
}
6158
};
62-
const handleConfirmDevice = async (confirmationCode: string) => {
63-
try {
64-
await addAccessMethodFlow.confirmDevice(confirmationCode);
65-
onOtherDeviceRegistered();
66-
onClose();
67-
} catch (error) {
68-
if (
69-
isCanisterError<AuthnMethodConfirmationError>(error) &&
70-
error.type === "WrongCode"
71-
) {
72-
// Handle this error in child view instead
73-
throw error;
74-
}
75-
onError(error);
76-
}
77-
};
78-
const handleClose = () => {
79-
addAccessMethodFlow.exitRegistrationMode();
59+
const handleOtherDeviceRegistered = async () => {
60+
onOtherDeviceRegistered();
8061
onClose();
8162
};
8263
</script>
8364

84-
<Dialog onClose={handleClose}>
85-
{#if addAccessMethodFlow.view === "chooseMethod"}
65+
<Dialog {onClose}>
66+
{#if isContinueOnAnotherDeviceVisible}
67+
<ConfirmAccessMethodWizard
68+
onConfirm={handleOtherDeviceRegistered}
69+
{onError}
70+
/>
71+
{:else if addAccessMethodFlow.view === "chooseMethod"}
8672
<AddAccessMethod
8773
continueWithPasskey={addAccessMethodFlow.continueWithPasskey}
8874
linkGoogleAccount={handleContinueWithGoogle}
8975
/>
9076
{:else if addAccessMethodFlow.view === "addPasskey"}
9177
<AddPasskey
9278
createPasskey={handleCreatePasskey}
93-
continueOnAnotherDevice={addAccessMethodFlow.continueOnAnotherDevice}
79+
continueOnAnotherDevice={() => (isContinueOnAnotherDeviceVisible = true)}
9480
{isUsingPasskeys}
9581
/>
96-
{:else if addAccessMethodFlow.view === "continueOnAnotherDevice" && nonNullish(addAccessMethodFlow.newDeviceLink)}
97-
<ContinueOnAnotherDevice url={addAccessMethodFlow.newDeviceLink} />
98-
{:else if addAccessMethodFlow.view === "confirmationCode"}
99-
<AuthorizeNewDevice
100-
confirm={handleConfirmDevice}
101-
restart={addAccessMethodFlow.continueOnAnotherDevice}
102-
/>
103-
{:else if addAccessMethodFlow.view === "continueOnNewDevice"}
104-
<ContinueOnNewDevice />
10582
{/if}
10683

10784
<!-- Rendered within dialog to be on top of it -->
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<script lang="ts">
2+
import { onMount } from "svelte";
3+
import WaitingForNewDevice from "$lib/components/wizards/confirmAccessMethod/views/WaitingForNewDevice.svelte";
4+
import { isCanisterError } from "$lib/utils/utils";
5+
import type { AuthnMethodConfirmationError } from "$lib/generated/internet_identity_types";
6+
import ContinueOnNewDevice from "$lib/components/wizards/confirmAccessMethod/views/ContinueOnNewDevice.svelte";
7+
import EnterConfirmationCode from "$lib/components/wizards/confirmAccessMethod/views/EnterConfirmationCode.svelte";
8+
import FinishOnNewDevice from "$lib/components/wizards/confirmAccessMethod/views/FinishOnNewDevice.svelte";
9+
import { ConfirmAccessMethodFlow } from "$lib/flows/confirmAccessMethodFlow.svelte";
10+
11+
interface Props {
12+
registrationId?: string;
13+
onConfirm: () => void;
14+
onError: (error: unknown) => void;
15+
}
16+
17+
const { registrationId, onConfirm, onError }: Props = $props();
18+
19+
const confirmAccessMethodFlow = new ConfirmAccessMethodFlow();
20+
21+
const handleEnterRegistrationMode = async () => {
22+
try {
23+
await confirmAccessMethodFlow.enterRegistrationMode(registrationId);
24+
} catch (error) {
25+
onError(error);
26+
}
27+
};
28+
const handleConfirmDevice = async (confirmationCode: string) => {
29+
try {
30+
await confirmAccessMethodFlow.confirmDevice(confirmationCode);
31+
onConfirm();
32+
} catch (error) {
33+
if (
34+
isCanisterError<AuthnMethodConfirmationError>(error) &&
35+
error.type === "WrongCode"
36+
) {
37+
// Handle this error in child view instead
38+
throw error;
39+
}
40+
onError(error);
41+
}
42+
};
43+
44+
onMount(() => {
45+
void handleEnterRegistrationMode();
46+
return () => void confirmAccessMethodFlow.exitRegistrationMode();
47+
});
48+
</script>
49+
50+
{#if confirmAccessMethodFlow.view === "continueOnNewDevice"}
51+
{#if confirmAccessMethodFlow.newDeviceLink}
52+
<ContinueOnNewDevice url={confirmAccessMethodFlow.newDeviceLink} />
53+
{:else}
54+
<WaitingForNewDevice />
55+
{/if}
56+
{:else if confirmAccessMethodFlow.view === "enterConfirmationCode"}
57+
<EnterConfirmationCode
58+
confirm={handleConfirmDevice}
59+
restart={handleEnterRegistrationMode}
60+
/>
61+
{:else if confirmAccessMethodFlow.view === "finishOnNewDevice"}
62+
<FinishOnNewDevice />
63+
{/if}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as ConfirmAccessMethodWizard } from "./ConfirmAccessMethodWizard.svelte";

src/frontend/src/lib/components/wizards/addAccessMethod/views/ContinueOnAnotherDevice.svelte renamed to src/frontend/src/lib/components/wizards/confirmAccessMethod/views/ContinueOnNewDevice.svelte

File renamed without changes.

src/frontend/src/lib/components/wizards/addAccessMethod/views/AuthorizeNewDevice.svelte renamed to src/frontend/src/lib/components/wizards/confirmAccessMethod/views/EnterConfirmationCode.svelte

File renamed without changes.

src/frontend/src/lib/components/wizards/addAccessMethod/views/ContinueOnNewDevice.svelte renamed to src/frontend/src/lib/components/wizards/confirmAccessMethod/views/FinishOnNewDevice.svelte

File renamed without changes.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script lang="ts">
2+
import ProgressRing from "$lib/components/ui/ProgressRing.svelte";
3+
</script>
4+
5+
<div class="flex flex-col">
6+
<div class="flex h-40 items-center justify-center">
7+
<ProgressRing class="text-fg-primary size-14" />
8+
</div>
9+
<h1 class="text-text-primary mb-3 text-2xl font-medium sm:text-center">
10+
Waiting for your new device
11+
</h1>
12+
<p class="text-md text-text-tertiary font-medium text-balance sm:text-center">
13+
The <b class="text-text-primary">new device</b> is preparing to continue.
14+
</p>
15+
</div>

0 commit comments

Comments
 (0)