@seams/wallet 0.10.2 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/THIRD_PARTY_NOTICES.md +33 -1812
- package/dist/.build-inputs.sha256 +1 -1
- package/dist/esm/SeamsWeb/operations/recovery/walletRecoveryCodeBackup.js +100 -0
- package/dist/esm/SeamsWeb/walletIframe/host/ui/auth-menu/AuthMenuSurface.js +127 -71
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/RecoveryCodeBackupSurface.js +558 -0
- package/dist/esm/core/signingEngine/uiConfirm/ui/preact/mountRecoveryCodeBackupSurface.js +82 -0
- package/dist/esm/core/types/sdkSentEvents.js +9 -0
- package/dist/esm/react/components/AccountMenuButton/AccountMenuButtonMock.js +189 -0
- package/dist/esm/react/components/AccountMenuButton/AccountMenuButtonView.js +137 -0
- package/dist/esm/react/components/AccountMenuButton/AccountMenuDeviceDetails.js +39 -0
- package/dist/esm/react/components/AccountMenuButton/AccountMenuDialog.js +39 -13
- package/dist/esm/react/components/AccountMenuButton/AccountMenuMockScreens.js +247 -0
- package/dist/esm/react/components/AccountMenuButton/AccountMenuScreen.js +41 -0
- package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodRow.js +79 -0
- package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodsModal.js +168 -174
- package/dist/esm/react/components/AccountMenuButton/AuthenticationMethodsView.js +19 -0
- package/dist/esm/react/components/AccountMenuButton/ExportKeysScreen.js +30 -0
- package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.css +148 -87
- package/dist/esm/react/components/AccountMenuButton/LinkedDevicesModal.js +26 -5
- package/dist/esm/react/components/AccountMenuButton/MenuItem.js +28 -13
- package/dist/esm/react/components/AccountMenuButton/ProfileDropdown.css +73 -69
- package/dist/esm/react/components/AccountMenuButton/ProfileDropdown.js +56 -68
- package/dist/esm/react/components/AccountMenuButton/RecoveryCodeAcknowledgement.js +27 -0
- package/dist/esm/react/components/AccountMenuButton/RecoveryCodeActions.js +53 -0
- package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.css +3 -1
- package/dist/esm/react/components/AccountMenuButton/TransactionSettingsSection.js +2 -8
- package/dist/esm/react/components/AccountMenuButton/UserAccountButton.css +1 -1
- package/dist/esm/react/components/AccountMenuButton/UserAccountButton.js +6 -3
- package/dist/esm/react/components/AccountMenuButton/WalletRegionSection.js +4 -4
- package/dist/esm/react/components/AccountMenuButton/Web3AuthProfileButton.css +443 -12
- package/dist/esm/react/components/AccountMenuButton/hooks/useProfileState.js +1 -1
- package/dist/esm/react/components/AccountMenuButton/icons/LayersIcon.js +8 -0
- package/dist/esm/react/components/AccountMenuButton/icons/LockKeyholeIcon.js +22 -0
- package/dist/esm/react/components/AccountMenuButton/icons/PlusIcon.js +8 -0
- package/dist/esm/react/components/AccountMenuButton/icons/SunIcon.js +2 -2
- package/dist/esm/react/components/AccountMenuButton/icons/TouchIcon.css +0 -8
- package/dist/esm/react/components/AccountMenuButton/index.js +135 -115
- package/dist/esm/react/components/QRCodeScanner.js +64 -40
- package/dist/esm/react/components/QRCodeScannerCamera.js +16 -0
- package/dist/esm/react/components/ShowQRCode.js +2 -2
- package/dist/esm/react/externalEvm.js +2 -2
- package/dist/esm/react/index.js +2 -1
- package/dist/esm/react/styles/styles.css +520 -91
- package/dist/esm/react/transactionReview/TransactionReviewHost.js +3 -3
- package/dist/esm/sdk/{adapters-DYPu0nK9.js → adapters-CGvNLOfZ.js} +1 -1
- package/dist/{public/sdk/display-DjoWrSgE.js → esm/sdk/display-DTbGoX4e.js} +1 -1
- package/dist/{public/sdk/exportKeypairOperation-DYCzCbqL.js → esm/sdk/exportKeypairOperation-BHXMSA3v.js} +1 -1
- package/dist/{public/sdk/host-D5b19B_h.js → esm/sdk/host-Bqmmy8Ts.js} +1 -1
- package/dist/esm/sdk/{localOnly-KvZeKkH5.js → localOnly-CUVRoMy2.js} +1 -1
- package/dist/esm/sdk/{mountRecoveryCodeBackupSurface-BA2ttbTM.js → mountRecoveryCodeBackupSurface-D1G-iCPI.js} +2 -2
- package/dist/esm/sdk/{pendingWalletRecoveryCodeBackup-BkIrbd6Q.js → pendingWalletRecoveryCodeBackup-CMCOUuA-.js} +1 -1
- package/dist/esm/sdk/{recovery-entrypoint-DoXswV9I.js → recovery-entrypoint-QxTiyx-o.js} +1 -1
- package/dist/esm/sdk/{registration-BFHEYmgh.js → registration-Drtkzrlc.js} +1 -1
- package/dist/esm/sdk/registration-eyzHqLHi.js +1 -0
- package/dist/esm/sdk/{requireStepUpAuth-C67sluoC.js → requireStepUpAuth-FqZSU021.js} +1 -1
- package/dist/esm/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/esm/sdk/runtime-auth-CbveTM2_.js +1 -0
- package/dist/esm/sdk/{runtime-device-link-pf-a_-3u.js → runtime-device-link-CHsqrEQ9.js} +1 -1
- package/dist/esm/sdk/{runtime-ecdsa-tempo-Ddnuti6f.js → runtime-ecdsa-tempo-MgmnU9g-.js} +1 -1
- package/dist/esm/sdk/{runtime-email-otp-BAG8ZC1J.js → runtime-email-otp-Cj96n102.js} +1 -1
- package/dist/esm/sdk/{runtime-export-DxL99xfn.js → runtime-export-mcwZRxKk.js} +1 -1
- package/dist/esm/sdk/{runtime-near-BrWP4IxC.js → runtime-near-BMdTtu7D.js} +1 -1
- package/dist/esm/sdk/{runtime-preferences-BjVdHYL0.js → runtime-preferences-CBlhE8bX.js} +1 -1
- package/dist/esm/sdk/{runtime-recovery-codes-Dn-NccpU.js → runtime-recovery-codes-B1gixZsp.js} +1 -1
- package/dist/esm/sdk/{runtime-recovery-BNd_GX5q.js → runtime-recovery-mJp3MLeG.js} +1 -1
- package/dist/esm/sdk/sdkSentEvents-Dl8fOL50.js +1 -0
- package/dist/esm/sdk/shared-8Qe7Nxgg.js +6 -0
- package/dist/{public/sdk/signEvmFamily-DjD3tn8e.js → esm/sdk/signEvmFamily-M0trbeZe.js} +1 -1
- package/dist/esm/sdk/{signEvmFamilyWithUiConfirmForTempo-CwRFbaLM.js → signEvmFamilyWithUiConfirmForTempo-Bo25SwuV.js} +1 -1
- package/dist/esm/sdk/{signEvmWithUiConfirm-BHG0dwVG.js → signEvmWithUiConfirm-CFcqJRj3.js} +1 -1
- package/dist/{public/sdk/signNear-D0tlQXb9.js → esm/sdk/signNear-DGUQZ44s.js} +1 -1
- package/dist/esm/sdk/{signingFlow-Mym5j6aw.js → signingFlow-DZvV4AgG.js} +1 -1
- package/dist/esm/sdk/{transaction-activity-Cb2JyYKv.js → transaction-activity-xfeHKJoq.js} +1 -1
- package/dist/esm/sdk/wallet-iframe-host-ecdsa.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-full.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-near.js +1 -1
- package/dist/esm/sdk/wallet-iframe-host-runtime.js +1 -1
- package/dist/esm/sdk/wallet-ui.css +1 -1
- package/dist/{public/sdk/walletCustodyEcdsaContinuity-B8aO2NFb.js → esm/sdk/walletCustodyEcdsaContinuity-_IKoCUBO.js} +1 -1
- package/dist/{public/sdk/walletRecoveryCommit-C3EgMjo-.js → esm/sdk/walletRecoveryCommit-DDPa1rAJ.js} +1 -1
- package/dist/esm/wasm/near_signer/pkg/wasm_signer_worker_bg.wasm +0 -0
- package/dist/esm/wasm/router_ab_ecdsa_client/pkg/router_ab_ecdsa_client_bg.wasm +0 -0
- package/dist/esm/wasm/router_ab_ed25519_yao_client/pkg/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/headers.manifest.json +1 -1
- package/dist/public/sdk/{adapters-DYPu0nK9.js → adapters-CGvNLOfZ.js} +1 -1
- package/dist/{esm/sdk/display-DjoWrSgE.js → public/sdk/display-DTbGoX4e.js} +1 -1
- package/dist/{esm/sdk/exportKeypairOperation-DYCzCbqL.js → public/sdk/exportKeypairOperation-BHXMSA3v.js} +1 -1
- package/dist/{esm/sdk/host-D5b19B_h.js → public/sdk/host-Bqmmy8Ts.js} +1 -1
- package/dist/public/sdk/{localOnly-KvZeKkH5.js → localOnly-CUVRoMy2.js} +1 -1
- package/dist/public/sdk/{mountRecoveryCodeBackupSurface-BA2ttbTM.js → mountRecoveryCodeBackupSurface-D1G-iCPI.js} +2 -2
- package/dist/public/sdk/{pendingWalletRecoveryCodeBackup-BkIrbd6Q.js → pendingWalletRecoveryCodeBackup-CMCOUuA-.js} +1 -1
- package/dist/public/sdk/{recovery-entrypoint-DoXswV9I.js → recovery-entrypoint-QxTiyx-o.js} +1 -1
- package/dist/public/sdk/{registration-BFHEYmgh.js → registration-Drtkzrlc.js} +1 -1
- package/dist/public/sdk/registration-eyzHqLHi.js +1 -0
- package/dist/public/sdk/{requireStepUpAuth-C67sluoC.js → requireStepUpAuth-FqZSU021.js} +1 -1
- package/dist/public/sdk/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/sdk/runtime-auth-CbveTM2_.js +1 -0
- package/dist/public/sdk/{runtime-device-link-pf-a_-3u.js → runtime-device-link-CHsqrEQ9.js} +1 -1
- package/dist/public/sdk/{runtime-ecdsa-tempo-Ddnuti6f.js → runtime-ecdsa-tempo-MgmnU9g-.js} +1 -1
- package/dist/public/sdk/{runtime-email-otp-BAG8ZC1J.js → runtime-email-otp-Cj96n102.js} +1 -1
- package/dist/public/sdk/{runtime-export-DxL99xfn.js → runtime-export-mcwZRxKk.js} +1 -1
- package/dist/public/sdk/{runtime-near-BrWP4IxC.js → runtime-near-BMdTtu7D.js} +1 -1
- package/dist/public/sdk/{runtime-preferences-BjVdHYL0.js → runtime-preferences-CBlhE8bX.js} +1 -1
- package/dist/public/sdk/{runtime-recovery-codes-Dn-NccpU.js → runtime-recovery-codes-B1gixZsp.js} +1 -1
- package/dist/public/sdk/{runtime-recovery-BNd_GX5q.js → runtime-recovery-mJp3MLeG.js} +1 -1
- package/dist/public/sdk/sdkSentEvents-Dl8fOL50.js +1 -0
- package/dist/public/sdk/shared-8Qe7Nxgg.js +6 -0
- package/dist/{esm/sdk/signEvmFamily-DjD3tn8e.js → public/sdk/signEvmFamily-M0trbeZe.js} +1 -1
- package/dist/public/sdk/{signEvmFamilyWithUiConfirmForTempo-CwRFbaLM.js → signEvmFamilyWithUiConfirmForTempo-Bo25SwuV.js} +1 -1
- package/dist/public/sdk/{signEvmWithUiConfirm-BHG0dwVG.js → signEvmWithUiConfirm-CFcqJRj3.js} +1 -1
- package/dist/{esm/sdk/signNear-D0tlQXb9.js → public/sdk/signNear-DGUQZ44s.js} +1 -1
- package/dist/public/sdk/{signingFlow-Mym5j6aw.js → signingFlow-DZvV4AgG.js} +1 -1
- package/dist/public/sdk/{transaction-activity-Cb2JyYKv.js → transaction-activity-xfeHKJoq.js} +1 -1
- package/dist/public/sdk/wallet-iframe-host-ecdsa.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-full.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-near.js +1 -1
- package/dist/public/sdk/wallet-iframe-host-runtime.js +1 -1
- package/dist/public/sdk/wallet-ui.css +1 -1
- package/dist/{esm/sdk/walletCustodyEcdsaContinuity-B8aO2NFb.js → public/sdk/walletCustodyEcdsaContinuity-_IKoCUBO.js} +1 -1
- package/dist/{esm/sdk/walletRecoveryCommit-C3EgMjo-.js → public/sdk/walletRecoveryCommit-DDPa1rAJ.js} +1 -1
- package/dist/public/sdk/workers/email_otp_runtime_bg.wasm +0 -0
- package/dist/public/sdk/workers/evm_crypto_bg.wasm +0 -0
- package/dist/public/sdk/workers/router_ab_ecdsa_client_bg.wasm +0 -0
- package/dist/public/sdk/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/public/sdk/workers/shamir3pass_runtime_bg.wasm +0 -0
- package/dist/public/sdk/workers/tempo_signer_bg.wasm +0 -0
- package/dist/public/sdk/workers/wallet_custody_ceremony_bg.wasm +0 -0
- package/dist/public/sdk/workers/wasm_signer_worker_bg.wasm +0 -0
- package/dist/public/wallet-assets.manifest.json +62 -62
- package/dist/public/wallet-service/index.html +4 -4
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/domain.d.ts +4 -0
- package/dist/types/wallet/src/SeamsWeb/walletIframe/host/auth-menu/session.d.ts +4 -2
- package/dist/types/wallet/src/core/types/sdkSentEvents.d.ts +4 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuButtonMock.d.ts +17 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuButtonView.d.ts +17 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuDeviceDetails.d.ts +13 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuDialog.d.ts +1 -1
- package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuMockScreens.d.ts +43 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/AccountMenuScreen.d.ts +9 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodRow.d.ts +14 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodsModal.d.ts +1 -1
- package/dist/types/wallet/src/react/components/AccountMenuButton/AuthenticationMethodsView.d.ts +8 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/ExportKeysScreen.d.ts +7 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/LinkedDevicesModal.d.ts +1 -1
- package/dist/types/wallet/src/react/components/AccountMenuButton/ProfileDropdown.d.ts +2 -14
- package/dist/types/wallet/src/react/components/AccountMenuButton/RecoveryCodeAcknowledgement.d.ts +5 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/RecoveryCodeActions.d.ts +5 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/icons/LayersIcon.d.ts +2 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/icons/LockKeyholeIcon.d.ts +2 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/icons/PlusIcon.d.ts +2 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/index.d.ts +2 -0
- package/dist/types/wallet/src/react/components/AccountMenuButton/types.d.ts +1 -14
- package/dist/types/wallet/src/react/components/QRCodeScanner.d.ts +1 -0
- package/dist/types/wallet/src/react/components/QRCodeScannerCamera.d.ts +5 -0
- package/dist/types/wallet/src/react/index.d.ts +2 -1
- package/dist/workers/email_otp_runtime_bg.wasm +0 -0
- package/dist/workers/evm_crypto_bg.wasm +0 -0
- package/dist/workers/router_ab_ecdsa_client_bg.wasm +0 -0
- package/dist/workers/router_ab_ed25519_yao_client_bg.wasm +0 -0
- package/dist/workers/shamir3pass_runtime_bg.wasm +0 -0
- package/dist/workers/tempo_signer_bg.wasm +0 -0
- package/dist/workers/wallet_custody_ceremony_bg.wasm +0 -0
- package/dist/workers/wasm_signer_worker_bg.wasm +0 -0
- package/package.json +1 -1
- package/dist/esm/sdk/registration-Cx_f58rb.js +0 -1
- package/dist/esm/sdk/runtime-auth-CKUleRYA.js +0 -1
- package/dist/esm/sdk/sdkSentEvents-DiQ3YVlj.js +0 -1
- package/dist/esm/sdk/shared-CSfgTVcf.js +0 -6
- package/dist/public/sdk/registration-Cx_f58rb.js +0 -1
- package/dist/public/sdk/runtime-auth-CKUleRYA.js +0 -1
- package/dist/public/sdk/sdkSentEvents-DiQ3YVlj.js +0 -1
- package/dist/public/sdk/shared-CSfgTVcf.js +0 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
6d2e6b22efe3f00372c471ea3e8fa79ef5f85a847e71a1b1fffffb303b5d669f
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createWalletIframeSurfaceMeasurementReporter } from "../../walletIframe/host/surface-measurement-reporter.js";
|
|
2
|
+
//#region src/SeamsWeb/operations/recovery/walletRecoveryCodeBackup.ts
|
|
3
|
+
const CANCELLED_MESSAGE = "Recovery-code backup was cancelled before acknowledgement";
|
|
4
|
+
/**
|
|
5
|
+
* Shows the recovery-code backup dialog and resolves with the user's
|
|
6
|
+
* acknowledgement. This wrapper owns the promise contract: an acknowledged
|
|
7
|
+
* close resolves as backed-up, an unacknowledged close defers during
|
|
8
|
+
* registration and cancels from the account menu, and Escape always cancels.
|
|
9
|
+
*/
|
|
10
|
+
async function showRecoveryCodeExperience(experience, measurementBinding = { kind: "disabled" }, options = {}) {
|
|
11
|
+
if (typeof document === "undefined") throw new Error("Wallet recovery-code backup requires a browser or a backup handler");
|
|
12
|
+
const previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
13
|
+
if (options.shouldCancel?.()) throw new Error(CANCELLED_MESSAGE);
|
|
14
|
+
const surfaceModule = await import("../../../core/signingEngine/uiConfirm/ui/preact/mountRecoveryCodeBackupSurface.js");
|
|
15
|
+
if (options.shouldCancel?.()) throw new Error(CANCELLED_MESSAGE);
|
|
16
|
+
let measurementReporter = null;
|
|
17
|
+
let surface = null;
|
|
18
|
+
let settled = false;
|
|
19
|
+
return await new Promise((resolve, reject) => {
|
|
20
|
+
const cleanup = () => {
|
|
21
|
+
measurementReporter?.disconnect();
|
|
22
|
+
measurementReporter = null;
|
|
23
|
+
surface?.dispose();
|
|
24
|
+
surface = null;
|
|
25
|
+
previousFocus?.focus();
|
|
26
|
+
};
|
|
27
|
+
const settle = (result) => {
|
|
28
|
+
if (settled) return;
|
|
29
|
+
settled = true;
|
|
30
|
+
cleanup();
|
|
31
|
+
if (result instanceof Error) reject(result);
|
|
32
|
+
else resolve(result);
|
|
33
|
+
};
|
|
34
|
+
const handleClose = (detail) => {
|
|
35
|
+
switch (detail.kind) {
|
|
36
|
+
case "dismissed":
|
|
37
|
+
settle(new Error(CANCELLED_MESSAGE));
|
|
38
|
+
return;
|
|
39
|
+
case "recovery_codes":
|
|
40
|
+
if (detail.acknowledged) {
|
|
41
|
+
settle({ kind: "wallet_recovery_codes_backed_up_v1" });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (experience.kind === "direct_backup" && experience.request.continuation === "registration_may_defer") {
|
|
45
|
+
settle({ kind: "wallet_recovery_code_backup_deferred_v1" });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
settle(new Error(CANCELLED_MESSAGE));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
try {
|
|
53
|
+
surface = surfaceModule.mountRecoveryCodeBackupSurface({
|
|
54
|
+
parent: document.body,
|
|
55
|
+
appearance: options.appearance,
|
|
56
|
+
experience,
|
|
57
|
+
surface: measurementBinding.kind === "wallet_iframe" ? "wallet-iframe" : "standalone",
|
|
58
|
+
onClose: handleClose,
|
|
59
|
+
onCancel: () => settle(new Error(CANCELLED_MESSAGE)),
|
|
60
|
+
onShown: (dialog) => {
|
|
61
|
+
if (settled || measurementBinding.kind !== "wallet_iframe") return;
|
|
62
|
+
measurementReporter = createWalletIframeSurfaceMeasurementReporter({
|
|
63
|
+
kind: "request_scroll_surface",
|
|
64
|
+
requestId: measurementBinding.requestId,
|
|
65
|
+
element: dialog,
|
|
66
|
+
postMeasurement: postRecoveryMeasurement.bind(null, dialog, measurementBinding.postMeasurement)
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
} catch (error) {
|
|
71
|
+
settle(error instanceof Error ? error : new Error(String(error)));
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async function showWalletRecoveryCodeBackupUi(request, measurementBinding = { kind: "disabled" }) {
|
|
76
|
+
return await showRecoveryCodeExperience({
|
|
77
|
+
kind: "direct_backup",
|
|
78
|
+
request
|
|
79
|
+
}, measurementBinding);
|
|
80
|
+
}
|
|
81
|
+
async function showWalletRecoveryCodesUi(request, measurementBinding = { kind: "disabled" }, options = {}) {
|
|
82
|
+
return await showRecoveryCodeExperience({
|
|
83
|
+
kind: "account_menu",
|
|
84
|
+
...request
|
|
85
|
+
}, measurementBinding, options);
|
|
86
|
+
}
|
|
87
|
+
function postRecoveryMeasurement(dialog, postMeasurement, measurement) {
|
|
88
|
+
if (measurement.kind !== "measured_v1") throw new Error("Recovery codes require a request surface measurement");
|
|
89
|
+
postMeasurement({
|
|
90
|
+
kind: "measured_v1",
|
|
91
|
+
requestId: measurement.requestId,
|
|
92
|
+
sequence: measurement.sequence,
|
|
93
|
+
widthCssPx: dialog.dataset.seamsRecoveryStage === "recovery_codes" ? 688 : 480,
|
|
94
|
+
heightCssPx: measurement.heightCssPx
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
export { showWalletRecoveryCodeBackupUi, showWalletRecoveryCodesUi };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=walletRecoveryCodeBackup.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isLinkedDeviceTargetEmailAddressV1 } from "../../../../../core/types/linkDevice.js";
|
|
2
|
+
import "../../../../../shared-ts/src/wallet-recovery/recoveryCodes.js";
|
|
2
3
|
import { demoEmailOtpCodeFromDelivery } from "../../../../../core/signingEngine/session/emailOtp/challengeDelivery.js";
|
|
3
4
|
import { isAuthMenuActionReady, isAuthMenuGoogleActionReady, isAuthMenuLoadingStatus, isAuthMenuReady, resolveAuthMenuLoginAccount } from "../../auth-menu/domain.js";
|
|
4
5
|
import { PadlockIcon } from "../../../../../core/signingEngine/uiConfirm/ui/preact/PadlockIcon.js";
|
|
@@ -19,8 +20,22 @@ function renderDemoEmailCode(delivery) {
|
|
|
19
20
|
}
|
|
20
21
|
const AUTH_MENU_TITLE_ID = "seams-auth-menu-title";
|
|
21
22
|
const AUTH_MENU_ACCOUNT_LIST_ID = "seams-auth-menu-account-list";
|
|
22
|
-
function otpCodeDigits(code) {
|
|
23
|
-
return code.padEnd(
|
|
23
|
+
function otpCodeDigits(code, length = 6) {
|
|
24
|
+
return code.padEnd(length, " ").slice(0, length).split("");
|
|
25
|
+
}
|
|
26
|
+
function recoveryInputCharacters(code) {
|
|
27
|
+
return code.replace(/[\s\-\u2010-\u2015\u2212]/g, "").toUpperCase();
|
|
28
|
+
}
|
|
29
|
+
function recoveryCodeGroups(digits) {
|
|
30
|
+
const groups = [];
|
|
31
|
+
for (let index = 0; index < digits.length; index += 4) groups.push(digits.slice(index, index + 4));
|
|
32
|
+
return groups;
|
|
33
|
+
}
|
|
34
|
+
function renderRecoveryCodeGroup(digits, index) {
|
|
35
|
+
return /* @__PURE__ */ jsx("div", {
|
|
36
|
+
class: "seams-recovery-code-group",
|
|
37
|
+
children: digits.map(renderOtpCodeDigit)
|
|
38
|
+
}, index);
|
|
24
39
|
}
|
|
25
40
|
function renderOtpCodeDigit(digit) {
|
|
26
41
|
return /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("span", {
|
|
@@ -352,9 +367,20 @@ var AuthMenuSurface = class extends Component {
|
|
|
352
367
|
};
|
|
353
368
|
this.onRecoveryCodeInput = (event) => {
|
|
354
369
|
if (!(event.currentTarget instanceof HTMLInputElement)) return;
|
|
370
|
+
const viewModel = this.viewModel;
|
|
371
|
+
if (viewModel.kind !== "recovery") return;
|
|
372
|
+
const input = event.currentTarget;
|
|
373
|
+
const length = viewModel.recoveryCodeSlotCount ?? 32;
|
|
374
|
+
const raw = input.value;
|
|
375
|
+
const caret = recoveryInputCharacters(raw.slice(0, input.selectionStart ?? raw.length)).length;
|
|
376
|
+
const code = recoveryInputCharacters(raw).slice(0, length);
|
|
377
|
+
if (input.value !== code) {
|
|
378
|
+
input.value = code;
|
|
379
|
+
input.setSelectionRange(Math.min(caret, code.length), Math.min(caret, code.length));
|
|
380
|
+
}
|
|
355
381
|
this.emitIntent({
|
|
356
382
|
kind: "recovery_code_changed",
|
|
357
|
-
recoveryCode:
|
|
383
|
+
recoveryCode: code
|
|
358
384
|
});
|
|
359
385
|
};
|
|
360
386
|
this.onRecoverySubmit = (event) => {
|
|
@@ -554,40 +580,51 @@ var AuthMenuSurface = class extends Component {
|
|
|
554
580
|
"aria-busy": loading ? "true" : "false",
|
|
555
581
|
tabIndex: -1,
|
|
556
582
|
onKeyDown: this.onKeydown,
|
|
557
|
-
children: [
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
class: "
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
583
|
+
children: [
|
|
584
|
+
/* @__PURE__ */ jsxs("div", {
|
|
585
|
+
class: "seams-menu-origin",
|
|
586
|
+
children: [
|
|
587
|
+
/* @__PURE__ */ jsx(PadlockIcon, {}),
|
|
588
|
+
" ",
|
|
589
|
+
/* @__PURE__ */ jsx("span", { children: viewModel.hostname })
|
|
590
|
+
]
|
|
591
|
+
}),
|
|
592
|
+
/* @__PURE__ */ jsxs("div", {
|
|
593
|
+
class: "seams-content-switcher",
|
|
594
|
+
children: [
|
|
595
|
+
/* @__PURE__ */ jsx("button", {
|
|
596
|
+
class: `seams-back-button ${loading || linkDevice || otpPrompt || registrationPrompt || recovery ? "is-visible" : ""}`,
|
|
597
|
+
type: "button",
|
|
598
|
+
"aria-label": recovery ? "Back to unlock wallet" : "Back",
|
|
599
|
+
"data-auth-menu-close": true,
|
|
600
|
+
disabled: recoveryNavigationLocked(viewModel),
|
|
601
|
+
onClick: this.onBackClick,
|
|
602
|
+
children: backIcon()
|
|
603
|
+
}),
|
|
604
|
+
recovery ? /* @__PURE__ */ jsx("div", {
|
|
605
|
+
class: "sr-only",
|
|
606
|
+
role: "status",
|
|
607
|
+
"aria-live": "polite",
|
|
608
|
+
"aria-atomic": "true",
|
|
609
|
+
children: recoveryAnnouncement(viewModel)
|
|
610
|
+
}) : null,
|
|
611
|
+
/* @__PURE__ */ jsx("div", {
|
|
612
|
+
class: "seams-content-area",
|
|
613
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
614
|
+
class: "seams-content-sizer",
|
|
615
|
+
children: loading ? this.renderWaiting(viewModel) : /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("div", {
|
|
616
|
+
class: "seams-signin-menu",
|
|
617
|
+
children: /* @__PURE__ */ jsx(Fragment, { children: this.renderActiveView(viewModel) }, authViewKey(viewModel))
|
|
618
|
+
}) })
|
|
619
|
+
})
|
|
584
620
|
})
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
621
|
+
]
|
|
622
|
+
}),
|
|
623
|
+
/* @__PURE__ */ jsx(AuthMenuFooter, {
|
|
624
|
+
notice: menuNotice(viewModel),
|
|
625
|
+
onRetry: this.onNoticeRetry
|
|
626
|
+
})
|
|
627
|
+
]
|
|
591
628
|
}) });
|
|
592
629
|
}
|
|
593
630
|
renderActiveView(viewModel) {
|
|
@@ -610,14 +647,6 @@ var AuthMenuSurface = class extends Component {
|
|
|
610
647
|
return /* @__PURE__ */ jsxs("div", {
|
|
611
648
|
class: "seams-menu-header",
|
|
612
649
|
children: [
|
|
613
|
-
/* @__PURE__ */ jsxs("div", {
|
|
614
|
-
class: "seams-menu-origin",
|
|
615
|
-
children: [
|
|
616
|
-
/* @__PURE__ */ jsx(PadlockIcon, {}),
|
|
617
|
-
" ",
|
|
618
|
-
/* @__PURE__ */ jsx("span", { children: viewModel.hostname })
|
|
619
|
-
]
|
|
620
|
-
}),
|
|
621
650
|
eyebrow === viewModel.heading ? null : /* @__PURE__ */ jsx("div", {
|
|
622
651
|
class: "seams-menu-eyebrow",
|
|
623
652
|
children: eyebrow
|
|
@@ -827,6 +856,9 @@ var AuthMenuSurface = class extends Component {
|
|
|
827
856
|
}
|
|
828
857
|
renderRecovery(viewModel) {
|
|
829
858
|
if (viewModel.stage === "enter_code") {
|
|
859
|
+
const codeLength = viewModel.recoveryCodeSlotCount ?? 32;
|
|
860
|
+
const code = recoveryInputCharacters(viewModel.recoveryCode).slice(0, codeLength);
|
|
861
|
+
const digits = otpCodeDigits(code, codeLength);
|
|
830
862
|
const statusMessage = viewModel.status.kind === "recoverable" ? viewModel.status.message : "";
|
|
831
863
|
const feedbackMessage = viewModel.recoveryCodeError ?? statusMessage;
|
|
832
864
|
const feedbackIsError = feedbackMessage.length > 0;
|
|
@@ -849,20 +881,28 @@ var AuthMenuSurface = class extends Component {
|
|
|
849
881
|
class: "seams-field-label",
|
|
850
882
|
for: "seams-recovery-code",
|
|
851
883
|
children: "Recovery code"
|
|
852
|
-
}), /* @__PURE__ */
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
884
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
885
|
+
class: "seams-otp-code-field seams-recovery-code-field",
|
|
886
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
887
|
+
id: "seams-recovery-code",
|
|
888
|
+
class: "seams-otp-input",
|
|
889
|
+
"data-recovery-code": true,
|
|
890
|
+
name: "recoveryCode",
|
|
891
|
+
type: "text",
|
|
892
|
+
inputmode: codeLength === 16 ? "numeric" : "text",
|
|
893
|
+
autocomplete: "off",
|
|
894
|
+
autocapitalize: "characters",
|
|
895
|
+
autocorrect: "off",
|
|
896
|
+
spellcheck: false,
|
|
897
|
+
"aria-invalid": viewModel.recoveryCodeError ? "true" : "false",
|
|
898
|
+
"aria-describedby": viewModel.recoveryCodeError ? "seams-recovery-code-feedback" : void 0,
|
|
899
|
+
value: code,
|
|
900
|
+
onInput: this.onRecoveryCodeInput
|
|
901
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
902
|
+
class: "seams-otp-slots seams-recovery-code-slots",
|
|
903
|
+
"aria-hidden": "true",
|
|
904
|
+
children: recoveryCodeGroups(digits).map(renderRecoveryCodeGroup)
|
|
905
|
+
})]
|
|
866
906
|
})]
|
|
867
907
|
}), /* @__PURE__ */ jsxs("div", {
|
|
868
908
|
class: "seams-secondary-actions",
|
|
@@ -991,19 +1031,35 @@ var AuthMenuSurface = class extends Component {
|
|
|
991
1031
|
class: "seams-waiting",
|
|
992
1032
|
role: "status",
|
|
993
1033
|
"aria-live": "polite",
|
|
994
|
-
children: [
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1034
|
+
children: [
|
|
1035
|
+
status.illustration === "passkey" ? /* @__PURE__ */ jsx("span", {
|
|
1036
|
+
class: "seams-passkey-prompt",
|
|
1037
|
+
role: "img",
|
|
1038
|
+
"aria-label": "Passkey authentication",
|
|
1039
|
+
children: fingerprintIcon()
|
|
1040
|
+
}) : null,
|
|
1041
|
+
/* @__PURE__ */ jsxs("div", {
|
|
1042
|
+
class: "seams-waiting-message",
|
|
1043
|
+
children: [
|
|
1044
|
+
/* @__PURE__ */ jsx("span", {
|
|
1045
|
+
class: "seams-waiting-text",
|
|
1046
|
+
children: waitingText
|
|
1047
|
+
}),
|
|
1048
|
+
status.illustration === "passkey" ? /* @__PURE__ */ jsx("span", {
|
|
1049
|
+
class: "seams-passkey-instruction",
|
|
1050
|
+
children: "Complete the prompt on your device."
|
|
1051
|
+
}) : null,
|
|
1052
|
+
viewModel.showProgress && status.detail && status.detail !== waitingText ? /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("span", {
|
|
1053
|
+
class: "seams-waiting-sdk-events",
|
|
1054
|
+
children: status.detail
|
|
1055
|
+
}) }) : null
|
|
1056
|
+
]
|
|
1057
|
+
}),
|
|
1058
|
+
status.illustration !== "passkey" ? /* @__PURE__ */ jsx("div", {
|
|
1059
|
+
"aria-label": "Loading",
|
|
1060
|
+
class: "seams-spinner"
|
|
1061
|
+
}) : null
|
|
1062
|
+
]
|
|
1007
1063
|
}) });
|
|
1008
1064
|
}
|
|
1009
1065
|
renderLinkDevice(viewModel) {
|