@swype-org/react-sdk 0.1.258 → 0.1.259

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
@@ -2538,6 +2538,23 @@ function applyAction(state, action) {
2538
2538
  };
2539
2539
  case "GUEST_PREAUTH_SETUP_COMPLETE_DISMISSED":
2540
2540
  return { ...state, guestPreauthSetupCompletePending: false };
2541
+ case "RESTORE_GUEST_PREAUTH_MOBILE":
2542
+ return {
2543
+ ...state,
2544
+ transfer: action.transfer,
2545
+ isGuestFlow: true,
2546
+ guestSessionToken: action.guestSessionToken,
2547
+ guestTransferId: action.transfer.id,
2548
+ guestPreauthAccountId: action.guestPreauthAccountId,
2549
+ guestPreauthSessionId: action.guestPreauthSessionId,
2550
+ selectedProviderId: action.selectedProviderId,
2551
+ selectedAccountId: action.guestPreauthAccountId,
2552
+ selectedWalletId: null,
2553
+ selectedTokenSymbol: null,
2554
+ mobileFlow: action.mobileOpen,
2555
+ deeplinkUri: action.mobileOpen ? action.deeplinkUri : null,
2556
+ error: null
2557
+ };
2541
2558
  // ── User intent & error ──────────────────────────────────────
2542
2559
  case "SET_USER_INTENT":
2543
2560
  return { ...state, phase: action.intent };
@@ -4868,11 +4885,9 @@ function SuccessScreen({
4868
4885
  footer: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4869
4886
  /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onClick: onDone, children: succeeded ? "Done" : "Try again" }),
4870
4887
  succeeded && onPreauthorize && /* @__PURE__ */ jsxRuntime.jsx(
4871
- "button",
4888
+ PrimaryButton,
4872
4889
  {
4873
- type: "button",
4874
4890
  onClick: onPreauthorize,
4875
- style: preauthorizeStyle(tokens.accent, tokens.border),
4876
4891
  children: "Preauthorize future transfers"
4877
4892
  }
4878
4893
  ),
@@ -5000,19 +5015,6 @@ var upsellLinkStyle = (color) => ({
5000
5015
  fontFamily: "inherit",
5001
5016
  padding: 0
5002
5017
  });
5003
- var preauthorizeStyle = (accentColor, borderColor) => ({
5004
- width: "100%",
5005
- padding: "14px 0",
5006
- marginTop: 8,
5007
- background: "transparent",
5008
- border: `1px solid ${borderColor}`,
5009
- borderRadius: 20,
5010
- color: accentColor,
5011
- fontWeight: 600,
5012
- fontSize: "0.92rem",
5013
- cursor: "pointer",
5014
- fontFamily: "inherit"
5015
- });
5016
5018
  var manageStyle = (color) => ({
5017
5019
  background: "transparent",
5018
5020
  border: "none",
@@ -7314,6 +7316,7 @@ function useProviderHandlers(deps) {
7314
7316
  merchantAuthorization,
7315
7317
  destination,
7316
7318
  guestSessionToken,
7319
+ guestTransferId,
7317
7320
  selectedProviderId
7318
7321
  } = deps;
7319
7322
  const wagmiConfig2 = wagmi.useConfig();
@@ -7747,7 +7750,9 @@ function useProviderHandlers(deps) {
7747
7750
  deeplinkUri: created.sessionUri,
7748
7751
  providerId: selectedProviderId,
7749
7752
  isSetup: true,
7750
- guestSessionToken
7753
+ guestSessionToken,
7754
+ transferId: guestTransferId ?? void 0,
7755
+ isGuestPreauth: true
7751
7756
  });
7752
7757
  triggerDeeplink(created.sessionUri);
7753
7758
  dispatch({ type: "MOBILE_DEEPLINK_READY", deeplinkUri: created.sessionUri });
@@ -7770,6 +7775,7 @@ function useProviderHandlers(deps) {
7770
7775
  }
7771
7776
  }, [
7772
7777
  guestSessionToken,
7778
+ guestTransferId,
7773
7779
  selectedProviderId,
7774
7780
  providers,
7775
7781
  apiBaseUrl,
@@ -8606,6 +8612,66 @@ function useMobilePollingEffect(deps) {
8606
8612
  if (!polledTransfer || polledTransfer.status !== "AUTHORIZED") return;
8607
8613
  void handleAuthorizedMobileReturnRef.current(polledTransfer, mobileSetupFlowRef.current);
8608
8614
  }, [state.mobileFlow, polling.transfer, handlingMobileReturnRef, mobileSetupFlowRef]);
