@swype-org/react-sdk 0.1.251 → 0.1.256

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.js CHANGED
@@ -1847,7 +1847,10 @@ function useTransferSigning(pollIntervalMs = 2e3, options) {
1847
1847
  // src/paymentHelpers.ts
1848
1848
  var ACTIVE_CREDENTIAL_STORAGE_KEY = "blink_active_credential_id";
1849
1849
  var MOBILE_FLOW_STORAGE_KEY = "blink_mobile_flow";
1850
- var MIN_SEND_AMOUNT_USD = 0.25;
1850
+ var DEFAULT_MIN_SEND_AMOUNT_USD = 0.25;
1851
+ function effectiveMinTransferAmountUsd(depositAmount) {
1852
+ return depositAmount != null ? depositAmount : DEFAULT_MIN_SEND_AMOUNT_USD;
1853
+ }
1851
1854
  function persistMobileFlowState(data) {
1852
1855
  try {
1853
1856
  sessionStorage.setItem(MOBILE_FLOW_STORAGE_KEY, JSON.stringify(data));
@@ -2022,77 +2025,142 @@ function isGuestPreauthCompletedTransferPinPhase(phase) {
2022
2025
  }
2023
2026
  function resolvePhase(state) {
2024
2027
  const p = state.phase;
2025
- if (state.guestPreauthSetupCompletePending && state.privyReady && state.privyAuthenticated) {
2026
- return { step: "guest-setup-complete" };
2027
- }
2028
- if (state.transfer?.status === "COMPLETED" && state.guestPreauthorizing && !state.verificationTarget && isGuestPreauthCompletedTransferPinPhase(p)) {
2029
- return p;
2030
- }
2031
- if (state.transfer?.status === "COMPLETED" && state.isGuestFlow && state.guestPreauthSessionId && !state.guestPreauthorizing && !state.verificationTarget && !state.privyAuthenticated) {
2032
- return { step: "login" };
2033
- }
2034
- if (state.transfer?.status === "COMPLETED" && !state.verificationTarget) {
2035
- const needsPasskeyBootstrap = state.privyAuthenticated && !state.activeCredentialId;
2036
- if (!needsPasskeyBootstrap) {
2037
- return { step: "completed", transfer: state.transfer };
2038
- }
2039
- }
2040
- if (state.transfer?.status === "FAILED") {
2041
- return { step: "failed", transfer: state.transfer, error: state.error ?? "Transfer failed." };
2042
- }
2043
- if (state.creatingTransfer || isTransferInFlight(state.transfer)) {
2044
- return { step: "processing", transfer: state.transfer };
2045
- }
2046
- if (!state.loginRequested && (p.step === "token-picker" || p.step === "one-tap-setup" || p.step === "select-source" || p.step === "confirm-sign" || p.step === "guest-token-picker")) {
2047
- return p;
2028
+ const transferCompleted = state.transfer?.status === "COMPLETED";
2029
+ const needsPasskeyBootstrap = state.privyAuthenticated && !state.activeCredentialId;
2030
+ const guestPreauthPin = transferCompleted && state.guestPreauthorizing && !state.verificationTarget && isGuestPreauthCompletedTransferPinPhase(p);
2031
+ const guestPostPayLogin = transferCompleted && state.isGuestFlow && state.guestPreauthSessionId != null && !state.guestPreauthorizing && !state.verificationTarget && !state.privyAuthenticated;
2032
+ const pinSubflow = !state.loginRequested && (p.step === "token-picker" || p.step === "one-tap-setup" || p.step === "select-source" || p.step === "confirm-sign" || p.step === "guest-token-picker");
2033
+ const guestTokenPicker = state.isGuestFlow && state.selectedProviderId != null && !state.transfer && !state.guestPreauthAccountId;
2034
+ const walletPickerSwitch = p.step === "wallet-picker" && p.reason === "switch" && !state.creatingTransfer && !(state.mobileFlow && state.deeplinkUri);
2035
+ const passkeyBlock = state.passkeyConfigLoaded && !state.activeCredentialId;
2036
+ const passkeyVerify = passkeyBlock && state.knownCredentialIds.length > 0 && state.passkeyPopupNeeded;
2037
+ const c1 = state.guestPreauthSetupCompletePending && state.privyReady && state.privyAuthenticated;
2038
+ const c2 = !c1 && guestPreauthPin;
2039
+ const c3 = !c1 && !c2 && guestPostPayLogin;
2040
+ const c4 = !c1 && !c2 && !c3 && transferCompleted && !state.verificationTarget && !needsPasskeyBootstrap;
2041
+ const c5 = !c1 && !c2 && !c3 && !c4 && state.transfer?.status === "FAILED";
2042
+ const c6 = !c1 && !c2 && !c3 && !c4 && !c5 && (state.creatingTransfer || isTransferInFlight(state.transfer));
2043
+ const c7 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && pinSubflow;
2044
+ const c8 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && state.mobileFlow && state.deeplinkUri != null;
2045
+ const c9 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && p.step === "wallet-setup" && p.mobile == null && state.guestPreauthorizing;
2046
+ const c10 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && guestTokenPicker;
2047
+ const c11 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && walletPickerSwitch;
2048
+ const c12 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !state.privyReady;
2049
+ const c13 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && state.privyAuthenticated && !state.activeCredentialId && !state.passkeyConfigLoaded;
2050
+ const c14 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && state.verificationTarget != null && !state.privyAuthenticated;
2051
+ const c15 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && state.loginRequested;
2052
+ const c16 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && passkeyVerify;
2053
+ const c17 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && !c16 && passkeyBlock;
2054
+ const c18 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && !c16 && !c17 && state.loadingData && state.activeCredentialId != null && hasActiveWallet(state.accounts);
2055
+ const c19 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && !c16 && !c17 && !c18 && state.activeCredentialId != null && !hasActiveWallet(state.accounts) && !state.mobileFlow;
2056
+ const c20 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && !c16 && !c17 && !c18 && !c19 && state.activeCredentialId != null && hasActiveWallet(state.accounts) && !state.loadingData;
2057
+ const c21 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && !c16 && !c17 && !c18 && !c19 && !c20 && state.isGuestFlow;
2058
+ const flags = [
2059
+ c1,
2060
+ c2,
2061
+ c3,
2062
+ c4,
2063
+ c5,
2064
+ c6,
2065
+ c7,
2066
+ c8,
2067
+ c9,
2068
+ c10,
2069
+ c11,
2070
+ c12,
2071
+ c13,
2072
+ c14,
2073
+ c15,
2074
+ c16,
2075
+ c17,
2076
+ c18,
2077
+ c19,
2078
+ c20,
2079
+ c21
2080
+ ];
2081
+ const matchCount = flags.filter(Boolean).length;
2082
+ if (matchCount > 1) {
2083
+ console.error("resolvePhase: multiple exclusive branches matched", {
2084
+ flags: {
2085
+ c1,
2086
+ c2,
2087
+ c3,
2088
+ c4,
2089
+ c5,
2090
+ c6,
2091
+ c7,
2092
+ c8,
2093
+ c9,
2094
+ c10,
2095
+ c11,
2096
+ c12,
2097
+ c13,
2098
+ c14,
2099
+ c15,
2100
+ c16,
2101
+ c17,
2102
+ c18,
2103
+ c19,
2104
+ c20,
2105
+ c21
2106
+ }
2107
+ });
2048
2108
  }
2049
- if (state.mobileFlow && state.deeplinkUri) {
2050
- return {
2109
+ let resolved;
2110
+ if (c1) {
2111
+ resolved = { step: "guest-setup-complete" };
2112
+ } else if (c2) {
2113
+ resolved = p;
2114
+ } else if (c3) {
2115
+ resolved = { step: "login" };
2116
+ } else if (c4) {
2117
+ resolved = { step: "completed", transfer: state.transfer };
2118
+ } else if (c5) {
2119
+ resolved = {
2120
+ step: "failed",
2121
+ transfer: state.transfer,
2122
+ error: state.error ?? "Transfer failed."
2123
+ };
2124
+ } else if (c6) {
2125
+ resolved = { step: "processing", transfer: state.transfer };
2126
+ } else if (c7) {
2127
+ resolved = p;
2128
+ } else if (c8) {
2129
+ resolved = {
2051
2130
  step: "wallet-setup",
2052
2131
  mobile: { deeplinkUri: state.deeplinkUri, providerId: state.selectedProviderId },
2053
2132
  accountId: null
2054
2133
  };
2134
+ } else if (c9) {
2135
+ resolved = p;
2136
+ } else if (c10) {
2137
+ resolved = { step: "guest-token-picker" };
2138
+ } else if (c11) {
2139
+ resolved = p;
2140
+ } else if (c12) {
2141
+ resolved = { step: "initializing" };
2142
+ } else if (c13) {
2143
+ resolved = { step: "initializing" };
2144
+ } else if (c14) {
2145
+ resolved = { step: "otp-verify", target: state.verificationTarget };
2146
+ } else if (c15) {
2147
+ resolved = { step: "login" };
2148
+ } else if (c16) {
2149
+ resolved = { step: "passkey-verify" };
2150
+ } else if (c17) {
2151
+ resolved = { step: "passkey-create", popupFallback: state.passkeyPopupNeeded };
2152
+ } else if (c18) {
2153
+ resolved = { step: "data-loading" };
2154
+ } else if (c19) {
2155
+ resolved = { step: "wallet-picker", reason: "link" };
2156
+ } else if (c20) {
2157
+ resolved = { step: "deposit" };
2158
+ } else if (c21) {
2159
+ resolved = { step: "wallet-picker", reason: "guest-entry" };
2160
+ } else {
2161
+ resolved = { step: "wallet-picker", reason: "entry" };
2055
2162
  }
2056
- if (p.step === "wallet-setup" && p.mobile == null && state.guestPreauthorizing) {
2057
- return p;
2058
- }
2059
- if (state.isGuestFlow && state.selectedProviderId != null && !state.transfer && !state.guestPreauthAccountId) {
2060
- return { step: "guest-token-picker" };
2061
- }
2062
- if (p.step === "wallet-picker" && !state.creatingTransfer && !(state.mobileFlow && state.deeplinkUri)) {
2063
- return p;
2064
- }
2065
- if (!state.privyReady) {
2066
- return { step: "initializing" };
2067
- }
2068
- if (state.privyAuthenticated && !state.activeCredentialId && !state.passkeyConfigLoaded) {
2069
- return { step: "initializing" };
2070
- }
2071
- if (state.verificationTarget && !state.privyAuthenticated) {
2072
- return { step: "otp-verify", target: state.verificationTarget };
2073
- }
2074
- if (state.loginRequested) {
2075
- return { step: "login" };
2076
- }
2077
- if (state.passkeyConfigLoaded && !state.activeCredentialId) {
2078
- if (state.knownCredentialIds.length > 0 && state.passkeyPopupNeeded) {
2079
- return { step: "passkey-verify" };
2080
- }
2081
- return { step: "passkey-create", popupFallback: state.passkeyPopupNeeded };
2082
- }
2083
- if (state.loadingData && state.activeCredentialId && hasActiveWallet(state.accounts)) {
2084
- return { step: "data-loading" };
2085
- }
2086
- if (state.activeCredentialId && !hasActiveWallet(state.accounts) && !state.mobileFlow) {
2087
- return { step: "wallet-picker", reason: "link" };
2088
- }
2089
- if (state.activeCredentialId && hasActiveWallet(state.accounts) && !state.loadingData) {
2090
- return { step: "deposit" };
2091
- }
2092
- if (state.isGuestFlow) {
2093
- return { step: "wallet-picker", reason: "guest-entry" };
2094
- }
2095
- return { step: "wallet-picker", reason: "entry" };
2163
+ return resolved;
2096
2164
  }
2097
2165
 
2098
2166
  // src/paymentReducer.ts
@@ -4358,13 +4426,13 @@ var waitHintStyle = (color) => ({
4358
4426
  color,
4359
4427
  margin: 0
4360
4428
  });
4361
- var MIN_DEPOSIT = 0.25;
4362
4429
  function DepositScreen({
4363
4430
  merchantName,
4364
4431
  availableBalance,
4365
4432
  remainingLimit,
4366
4433
  tokenCount,
4367
4434
  initialAmount,
4435
+ minDepositFloor,
4368
4436
  processing,
4369
4437
  error,
4370
4438
  onDeposit,
@@ -4400,9 +4468,9 @@ function DepositScreen({
4400
4468
  const selectedProviderName = selectedAccount?.name ?? "Wallet";
4401
4469
  const selectedProviderLogo = KNOWN_LOGOS[selectedProviderName.toLowerCase()];
4402
4470
  const totalAccountBalance = selectedAccount ? selectedAccount.wallets.reduce((sum, w) => sum + w.balance.available.amount, 0) : availableBalance;
4403
- const isLowBalance = availableBalance < MIN_DEPOSIT;
4471
+ const isLowBalance = availableBalance < minDepositFloor;
4404
4472
  const exceedsLimit = remainingLimit != null && amount > remainingLimit && !isLowBalance;
4405
- const canDeposit = amount >= MIN_DEPOSIT && !exceedsLimit && !isLowBalance && !processing;
4473
+ const canDeposit = amount >= minDepositFloor && !exceedsLimit && !isLowBalance && !processing;
4406
4474
  return /* @__PURE__ */ jsxs(
4407
4475
  ScreenLayout,
4408
4476
  {
@@ -4537,7 +4605,7 @@ function DepositScreen({
4537
4605
  "Your wallet balance is $",
4538
4606
  availableBalance.toFixed(2),
4539
4607
  " \u2014 you need at least $",
4540
- MIN_DEPOSIT.toFixed(2),
4608
+ minDepositFloor.toFixed(2),
4541
4609
  " to deposit via One-Tap."
4542
4610
  ] }),
4543
4611
  error && /* @__PURE__ */ jsx("div", { style: errorBannerStyle5(tokens), children: error })
@@ -6114,6 +6182,7 @@ var DEPOSIT_SCREENS = /* @__PURE__ */ new Set([
6114
6182
  "processing",
6115
6183
  "success"
6116
6184
  ]);
6185
+ var DEFAULT_MIN_DEPOSIT_USD = 0.25;
6117
6186
  function getFlowPhase(screen, phase) {
6118
6187
  if (LINK_SCREENS.has(screen)) return "link";
6119
6188
  if (DEPOSIT_SCREENS.has(screen)) return "deposit";
@@ -6322,6 +6391,7 @@ function StepRendererContent({
6322
6391
  }
6323
6392
  case "deposit": {
6324
6393
  const parsedAmt = depositAmount != null ? depositAmount : 5;
6394
+ const minDepositFloor = depositAmount != null ? depositAmount : DEFAULT_MIN_DEPOSIT_USD;
6325
6395
  return /* @__PURE__ */ jsx(
6326
6396
  DepositScreen,
6327
6397
  {
@@ -6345,7 +6415,8 @@ function StepRendererContent({
6345
6415
  onAddProvider: () => handlers.onSetPhase({ step: "wallet-picker", reason: "switch" }),
6346
6416
  onSelectToken: handlers.onSelectToken,
6347
6417
  selectedSourceLabel,
6348
- selectedTokenSymbol: selectedSource?.token.symbol
6418
+ selectedTokenSymbol: selectedSource?.token.symbol,
6419
+ minDepositFloor
6349
6420
  }
6350
6421
  );
6351
6422
  }
@@ -6871,8 +6942,9 @@ function useTransferHandlers(deps) {
6871
6942
  dispatch({ type: "ACCOUNTS_RELOADED", accounts: accts, providers: prov, defaults });
6872
6943
  }, [getAccessToken, activeCredentialId, selectedAccountId, apiBaseUrl, depositAmount, dispatch]);
6873
6944
  const handlePay = useCallback(async (payAmount, sourceOverrides) => {
6874
- if (isNaN(payAmount) || payAmount < MIN_SEND_AMOUNT_USD) {
6875
- dispatch({ type: "SET_ERROR", error: `Minimum amount is $${MIN_SEND_AMOUNT_USD.toFixed(2)}.` });
6945
+ const minUsd = effectiveMinTransferAmountUsd(depositAmount);
6946
+ if (isNaN(payAmount) || payAmount < minUsd) {
6947
+ dispatch({ type: "SET_ERROR", error: `Minimum amount is $${minUsd.toFixed(2)}.` });
6876
6948
  return;
6877
6949
  }
6878
6950
  if (!sourceOverrides?.sourceId && !sourceId) {
@@ -6951,7 +7023,8 @@ function useTransferHandlers(deps) {
6951
7023
  onComplete,
6952
7024
  idempotencyKey,
6953
7025
  merchantAuthorization,
6954
- dispatch
7026
+ dispatch,
7027
+ depositAmount
6955
7028
  ]);
6956
7029
  const handleConfirmSign = useCallback(async () => {
6957
7030
  const t = transfer ?? polling.transfer;
@@ -7903,7 +7976,9 @@ function useOneTapSetupHandlers(deps) {
7903
7976
  authExecutor,
7904
7977
  selectSourceChainName,
7905
7978
  selectSourceTokenSymbol,
7906
- authorizationSessionIdForGuest
7979
+ authorizationSessionIdForGuest,
7980
+ guestPostPayPreauth,
7981
+ guestPreauthAccountId
7907
7982
  } = deps;
7908
7983
  const [savingOneTapLimit, setSavingOneTapLimit] = useState(false);
7909
7984
  const handleSetupOneTap = useCallback(async (limit) => {
@@ -7920,6 +7995,19 @@ function useOneTapSetupHandlers(deps) {
7920
7995
  if (!token) throw new Error("Not authenticated");
7921
7996
  await updateUserConfig(apiBaseUrl, token, { defaultAllowance: limit });
7922
7997
  }
7998
+ const willResolveSession = authExecutor.pendingSelectSource != null || authExecutor.pendingOneTapSetup != null;
7999
+ if (guestPostPayPreauth && willResolveSession) {
8000
+ dispatch({ type: "REQUEST_LOGIN" });
8001
+ if (guestPreauthAccountId != null) {
8002
+ const intent = {
8003
+ step: "wallet-setup",
8004
+ mobile: null,
8005
+ accountId: guestPreauthAccountId,
8006
+ guestDesktopExtension: true
8007
+ };
8008
+ dispatch({ type: "SET_USER_INTENT", intent });
8009
+ }
8010
+ }
7923
8011
  if (authExecutor.pendingSelectSource) {
7924
8012
  const action = authExecutor.pendingSelectSource;
7925
8013
  const recommended = action.metadata?.recommended;
@@ -7939,7 +8027,9 @@ function useOneTapSetupHandlers(deps) {
7939
8027
  } else if (authExecutor.pendingOneTapSetup) {
7940
8028
  authExecutor.resolveOneTapSetup();
7941
8029
  }
7942
- dispatch({ type: "SET_USER_INTENT", intent: { step: "deposit" } });
8030
+ if (!guestPostPayPreauth || !willResolveSession) {
8031
+ dispatch({ type: "SET_USER_INTENT", intent: { step: "deposit" } });
8032
+ }
7943
8033
  } catch (err) {
7944
8034
  captureException(err);
7945
8035
  dispatch({
@@ -7956,7 +8046,9 @@ function useOneTapSetupHandlers(deps) {
7956
8046
  dispatch,
7957
8047
  selectSourceChainName,
7958
8048
  selectSourceTokenSymbol,
7959
- authorizationSessionIdForGuest
8049
+ authorizationSessionIdForGuest,
8050
+ guestPostPayPreauth,
8051
+ guestPreauthAccountId
7960
8052
  ]);
7961
8053
  return {
7962
8054
  handleSetupOneTap,
@@ -9016,6 +9108,15 @@ function BlinkPaymentInner({
9016
9108
  guestSessionToken: state.guestSessionToken,
9017
9109
  selectedProviderId: state.selectedProviderId
9018
9110
  });
9111
+ const guestPostPayPreauth = useMemo(
9112
+ () => !!state.guestPreauthSessionId && state.isGuestFlow || state.guestPreauthorizing && isDesktop,
9113
+ [
9114
+ state.guestPreauthSessionId,
9115
+ state.isGuestFlow,
9116
+ state.guestPreauthorizing,
9117
+ isDesktop
9118
+ ]
9119
+ );
9019
9120
  const oneTapSetup = useOneTapSetupHandlers({
9020
9121
  dispatch,
9021
9122
  getAccessToken,
@@ -9023,7 +9124,9 @@ function BlinkPaymentInner({
9023
9124
  authExecutor,
9024
9125
  selectSourceChainName: sourceSelection.selectSourceChainName,
9025
9126
  selectSourceTokenSymbol: sourceSelection.selectSourceTokenSymbol,
9026
- authorizationSessionIdForGuest: state.guestPreauthSessionId
9127
+ authorizationSessionIdForGuest: state.guestPreauthSessionId,
9128
+ guestPostPayPreauth,
9129
+ guestPreauthAccountId: state.guestPreauthAccountId
9027
9130
  });
9028
9131
  const guestTransfer = useGuestTransferHandlers({
9029
9132
  dispatch,