@swype-org/react-sdk 0.1.232 → 0.1.237
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/dist/index.cjs +144 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +144 -40
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2024,7 +2024,6 @@ function resolvePhase(state) {
|
|
|
2024
2024
|
if (p.step === "token-picker" || p.step === "one-tap-setup" || p.step === "select-source" || p.step === "confirm-sign" || p.step === "guest-token-picker") {
|
|
2025
2025
|
return p;
|
|
2026
2026
|
}
|
|
2027
|
-
if (p.step === "wallet-setup") return p;
|
|
2028
2027
|
if (state.mobileFlow && state.deeplinkUri) {
|
|
2029
2028
|
return {
|
|
2030
2029
|
step: "wallet-setup",
|
|
@@ -2032,7 +2031,19 @@ function resolvePhase(state) {
|
|
|
2032
2031
|
accountId: null
|
|
2033
2032
|
};
|
|
2034
2033
|
}
|
|
2035
|
-
if (
|
|
2034
|
+
if (p.step === "wallet-setup" && p.mobile == null) {
|
|
2035
|
+
return p;
|
|
2036
|
+
}
|
|
2037
|
+
if (state.isGuestFlow && state.selectedProviderId != null && !state.transfer) {
|
|
2038
|
+
return { step: "guest-token-picker" };
|
|
2039
|
+
}
|
|
2040
|
+
if (p.step === "wallet-picker" && !state.creatingTransfer && !(state.mobileFlow && state.deeplinkUri)) {
|
|
2041
|
+
return p;
|
|
2042
|
+
}
|
|
2043
|
+
if (!state.privyReady) {
|
|
2044
|
+
return { step: "initializing" };
|
|
2045
|
+
}
|
|
2046
|
+
if (state.privyAuthenticated && !state.activeCredentialId && !state.passkeyConfigLoaded) {
|
|
2036
2047
|
return { step: "initializing" };
|
|
2037
2048
|
}
|
|
2038
2049
|
if (state.verificationTarget) {
|
|
@@ -2050,9 +2061,6 @@ function resolvePhase(state) {
|
|
|
2050
2061
|
if (state.loadingData && state.activeCredentialId && hasActiveWallet(state.accounts)) {
|
|
2051
2062
|
return { step: "data-loading" };
|
|
2052
2063
|
}
|
|
2053
|
-
if (state.isGuestFlow && state.selectedProviderId != null && !state.transfer) {
|
|
2054
|
-
return { step: "guest-token-picker" };
|
|
2055
|
-
}
|
|
2056
2064
|
if (state.activeCredentialId && !hasActiveWallet(state.accounts) && !state.mobileFlow) {
|
|
2057
2065
|
return { step: "wallet-picker", reason: "link" };
|
|
2058
2066
|
}
|
|
@@ -2109,7 +2117,9 @@ function createInitialState(config) {
|
|
|
2109
2117
|
guestPreauthSessionId: null,
|
|
2110
2118
|
activePublicKey: null,
|
|
2111
2119
|
loginRequested: false,
|
|
2112
|
-
guestPreauthorizing: false
|
|
2120
|
+
guestPreauthorizing: false,
|
|
2121
|
+
privyReady: false,
|
|
2122
|
+
privyAuthenticated: false
|
|
2113
2123
|
};
|
|
2114
2124
|
}
|
|
2115
2125
|
function paymentReducer(state, action) {
|
|
@@ -2339,6 +2349,17 @@ function applyAction(state, action) {
|
|
|
2339
2349
|
selectedWalletId: null,
|
|
2340
2350
|
selectedTokenSymbol: null
|
|
2341
2351
|
};
|
|
2352
|
+
case "GUEST_BACK_FROM_TOKEN_PICKER":
|
|
2353
|
+
return {
|
|
2354
|
+
...state,
|
|
2355
|
+
selectedProviderId: null,
|
|
2356
|
+
guestTransferId: null,
|
|
2357
|
+
guestSessionToken: null,
|
|
2358
|
+
selectedAccountId: null,
|
|
2359
|
+
selectedWalletId: null,
|
|
2360
|
+
selectedTokenSymbol: null,
|
|
2361
|
+
error: null
|
|
2362
|
+
};
|
|
2342
2363
|
case "GUEST_TRANSFER_COMPLETED":
|
|
2343
2364
|
return {
|
|
2344
2365
|
...state,
|
|
@@ -2352,7 +2373,10 @@ function applyAction(state, action) {
|
|
|
2352
2373
|
return {
|
|
2353
2374
|
...state,
|
|
2354
2375
|
guestPreauthAccountId: action.accountId,
|
|
2355
|
-
guestPreauthSessionId: action.sessionId ?? state.guestPreauthSessionId
|
|
2376
|
+
guestPreauthSessionId: action.sessionId ?? state.guestPreauthSessionId,
|
|
2377
|
+
selectedAccountId: action.accountId,
|
|
2378
|
+
selectedWalletId: null,
|
|
2379
|
+
selectedTokenSymbol: null
|
|
2356
2380
|
};
|
|
2357
2381
|
case "GUEST_PREAUTH_BEGIN":
|
|
2358
2382
|
return { ...state, guestPreauthorizing: true, error: null };
|
|
@@ -2410,7 +2434,15 @@ function applyAction(state, action) {
|
|
|
2410
2434
|
depositAmount: action.depositAmount,
|
|
2411
2435
|
passkeyPopupNeeded: state.passkeyPopupNeeded,
|
|
2412
2436
|
activeCredentialId: null
|
|
2413
|
-
})
|
|
2437
|
+
}),
|
|
2438
|
+
privyReady: action.privyReady,
|
|
2439
|
+
privyAuthenticated: false
|
|
2440
|
+
};
|
|
2441
|
+
case "SYNC_PRIVY_SESSION":
|
|
2442
|
+
return {
|
|
2443
|
+
...state,
|
|
2444
|
+
privyReady: action.ready,
|
|
2445
|
+
privyAuthenticated: action.authenticated
|
|
2414
2446
|
};
|
|
2415
2447
|
case "SYNC_AMOUNT":
|
|
2416
2448
|
return { ...state, amount: action.amount };
|
|
@@ -2478,7 +2510,6 @@ function screenForPhase(phase) {
|
|
|
2478
2510
|
case "wallet-setup":
|
|
2479
2511
|
return phase.mobile ? "open-wallet" : "setup-status";
|
|
2480
2512
|
case "select-source":
|
|
2481
|
-
if (phase.skipOneTapLimit) return "select-source";
|
|
2482
2513
|
return phase.isDesktop ? "setup" : "select-source";
|
|
2483
2514
|
case "one-tap-setup":
|
|
2484
2515
|
return "setup";
|
|
@@ -6241,7 +6272,7 @@ function StepRendererContent({
|
|
|
6241
6272
|
depositAmount: depositAmount ?? void 0,
|
|
6242
6273
|
error: state.error,
|
|
6243
6274
|
onSelect: handlers.onSelectGuestToken,
|
|
6244
|
-
onBack:
|
|
6275
|
+
onBack: handlers.onGuestBackFromTokenPicker
|
|
6245
6276
|
}
|
|
6246
6277
|
);
|
|
6247
6278
|
case "processing": {
|
|
@@ -6523,9 +6554,18 @@ function usePasskeyHandlers(dispatch, apiBaseUrl, accounts, knownCredentialIds,
|
|
|
6523
6554
|
const { user, getAccessToken } = reactAuth.usePrivy();
|
|
6524
6555
|
const checkingPasskeyRef = react.useRef(false);
|
|
6525
6556
|
const activateExistingCredential = react.useCallback(async (credentialId) => {
|
|
6526
|
-
dispatch({ type: "PASSKEY_ACTIVATED", credentialId });
|
|
6527
|
-
window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, credentialId);
|
|
6528
6557
|
const token = await getAccessToken();
|
|
6558
|
+
let publicKey;
|
|
6559
|
+
if (token) {
|
|
6560
|
+
try {
|
|
6561
|
+
const { config } = await fetchUserConfig(apiBaseUrl, token);
|
|
6562
|
+
const allPasskeys = config.passkeys ?? (config.passkey ? [config.passkey] : []);
|
|
6563
|
+
publicKey = allPasskeys.find((p) => p.credentialId === credentialId)?.publicKey;
|
|
6564
|
+
} catch {
|
|
6565
|
+
}
|
|
6566
|
+
}
|
|
6567
|
+
dispatch({ type: "PASSKEY_ACTIVATED", credentialId, publicKey });
|
|
6568
|
+
window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, credentialId);
|
|
6529
6569
|
if (token) {
|
|
6530
6570
|
reportPasskeyActivity(apiBaseUrl, token, credentialId).catch(() => {
|
|
6531
6571
|
});
|
|
@@ -6598,9 +6638,13 @@ function usePasskeyHandlers(dispatch, apiBaseUrl, accounts, knownCredentialIds,
|
|
|
6598
6638
|
authToken: token ?? void 0,
|
|
6599
6639
|
apiBaseUrl
|
|
6600
6640
|
});
|
|
6601
|
-
const { credentialId } = await createPasskeyViaPopup(popupOptions);
|
|
6602
|
-
dispatch({ type: "PASSKEY_ACTIVATED", credentialId });
|
|
6641
|
+
const { credentialId, publicKey } = await createPasskeyViaPopup(popupOptions);
|
|
6642
|
+
dispatch({ type: "PASSKEY_ACTIVATED", credentialId, publicKey });
|
|
6603
6643
|
localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, credentialId);
|
|
6644
|
+
if (token) {
|
|
6645
|
+
reportPasskeyActivity(apiBaseUrl, token, credentialId).catch(() => {
|
|
6646
|
+
});
|
|
6647
|
+
}
|
|
6604
6648
|
} catch (err) {
|
|
6605
6649
|
captureException(err);
|
|
6606
6650
|
dispatch({
|
|
@@ -6616,19 +6660,25 @@ function usePasskeyHandlers(dispatch, apiBaseUrl, accounts, knownCredentialIds,
|
|
|
6616
6660
|
dispatch({ type: "SET_ERROR", error: null });
|
|
6617
6661
|
try {
|
|
6618
6662
|
const token = await getAccessToken();
|
|
6663
|
+
if (!token) throw new Error("Not authenticated");
|
|
6619
6664
|
const matched = await findDevicePasskeyViaPopup({
|
|
6620
6665
|
credentialIds: knownCredentialIds,
|
|
6621
6666
|
rpId: resolvePasskeyRpId(),
|
|
6622
|
-
authToken: token
|
|
6667
|
+
authToken: token,
|
|
6623
6668
|
apiBaseUrl
|
|
6624
6669
|
});
|
|
6625
6670
|
if (matched) {
|
|
6626
|
-
|
|
6627
|
-
|
|
6628
|
-
|
|
6629
|
-
|
|
6630
|
-
|
|
6671
|
+
let publicKey;
|
|
6672
|
+
try {
|
|
6673
|
+
const { config } = await fetchUserConfig(apiBaseUrl, token);
|
|
6674
|
+
const allPasskeys = config.passkeys ?? (config.passkey ? [config.passkey] : []);
|
|
6675
|
+
publicKey = allPasskeys.find((p) => p.credentialId === matched)?.publicKey;
|
|
6676
|
+
} catch {
|
|
6631
6677
|
}
|
|
6678
|
+
dispatch({ type: "PASSKEY_ACTIVATED", credentialId: matched, publicKey });
|
|
6679
|
+
window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, matched);
|
|
6680
|
+
reportPasskeyActivity(apiBaseUrl, token, matched).catch(() => {
|
|
6681
|
+
});
|
|
6632
6682
|
} else {
|
|
6633
6683
|
dispatch({
|
|
6634
6684
|
type: "SET_ERROR",
|
|
@@ -7677,11 +7727,15 @@ function useGuestTransferHandlers(deps) {
|
|
|
7677
7727
|
};
|
|
7678
7728
|
execute();
|
|
7679
7729
|
}, [isGuestFlow, guestTransferId, guestSessionToken, settingSender, apiBaseUrl, wagmiConfig2, switchChainAsync, dispatch, onComplete, onError]);
|
|
7730
|
+
const handleGuestBackFromTokenPicker = react.useCallback(() => {
|
|
7731
|
+
dispatch({ type: "GUEST_BACK_FROM_TOKEN_PICKER" });
|
|
7732
|
+
}, [dispatch]);
|
|
7680
7733
|
return {
|
|
7681
7734
|
guestTokenEntries,
|
|
7682
7735
|
loadingBalances,
|
|
7683
7736
|
settingSender,
|
|
7684
|
-
handleSelectGuestToken
|
|
7737
|
+
handleSelectGuestToken,
|
|
7738
|
+
handleGuestBackFromTokenPicker
|
|
7685
7739
|
};
|
|
7686
7740
|
}
|
|
7687
7741
|
function useOneTapSetupHandlers(deps) {
|
|
@@ -7691,15 +7745,24 @@ function useOneTapSetupHandlers(deps) {
|
|
|
7691
7745
|
apiBaseUrl,
|
|
7692
7746
|
authExecutor,
|
|
7693
7747
|
selectSourceChainName,
|
|
7694
|
-
selectSourceTokenSymbol
|
|
7748
|
+
selectSourceTokenSymbol,
|
|
7749
|
+
authorizationSessionIdForGuest
|
|
7695
7750
|
} = deps;
|
|
7696
7751
|
const [savingOneTapLimit, setSavingOneTapLimit] = react.useState(false);
|
|
7697
7752
|
const handleSetupOneTap = react.useCallback(async (limit) => {
|
|
7698
7753
|
setSavingOneTapLimit(true);
|
|
7699
7754
|
try {
|
|
7700
|
-
|
|
7701
|
-
|
|
7702
|
-
|
|
7755
|
+
if (authorizationSessionIdForGuest) {
|
|
7756
|
+
await updateUserConfigBySession(
|
|
7757
|
+
apiBaseUrl,
|
|
7758
|
+
authorizationSessionIdForGuest,
|
|
7759
|
+
{ defaultAllowance: limit }
|
|
7760
|
+
);
|
|
7761
|
+
} else {
|
|
7762
|
+
const token = await getAccessToken();
|
|
7763
|
+
if (!token) throw new Error("Not authenticated");
|
|
7764
|
+
await updateUserConfig(apiBaseUrl, token, { defaultAllowance: limit });
|
|
7765
|
+
}
|
|
7703
7766
|
if (authExecutor.pendingSelectSource) {
|
|
7704
7767
|
const action = authExecutor.pendingSelectSource;
|
|
7705
7768
|
const recommended = action.metadata?.recommended;
|
|
@@ -7729,12 +7792,30 @@ function useOneTapSetupHandlers(deps) {
|
|
|
7729
7792
|
} finally {
|
|
7730
7793
|
setSavingOneTapLimit(false);
|
|
7731
7794
|
}
|
|
7732
|
-
}, [
|
|
7795
|
+
}, [
|
|
7796
|
+
getAccessToken,
|
|
7797
|
+
apiBaseUrl,
|
|
7798
|
+
authExecutor,
|
|
7799
|
+
dispatch,
|
|
7800
|
+
selectSourceChainName,
|
|
7801
|
+
selectSourceTokenSymbol,
|
|
7802
|
+
authorizationSessionIdForGuest
|
|
7803
|
+
]);
|
|
7733
7804
|
return {
|
|
7734
7805
|
handleSetupOneTap,
|
|
7735
7806
|
savingOneTapLimit
|
|
7736
7807
|
};
|
|
7737
7808
|
}
|
|
7809
|
+
function usePrivySessionSyncEffect(deps) {
|
|
7810
|
+
const { dispatch, ready, authenticated } = deps;
|
|
7811
|
+
react.useEffect(() => {
|
|
7812
|
+
dispatch({
|
|
7813
|
+
type: "SYNC_PRIVY_SESSION",
|
|
7814
|
+
ready,
|
|
7815
|
+
authenticated
|
|
7816
|
+
});
|
|
7817
|
+
}, [dispatch, ready, authenticated]);
|
|
7818
|
+
}
|
|
7738
7819
|
function useOtpEffects(deps) {
|
|
7739
7820
|
const {
|
|
7740
7821
|
state,
|
|
@@ -7928,7 +8009,18 @@ function usePasskeyCheckEffect(deps) {
|
|
|
7928
8009
|
if (token || cancelled) break;
|
|
7929
8010
|
await new Promise((r) => setTimeout(r, 1e3));
|
|
7930
8011
|
}
|
|
7931
|
-
if (
|
|
8012
|
+
if (cancelled) return;
|
|
8013
|
+
if (!token) {
|
|
8014
|
+
dispatch({
|
|
8015
|
+
type: "PASSKEY_CONFIG_LOADED",
|
|
8016
|
+
knownIds: []
|
|
8017
|
+
});
|
|
8018
|
+
dispatch({
|
|
8019
|
+
type: "SET_ERROR",
|
|
8020
|
+
error: "Could not refresh your session. Try signing in again."
|
|
8021
|
+
});
|
|
8022
|
+
return;
|
|
8023
|
+
}
|
|
7932
8024
|
const { config } = await fetchUserConfig(apiBaseUrl, token);
|
|
7933
8025
|
if (cancelled) return;
|
|
7934
8026
|
const allPasskeys = config.passkeys ?? (config.passkey ? [config.passkey] : []);
|
|
@@ -7939,6 +8031,10 @@ function usePasskeyCheckEffect(deps) {
|
|
|
7939
8031
|
});
|
|
7940
8032
|
if (allPasskeys.length === 0) return;
|
|
7941
8033
|
if (activeCredentialId && allPasskeys.some((p) => p.credentialId === activeCredentialId)) {
|
|
8034
|
+
const pk = allPasskeys.find((p) => p.credentialId === activeCredentialId)?.publicKey;
|
|
8035
|
+
if (pk) {
|
|
8036
|
+
dispatch({ type: "PASSKEY_ACTIVATED", credentialId: activeCredentialId, publicKey: pk });
|
|
8037
|
+
}
|
|
7942
8038
|
await restoreState(activeCredentialId, token);
|
|
7943
8039
|
return;
|
|
7944
8040
|
}
|
|
@@ -7957,13 +8053,22 @@ function usePasskeyCheckEffect(deps) {
|
|
|
7957
8053
|
}
|
|
7958
8054
|
if (cancelled) return;
|
|
7959
8055
|
if (matched) {
|
|
7960
|
-
|
|
8056
|
+
const publicKey = allPasskeys.find((p) => p.credentialId === matched)?.publicKey;
|
|
8057
|
+
dispatch({ type: "PASSKEY_ACTIVATED", credentialId: matched, publicKey });
|
|
7961
8058
|
window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, matched);
|
|
7962
8059
|
reportPasskeyActivity(apiBaseUrl, token, matched).catch(() => {
|
|
7963
8060
|
});
|
|
7964
8061
|
await restoreState(matched, token);
|
|
7965
8062
|
}
|
|
7966
|
-
} catch {
|
|
8063
|
+
} catch (err) {
|
|
8064
|
+
dispatch({
|
|
8065
|
+
type: "PASSKEY_CONFIG_LOADED",
|
|
8066
|
+
knownIds: []
|
|
8067
|
+
});
|
|
8068
|
+
dispatch({
|
|
8069
|
+
type: "SET_ERROR",
|
|
8070
|
+
error: err instanceof Error ? err.message : "Unable to load passkey settings."
|
|
8071
|
+
});
|
|
7967
8072
|
}
|
|
7968
8073
|
};
|
|
7969
8074
|
checkPasskey();
|
|
@@ -8516,19 +8621,15 @@ function useGuestPreauthPhaseSyncEffect(deps) {
|
|
|
8516
8621
|
const intent = {
|
|
8517
8622
|
step: "select-source",
|
|
8518
8623
|
action: pending,
|
|
8519
|
-
isDesktop
|
|
8520
|
-
skipOneTapLimit: true
|
|
8624
|
+
isDesktop
|
|
8521
8625
|
};
|
|
8522
|
-
if (state.phase.step === "select-source") {
|
|
8523
|
-
|
|
8524
|
-
if (ph.skipOneTapLimit && ph.action.id === pending.id) {
|
|
8525
|
-
return;
|
|
8526
|
-
}
|
|
8626
|
+
if (state.phase.step === "select-source" && state.phase.action.id === pending.id) {
|
|
8627
|
+
return;
|
|
8527
8628
|
}
|
|
8528
8629
|
dispatch({ type: "SET_USER_INTENT", intent });
|
|
8529
8630
|
return;
|
|
8530
8631
|
}
|
|
8531
|
-
if (state.phase.step === "select-source"
|
|
8632
|
+
if (state.phase.step === "select-source") {
|
|
8532
8633
|
dispatch({ type: "SET_USER_INTENT", intent: { step: "one-tap-setup", action: null } });
|
|
8533
8634
|
}
|
|
8534
8635
|
}, [
|
|
@@ -8657,7 +8758,8 @@ function BlinkPaymentInner({
|
|
|
8657
8758
|
apiBaseUrl,
|
|
8658
8759
|
authExecutor,
|
|
8659
8760
|
selectSourceChainName: sourceSelection.selectSourceChainName,
|
|
8660
|
-
selectSourceTokenSymbol: sourceSelection.selectSourceTokenSymbol
|
|
8761
|
+
selectSourceTokenSymbol: sourceSelection.selectSourceTokenSymbol,
|
|
8762
|
+
authorizationSessionIdForGuest: state.guestPreauthSessionId
|
|
8661
8763
|
});
|
|
8662
8764
|
const guestTransfer = useGuestTransferHandlers({
|
|
8663
8765
|
dispatch,
|
|
@@ -8690,13 +8792,14 @@ function BlinkPaymentInner({
|
|
|
8690
8792
|
passkey.checkingPasskeyRef.current = false;
|
|
8691
8793
|
auth.setAuthInput("");
|
|
8692
8794
|
auth.setOtpCode("");
|
|
8693
|
-
dispatch({ type: "LOGOUT", depositAmount });
|
|
8694
|
-
}, [logout, polling, depositAmount, auth, passkey]);
|
|
8795
|
+
dispatch({ type: "LOGOUT", depositAmount, privyReady: ready });
|
|
8796
|
+
}, [logout, polling, depositAmount, auth, passkey, ready]);
|
|
8695
8797
|
react.useEffect(() => {
|
|
8696
8798
|
if (depositAmount != null) {
|
|
8697
8799
|
dispatch({ type: "SYNC_AMOUNT", amount: depositAmount.toString() });
|
|
8698
8800
|
}
|
|
8699
8801
|
}, [depositAmount, dispatch]);
|
|
8802
|
+
usePrivySessionSyncEffect({ dispatch, ready, authenticated });
|
|
8700
8803
|
useOtpEffects({
|
|
8701
8804
|
state,
|
|
8702
8805
|
dispatch,
|
|
@@ -8830,6 +8933,7 @@ function BlinkPaymentInner({
|
|
|
8830
8933
|
onSelectAuthorizedToken: provider.handleSelectAuthorizedToken,
|
|
8831
8934
|
onAuthorizeToken: provider.handleAuthorizeToken,
|
|
8832
8935
|
onSelectGuestToken: guestTransfer.handleSelectGuestToken,
|
|
8936
|
+
onGuestBackFromTokenPicker: guestTransfer.handleGuestBackFromTokenPicker,
|
|
8833
8937
|
onLogin: () => dispatch({ type: "REQUEST_LOGIN" }),
|
|
8834
8938
|
onPreauthorize: provider.handlePreauthorize
|
|
8835
8939
|
}), [
|