8615
+ react.useEffect(() => {
8616
+ if (!state.mobileFlow || !mobileSetupFlowRef.current) return;
8617
+ if (!setupAccountIdRef.current) return;
8618
+ if (!state.guestPreauthSessionId || !state.isGuestFlow) return;
8619
+ if (state.activeCredentialId) return;
8620
+ const sessionId = state.guestPreauthSessionId;
8621
+ let cancelled = false;
8622
+ let completedGuestPreauth = false;
8623
+ const POLL_INTERVAL_MS = 3e3;
8624
+ const completeGuestPreauthSetup = async () => {
8625
+ if (completedGuestPreauth) return;
8626
+ completedGuestPreauth = true;
8627
+ cancelled = true;
8628
+ mobileSetupFlowRef.current = false;
8629
+ setupAccountIdRef.current = null;
8630
+ clearMobileFlowState();
8631
+ try {
8632
+ await reloadAccounts();
8633
+ } catch {
8634
+ }
8635
+ dispatch({ type: "MOBILE_SETUP_COMPLETE" });
8636
+ };
8637
+ const pollGuestPreauthSession = async () => {
8638
+ try {
8639
+ if (cancelled) return;
8640
+ const session = await fetchAuthorizationSession(apiBaseUrl, sessionId);
8641
+ if (cancelled) return;
8642
+ if (session.status === "AUTHORIZED") {
8643
+ await completeGuestPreauthSetup();
8644
+ }
8645
+ } catch {
8646
+ }
8647
+ };
8648
+ pollGuestPreauthSession();
8649
+ const intervalId = window.setInterval(pollGuestPreauthSession, POLL_INTERVAL_MS);
8650
+ const handleVisibility = () => {
8651
+ if (document.visibilityState === "visible" && !cancelled) void pollGuestPreauthSession();
8652
+ };
8653
+ const handlePageShow = (e) => {
8654
+ if (e.persisted && !cancelled) void pollGuestPreauthSession();
8655
+ };
8656
+ document.addEventListener("visibilitychange", handleVisibility);
8657
+ window.addEventListener("pageshow", handlePageShow);
8658
+ return () => {
8659
+ cancelled = true;
8660
+ window.clearInterval(intervalId);
8661
+ document.removeEventListener("visibilitychange", handleVisibility);
8662
+ window.removeEventListener("pageshow", handlePageShow);
8663
+ };
8664
+ }, [
8665
+ state.mobileFlow,
8666
+ state.activeCredentialId,
8667
+ state.guestPreauthSessionId,
8668
+ state.isGuestFlow,
8669
+ apiBaseUrl,
8670
+ reloadAccounts,
8671
+ dispatch,
8672
+ mobileSetupFlowRef,
8673
+ setupAccountIdRef
8674
+ ]);
8609
8675
  react.useEffect(() => {
8610
8676
  if (!state.mobileFlow || !mobileSetupFlowRef.current) return;
8611
8677
  if (!state.activeCredentialId || !setupAccountIdRef.current) return;
@@ -8736,6 +8802,63 @@ function useMobilePollingEffect(deps) {
8736
8802
  pollingTransferIdRef
8737
8803
  ]);
8738
8804
  }
