@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 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 (!state.activeCredentialId && !state.passkeyConfigLoaded) {
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: () => handlers.onSetPhase({ step: "wallet-picker", reason: "guest-entry" })
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 ?? void 0,
6667
+ authToken: token,
6623
6668
  apiBaseUrl
6624
6669
  });
6625
6670
  if (matched) {
6626
- dispatch({ type: "PASSKEY_ACTIVATED", credentialId: matched });
6627
- window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, matched);
6628
- if (token) {
6629
- reportPasskeyActivity(apiBaseUrl, token, matched).catch(() => {
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
- const token = await getAccessToken();
7701
- if (!token) throw new Error("Not authenticated");
7702
- await updateUserConfig(apiBaseUrl, token, { defaultAllowance: limit });
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
- }, [getAccessToken, apiBaseUrl, authExecutor, dispatch, selectSourceChainName, selectSourceTokenSymbol]);
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 (!token || cancelled) return;
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
- dispatch({ type: "PASSKEY_ACTIVATED", credentialId: matched });
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
- const ph = state.phase;
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" && state.phase.skipOneTapLimit === true) {
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
  }), [