@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.cjs CHANGED
@@ -1850,7 +1850,10 @@ function useTransferSigning(pollIntervalMs = 2e3, options) {
1850
1850
  // src/paymentHelpers.ts
1851
1851
  var ACTIVE_CREDENTIAL_STORAGE_KEY = "blink_active_credential_id";
1852
1852
  var MOBILE_FLOW_STORAGE_KEY = "blink_mobile_flow";
1853
- var MIN_SEND_AMOUNT_USD = 0.25;
1853
+ var DEFAULT_MIN_SEND_AMOUNT_USD = 0.25;
1854
+ function effectiveMinTransferAmountUsd(depositAmount) {
1855
+ return depositAmount != null ? depositAmount : DEFAULT_MIN_SEND_AMOUNT_USD;
1856
+ }
1854
1857
  function persistMobileFlowState(data) {
1855
1858
  try {
1856
1859
  sessionStorage.setItem(MOBILE_FLOW_STORAGE_KEY, JSON.stringify(data));
@@ -2025,77 +2028,142 @@ function isGuestPreauthCompletedTransferPinPhase(phase) {
2025
2028
  }
2026
2029
  function resolvePhase(state) {
2027
2030
  const p = state.phase;
2028
- if (state.guestPreauthSetupCompletePending && state.privyReady && state.privyAuthenticated) {
2029
- return { step: "guest-setup-complete" };
2030
- }
2031
- if (state.transfer?.status === "COMPLETED" && state.guestPreauthorizing && !state.verificationTarget && isGuestPreauthCompletedTransferPinPhase(p)) {
2032
- return p;
2033
- }
2034
- if (state.transfer?.status === "COMPLETED" && state.isGuestFlow && state.guestPreauthSessionId && !state.guestPreauthorizing && !state.verificationTarget && !state.privyAuthenticated) {
2035
- return { step: "login" };
2036
- }
2037
- if (state.transfer?.status === "COMPLETED" && !state.verificationTarget) {
2038
- const needsPasskeyBootstrap = state.privyAuthenticated && !state.activeCredentialId;
2039
- if (!needsPasskeyBootstrap) {
2040
- return { step: "completed", transfer: state.transfer };
2041
- }
2042
- }
2043
- if (state.transfer?.status === "FAILED") {
2044
- return { step: "failed", transfer: state.transfer, error: state.error ?? "Transfer failed." };
2045
- }
2046
- if (state.creatingTransfer || isTransferInFlight(state.transfer)) {
2047
- return { step: "processing", transfer: state.transfer };
2048
- }
2049
- 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")) {
2050
- return p;
2031
+ const transferCompleted = state.transfer?.status === "COMPLETED";
2032
+ const needsPasskeyBootstrap = state.privyAuthenticated && !state.activeCredentialId;
2033
+ const guestPreauthPin = transferCompleted && state.guestPreauthorizing && !state.verificationTarget && isGuestPreauthCompletedTransferPinPhase(p);
2034
+ const guestPostPayLogin = transferCompleted && state.isGuestFlow && state.guestPreauthSessionId != null && !state.guestPreauthorizing && !state.verificationTarget && !state.privyAuthenticated;
2035
+ 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");
2036
+ const guestTokenPicker = state.isGuestFlow && state.selectedProviderId != null && !state.transfer && !state.guestPreauthAccountId;
2037
+ const walletPickerSwitch = p.step === "wallet-picker" && p.reason === "switch" && !state.creatingTransfer && !(state.mobileFlow && state.deeplinkUri);
2038
+ const passkeyBlock = state.passkeyConfigLoaded && !state.activeCredentialId;
2039
+ const passkeyVerify = passkeyBlock && state.knownCredentialIds.length > 0 && state.passkeyPopupNeeded;
2040
+ const c1 = state.guestPreauthSetupCompletePending && state.privyReady && state.privyAuthenticated;
2041
+ const c2 = !c1 && guestPreauthPin;
2042
+ const c3 = !c1 && !c2 && guestPostPayLogin;
2043
+ const c4 = !c1 && !c2 && !c3 && transferCompleted && !state.verificationTarget && !needsPasskeyBootstrap;
2044
+ const c5 = !c1 && !c2 && !c3 && !c4 && state.transfer?.status === "FAILED";
2045
+ const c6 = !c1 && !c2 && !c3 && !c4 && !c5 && (state.creatingTransfer || isTransferInFlight(state.transfer));
2046
+ const c7 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && pinSubflow;
2047
+ const c8 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && state.mobileFlow && state.deeplinkUri != null;
2048
+ const c9 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && p.step === "wallet-setup" && p.mobile == null && state.guestPreauthorizing;
2049
+ const c10 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && guestTokenPicker;
2050
+ const c11 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && walletPickerSwitch;
2051
+ const c12 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !state.privyReady;
2052
+ const c13 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && state.privyAuthenticated && !state.activeCredentialId && !state.passkeyConfigLoaded;
2053
+ const c14 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && state.verificationTarget != null && !state.privyAuthenticated;
2054
+ const c15 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && state.loginRequested;
2055
+ const c16 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && passkeyVerify;
2056
+ const c17 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && !c16 && passkeyBlock;
2057
+ 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);
2058
+ 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;
2059
+ 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;
2060
+ const c21 = !c1 && !c2 && !c3 && !c4 && !c5 && !c6 && !c7 && !c8 && !c9 && !c10 && !c11 && !c12 && !c13 && !c14 && !c15 && !c16 && !c17 && !c18 && !c19 && !c20 && state.isGuestFlow;
2061
+ const flags = [
2062
+ c1,
2063
+ c2,
2064
+ c3,
2065
+ c4,
2066
+ c5,
2067
+ c6,
2068
+ c7,
2069
+ c8,
2070
+ c9,
2071
+ c10,
2072
+ c11,
2073
+ c12,
2074
+ c13,
2075
+ c14,
2076
+ c15,
2077
+ c16,
2078
+ c17,
2079
+ c18,
2080
+ c19,
2081
+ c20,
2082
+ c21
2083
+ ];
2084
+ const matchCount = flags.filter(Boolean).length;
2085
+ if (matchCount > 1) {
2086
+ console.error("resolvePhase: multiple exclusive branches matched", {
2087
+ flags: {
2088
+ c1,
2089
+ c2,
2090
+ c3,
2091
+ c4,
2092
+ c5,
2093
+ c6,
2094
+ c7,
2095
+ c8,
2096
+ c9,
2097
+ c10,
2098
+ c11,
2099
+ c12,
2100
+ c13,
2101
+ c14,
2102
+ c15,
2103
+ c16,
2104
+ c17,
2105
+ c18,
2106
+ c19,
2107
+ c20,
2108
+ c21
2109
+ }
2110
+ });
2051
2111
  }
2052
- if (state.mobileFlow && state.deeplinkUri) {
2053
- return {
2112
+ let resolved;
2113
+ if (c1) {
2114
+ resolved = { step: "guest-setup-complete" };
2115
+ } else if (c2) {
2116
+ resolved = p;
2117
+ } else if (c3) {
2118
+ resolved = { step: "login" };
2119
+ } else if (c4) {
2120
+ resolved = { step: "completed", transfer: state.transfer };
2121
+ } else if (c5) {
2122
+ resolved = {
2123
+ step: "failed",
2124
+ transfer: state.transfer,
2125
+ error: state.error ?? "Transfer failed."
2126
+ };
2127
+ } else if (c6) {
2128
+ resolved = { step: "processing", transfer: state.transfer };
2129
+ } else if (c7) {
2130
+ resolved = p;
2131
+ } else if (c8) {
2132
+ resolved = {
2054
2133
  step: "wallet-setup",
2055
2134
  mobile: { deeplinkUri: state.deeplinkUri, providerId: state.selectedProviderId },
2056
2135
  accountId: null
2057
2136
  };
2137
+ } else if (c9) {
2138
+ resolved = p;
2139
+ } else if (c10) {
2140
+ resolved = { step: "guest-token-picker" };
2141
+ } else if (c11) {
2142
+ resolved = p;
2143
+ } else if (c12) {
2144
+ resolved = { step: "initializing" };
2145
+ } else if (c13) {
2146
+ resolved = { step: "initializing" };
2147
+ } else if (c14) {
2148
+ resolved = { step: "otp-verify", target: state.verificationTarget };
2149
+ } else if (c15) {
2150
+ resolved = { step: "login" };
2151
+ } else if (c16) {
2152
+ resolved = { step: "passkey-verify" };
2153
+ } else if (c17) {
2154
+ resolved = { step: "passkey-create", popupFallback: state.passkeyPopupNeeded };
2155
+ } else if (c18) {
2156
+ resolved = { step: "data-loading" };
2157
+ } else if (c19) {
2158
+ resolved = { step: "wallet-picker", reason: "link" };
2159
+ } else if (c20) {
2160
+ resolved = { step: "deposit" };
2161
+ } else if (c21) {
2162
+ resolved = { step: "wallet-picker", reason: "guest-entry" };
2163
+ } else {
2164
+ resolved = { step: "wallet-picker", reason: "entry" };
2058
2165
  }
2059
- if (p.step === "wallet-setup" && p.mobile == null && state.guestPreauthorizing) {
2060
- return p;
2061
- }
2062
- if (state.isGuestFlow && state.selectedProviderId != null && !state.transfer && !state.guestPreauthAccountId) {
2063
- return { step: "guest-token-picker" };
2064
- }
2065
- if (p.step === "wallet-picker" && !state.creatingTransfer && !(state.mobileFlow && state.deeplinkUri)) {
2066
- return p;
2067
- }
2068
- if (!state.privyReady) {
2069
- return { step: "initializing" };
2070
- }
2071
- if (state.privyAuthenticated && !state.activeCredentialId && !state.passkeyConfigLoaded) {
2072
- return { step: "initializing" };
2073
- }
2074
- if (state.verificationTarget && !state.privyAuthenticated) {
2075
- return { step: "otp-verify", target: state.verificationTarget };
2076
- }
2077
- if (state.loginRequested) {
2078
- return { step: "login" };
2079
- }
2080
- if (state.passkeyConfigLoaded && !state.activeCredentialId) {
2081
- if (state.knownCredentialIds.length > 0 && state.passkeyPopupNeeded) {
2082
- return { step: "passkey-verify" };
2083
- }
2084
- return { step: "passkey-create", popupFallback: state.passkeyPopupNeeded };
2085
- }
2086
- if (state.loadingData && state.activeCredentialId && hasActiveWallet(state.accounts)) {
2087
- return { step: "data-loading" };
2088
- }
2089
- if (state.activeCredentialId && !hasActiveWallet(state.accounts) && !state.mobileFlow) {
2090
- return { step: "wallet-picker", reason: "link" };
2091
- }
2092
- if (state.activeCredentialId && hasActiveWallet(state.accounts) && !state.loadingData) {
2093
- return { step: "deposit" };
2094
- }
2095
- if (state.isGuestFlow) {
2096
- return { step: "wallet-picker", reason: "guest-entry" };
2097
- }
2098
- return { step: "wallet-picker", reason: "entry" };
2166
+ return resolved;
2099
2167
  }
2100
2168
 
2101
2169
  // src/paymentReducer.ts
@@ -4361,13 +4429,13 @@ var waitHintStyle = (color) => ({
4361
4429
  color,
4362
4430
  margin: 0
4363
4431
  });
4364
- var MIN_DEPOSIT = 0.25;
4365
4432
  function DepositScreen({
4366
4433
  merchantName,
4367
4434
  availableBalance,
4368
4435
  remainingLimit,
4369
4436
  tokenCount,
4370
4437
  initialAmount,
4438
+ minDepositFloor,
4371
4439
  processing,
4372
4440
  error,
4373
4441
  onDeposit,
@@ -4403,9 +4471,9 @@ function DepositScreen({
4403
4471
  const selectedProviderName = selectedAccount?.name ?? "Wallet";
4404
4472
  const selectedProviderLogo = KNOWN_LOGOS[selectedProviderName.toLowerCase()];
4405
4473
  const totalAccountBalance = selectedAccount ? selectedAccount.wallets.reduce((sum, w) => sum + w.balance.available.amount, 0) : availableBalance;
4406
- const isLowBalance = availableBalance < MIN_DEPOSIT;
4474
+ const isLowBalance = availableBalance < minDepositFloor;
4407
4475
  const exceedsLimit = remainingLimit != null && amount > remainingLimit && !isLowBalance;
4408
- const canDeposit = amount >= MIN_DEPOSIT && !exceedsLimit && !isLowBalance && !processing;
4476
+ const canDeposit = amount >= minDepositFloor && !exceedsLimit && !isLowBalance && !processing;
4409
4477
  return /* @__PURE__ */ jsxRuntime.jsxs(
4410
4478
  ScreenLayout,
4411
4479
  {
@@ -4540,7 +4608,7 @@ function DepositScreen({
4540
4608
  "Your wallet balance is $",
4541
4609
  availableBalance.toFixed(2),
4542
4610
  " \u2014 you need at least $",
4543
- MIN_DEPOSIT.toFixed(2),
4611
+ minDepositFloor.toFixed(2),
4544
4612
  " to deposit via One-Tap."
4545
4613
  ] }),
4546
4614
  error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: errorBannerStyle5(tokens), children: error })
@@ -6117,6 +6185,7 @@ var DEPOSIT_SCREENS = /* @__PURE__ */ new Set([
6117
6185
  "processing",
6118
6186
  "success"
6119
6187
  ]);
6188
+ var DEFAULT_MIN_DEPOSIT_USD = 0.25;
6120
6189
  function getFlowPhase(screen, phase) {
6121
6190
  if (LINK_SCREENS.has(screen)) return "link";
6122
6191
  if (DEPOSIT_SCREENS.has(screen)) return "deposit";
@@ -6325,6 +6394,7 @@ function StepRendererContent({
6325
6394
  }
6326
6395
  case "deposit": {
6327
6396
  const parsedAmt = depositAmount != null ? depositAmount : 5;
6397
+ const minDepositFloor = depositAmount != null ? depositAmount : DEFAULT_MIN_DEPOSIT_USD;
6328
6398
  return /* @__PURE__ */ jsxRuntime.jsx(
6329
6399
  DepositScreen,
6330
6400
  {
@@ -6348,7 +6418,8 @@ function StepRendererContent({
6348
6418
  onAddProvider: () => handlers.onSetPhase({ step: "wallet-picker", reason: "switch" }),
6349
6419
  onSelectToken: handlers.onSelectToken,
6350
6420
  selectedSourceLabel,
6351
- selectedTokenSymbol: selectedSource?.token.symbol
6421
+ selectedTokenSymbol: selectedSource?.token.symbol,
6422
+ minDepositFloor
6352
6423
  }
6353
6424
  );
6354
6425
  }
@@ -6874,8 +6945,9 @@ function useTransferHandlers(deps) {
6874
6945
  dispatch({ type: "ACCOUNTS_RELOADED", accounts: accts, providers: prov, defaults });
6875
6946
  }, [getAccessToken, activeCredentialId, selectedAccountId, apiBaseUrl, depositAmount, dispatch]);
6876
6947
  const handlePay = react.useCallback(async (payAmount, sourceOverrides) => {
6877
- if (isNaN(payAmount) || payAmount < MIN_SEND_AMOUNT_USD) {
6878
- dispatch({ type: "SET_ERROR", error: `Minimum amount is $${MIN_SEND_AMOUNT_USD.toFixed(2)}.` });
6948
+ const minUsd = effectiveMinTransferAmountUsd(depositAmount);
6949
+ if (isNaN(payAmount) || payAmount < minUsd) {
6950
+ dispatch({ type: "SET_ERROR", error: `Minimum amount is $${minUsd.toFixed(2)}.` });
6879
6951
  return;
6880
6952
  }
6881
6953
  if (!sourceOverrides?.sourceId && !sourceId) {
@@ -6954,7 +7026,8 @@ function useTransferHandlers(deps) {
6954
7026
  onComplete,
6955
7027
  idempotencyKey,
6956
7028
  merchantAuthorization,
6957
- dispatch
7029
+ dispatch,
7030
+ depositAmount
6958
7031
  ]);
6959
7032
  const handleConfirmSign = react.useCallback(async () => {
6960
7033
  const t = transfer ?? polling.transfer;
@@ -7906,7 +7979,9 @@ function useOneTapSetupHandlers(deps) {
7906
7979
  authExecutor,
7907
7980
  selectSourceChainName,
7908
7981
  selectSourceTokenSymbol,
7909
- authorizationSessionIdForGuest
7982
+ authorizationSessionIdForGuest,
7983
+ guestPostPayPreauth,
7984
+ guestPreauthAccountId
7910
7985
  } = deps;
7911
7986
  const [savingOneTapLimit, setSavingOneTapLimit] = react.useState(false);
7912
7987
  const handleSetupOneTap = react.useCallback(async (limit) => {
@@ -7923,6 +7998,19 @@ function useOneTapSetupHandlers(deps) {
7923
7998
  if (!token) throw new Error("Not authenticated");
7924
7999
  await updateUserConfig(apiBaseUrl, token, { defaultAllowance: limit });
7925
8000
  }
8001
+ const willResolveSession = authExecutor.pendingSelectSource != null || authExecutor.pendingOneTapSetup != null;
8002
+ if (guestPostPayPreauth && willResolveSession) {
8003
+ dispatch({ type: "REQUEST_LOGIN" });
8004
+ if (guestPreauthAccountId != null) {
8005
+ const intent = {
8006
+ step: "wallet-setup",
8007
+ mobile: null,
8008
+ accountId: guestPreauthAccountId,
8009
+ guestDesktopExtension: true
8010
+ };
8011
+ dispatch({ type: "SET_USER_INTENT", intent });
8012
+ }
8013
+ }
7926
8014
  if (authExecutor.pendingSelectSource) {
7927
8015
  const action = authExecutor.pendingSelectSource;
7928
8016
  const recommended = action.metadata?.recommended;
@@ -7942,7 +8030,9 @@ function useOneTapSetupHandlers(deps) {
7942
8030
  } else if (authExecutor.pendingOneTapSetup) {
7943
8031
  authExecutor.resolveOneTapSetup();
7944
8032
  }
7945
- dispatch({ type: "SET_USER_INTENT", intent: { step: "deposit" } });
8033
+ if (!guestPostPayPreauth || !willResolveSession) {
8034
+ dispatch({ type: "SET_USER_INTENT", intent: { step: "deposit" } });
8035
+ }
7946
8036
  } catch (err) {
7947
8037
  captureException(err);
7948
8038
  dispatch({
@@ -7959,7 +8049,9 @@ function useOneTapSetupHandlers(deps) {
7959
8049
  dispatch,
7960
8050
  selectSourceChainName,
7961
8051
  selectSourceTokenSymbol,
7962
- authorizationSessionIdForGuest
8052
+ authorizationSessionIdForGuest,
8053
+ guestPostPayPreauth,
8054
+ guestPreauthAccountId
7963
8055
  ]);
7964
8056
  return {
7965
8057
  handleSetupOneTap,
@@ -9019,6 +9111,15 @@ function BlinkPaymentInner({
9019
9111
  guestSessionToken: state.guestSessionToken,
9020
9112
  selectedProviderId: state.selectedProviderId
9021
9113
  });
9114
+ const guestPostPayPreauth = react.useMemo(
9115
+ () => !!state.guestPreauthSessionId && state.isGuestFlow || state.guestPreauthorizing && isDesktop,
9116
+ [
9117
+ state.guestPreauthSessionId,
9118
+ state.isGuestFlow,
9119
+ state.guestPreauthorizing,
9120
+ isDesktop
9121
+ ]
9122
+ );
9022
9123
  const oneTapSetup = useOneTapSetupHandlers({
9023
9124
  dispatch,
9024
9125
  getAccessToken,
@@ -9026,7 +9127,9 @@ function BlinkPaymentInner({
9026
9127
  authExecutor,
9027
9128
  selectSourceChainName: sourceSelection.selectSourceChainName,
9028
9129
  selectSourceTokenSymbol: sourceSelection.selectSourceTokenSymbol,
9029
- authorizationSessionIdForGuest: state.guestPreauthSessionId
9130
+ authorizationSessionIdForGuest: state.guestPreauthSessionId,
9131
+ guestPostPayPreauth,
9132
+ guestPreauthAccountId: state.guestPreauthAccountId
9030
9133
  });
9031
9134
  const guestTransfer = useGuestTransferHandlers({
9032
9135
  dispatch,