8805
+ var guestPreauthRestoreAttemptedKeys = /* @__PURE__ */ new Set();
8806
+ function guestPreauthRestoreKey(sessionId, transferId) {
8807
+ return `${sessionId}:${transferId}`;
8808
+ }
8809
+ function useGuestPreauthMobileRestoreEffect(deps) {
8810
+ const {
8811
+ dispatch,
8812
+ apiBaseUrl,
8813
+ privyReady,
8814
+ authenticated,
8815
+ mobileSetupFlowRef,
8816
+ setupAccountIdRef
8817
+ } = deps;
8818
+ react.useEffect(() => {
8819
+ if (!privyReady || authenticated) return;
8820
+ const persisted = loadMobileFlowState();
8821
+ if (!persisted?.isGuestPreauth || !persisted.transferId || !persisted.guestSessionToken || !persisted.sessionId || !persisted.deeplinkUri || persisted.accountId == null) {
8822
+ return;
8823
+ }
8824
+ const key = guestPreauthRestoreKey(persisted.sessionId, persisted.transferId);
8825
+ if (guestPreauthRestoreAttemptedKeys.has(key)) return;
8826
+ guestPreauthRestoreAttemptedKeys.add(key);
8827
+ let cancelled = false;
8828
+ void (async () => {
8829
+ try {
8830
+ const [transfer, session] = await Promise.all([
8831
+ getGuestTransfer(apiBaseUrl, persisted.transferId, persisted.guestSessionToken),
8832
+ fetchAuthorizationSession(apiBaseUrl, persisted.sessionId)
8833
+ ]);
8834
+ if (cancelled) return;
8835
+ const mobileOpen = session.status !== "AUTHORIZED";
8836
+ dispatch({
8837
+ type: "RESTORE_GUEST_PREAUTH_MOBILE",
8838
+ transfer,
8839
+ guestSessionToken: persisted.guestSessionToken,
8840
+ guestPreauthAccountId: persisted.accountId,
8841
+ guestPreauthSessionId: persisted.sessionId,
8842
+ selectedProviderId: persisted.providerId,
8843
+ deeplinkUri: persisted.deeplinkUri,
8844
+ mobileOpen
8845
+ });
8846
+ if (mobileOpen) {
8847
+ mobileSetupFlowRef.current = true;
8848
+ setupAccountIdRef.current = persisted.accountId;
8849
+ } else {
8850
+ clearMobileFlowState();
8851
+ }
8852
+ } catch (err) {
8853
+ guestPreauthRestoreAttemptedKeys.delete(key);
8854
+ captureException(err);
8855
+ }
8856
+ })();
8857
+ return () => {
8858
+ cancelled = true;
8859
+ };
8860
+ }, [privyReady, authenticated, apiBaseUrl, dispatch, mobileSetupFlowRef, setupAccountIdRef]);
8861
+ }
8739
8862
  function useSelectSourceEffect(deps) {
8740
8863
  const {
8741
8864
  pendingSelectSourceAction,
@@ -9111,6 +9234,7 @@ function BlinkPaymentInner({
9111
9234
  merchantAuthorization,
9112
9235
  destination,
9113
9236
  guestSessionToken: state.guestSessionToken,
9237
+ guestTransferId: state.guestTransferId,
9114
9238
  selectedProviderId: state.selectedProviderId
9115
9239
  });
9116
9240
  const guestPostPayPreauth = react.useMemo(
@@ -9172,6 +9296,14 @@ function BlinkPaymentInner({
9172
9296
  }
9173
9297
  }, [depositAmount, dispatch]);
9174
9298
  usePrivySessionSyncEffect({ dispatch, ready, authenticated });
9299
+ useGuestPreauthMobileRestoreEffect({
9300
+ dispatch,
9301
+ apiBaseUrl,
9302
+ privyReady: state.privyReady,
9303
+ authenticated,
9304
+ mobileSetupFlowRef: mobileFlowRefs.mobileSetupFlowRef,
9305
+ setupAccountIdRef: mobileFlowRefs.setupAccountIdRef
9306
+ });
9175
9307
  useOtpEffects({
9176
9308
  state,
9177
9309
  dispatch,