@swype-org/react-sdk 0.2.375 → 0.2.377

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
@@ -13,9 +13,12 @@ var core = require('@wagmi/core');
13
13
  var viem = require('viem');
14
14
  var utils = require('viem/utils');
15
15
  var QRCode = require('qrcode');
16
+ var posthog = require('posthog-js');
16
17
  var Select = require('@radix-ui/react-select');
17
18
 
18
19
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
20
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
21
+
19
22
  function _interopNamespace(e) {
20
23
  if (e && e.__esModule) return e;
21
24
  var n = Object.create(null);
@@ -35,6 +38,7 @@ function _interopNamespace(e) {
35
38
  }
36
39
 
37
40
  var QRCode__namespace = /*#__PURE__*/_interopNamespace(QRCode);
41
+ var posthog__default = /*#__PURE__*/_interopDefault(posthog);
38
42
  var Select__namespace = /*#__PURE__*/_interopNamespace(Select);
39
43
 
40
44
  var __defProp = Object.defineProperty;
@@ -1577,11 +1581,11 @@ function detachAccountChangeListeners() {
1577
1581
  accountChangeBinding = null;
1578
1582
  }
1579
1583
  function providerKey(selection) {
1580
- const providerName = selection.providerName?.trim();
1581
- if (!providerName) {
1584
+ const providerName2 = selection.providerName?.trim();
1585
+ if (!providerName2) {
1582
1586
  throw new Error("Solana wallet metadata is missing providerName.");
1583
1587
  }
1584
- return `${selection.providerId ?? ""}:${providerName.toLowerCase()}`;
1588
+ return `${selection.providerId ?? ""}:${providerName2.toLowerCase()}`;
1585
1589
  }
1586
1590
  function assertSupportedProvider(selection) {
1587
1591
  const name = selection.providerName?.trim().toLowerCase();
@@ -4149,14 +4153,14 @@ function isBatchableAction(action) {
4149
4153
  return BATCHABLE_ACTION_TYPES.has(action.type);
4150
4154
  }
4151
4155
  function getSolanaWalletSelection(action) {
4152
- const providerName = action.metadata?.providerName;
4153
- if (typeof providerName !== "string" || providerName.trim() === "") {
4156
+ const providerName2 = action.metadata?.providerName;
4157
+ if (typeof providerName2 !== "string" || providerName2.trim() === "") {
4154
4158
  throw new Error(`${action.type} metadata is missing providerName.`);
4155
4159
  }
4156
4160
  const providerId = action.metadata?.providerId;
4157
4161
  return {
4158
4162
  ...typeof providerId === "string" && providerId.trim() !== "" ? { providerId } : {},
4159
- providerName
4163
+ providerName: providerName2
4160
4164
  };
4161
4165
  }
4162
4166
  function isPhantomEvmProviderAvailable() {
@@ -8467,6 +8471,209 @@ function applyAction(state, action) {
8467
8471
  return state;
8468
8472
  }
8469
8473
  }
8474
+ var BLOCKED_SUBSTRINGS = [
8475
+ "bearer",
8476
+ "signature",
8477
+ "signedpayload",
8478
+ "userop",
8479
+ "jwt",
8480
+ "secret",
8481
+ "password",
8482
+ "privatekey",
8483
+ "mnemonic",
8484
+ "seedphrase"
8485
+ ];
8486
+ function isBlockedKey(key) {
8487
+ const lower = key.toLowerCase();
8488
+ if (lower === "token" || lower.endsWith("token")) return true;
8489
+ return BLOCKED_SUBSTRINGS.some((blocked) => lower.includes(blocked));
8490
+ }
8491
+ function isReady() {
8492
+ return typeof posthog__default.default !== "undefined" && posthog__default.default.__loaded === true;
8493
+ }
8494
+ function sanitizeProps(props) {
8495
+ if (!props) return props;
8496
+ const clean = {};
8497
+ for (const [key, value] of Object.entries(props)) {
8498
+ if (isBlockedKey(key)) continue;
8499
+ if (value === void 0) continue;
8500
+ clean[key] = value;
8501
+ }
8502
+ return clean;
8503
+ }
8504
+ function registerSuperProps(props) {
8505
+ if (!isReady()) return;
8506
+ try {
8507
+ posthog__default.default.register(sanitizeProps(props) ?? {});
8508
+ } catch {
8509
+ }
8510
+ }
8511
+ function track(event, props) {
8512
+ if (!isReady()) return;
8513
+ try {
8514
+ posthog__default.default.capture(event, sanitizeProps(props));
8515
+ } catch {
8516
+ }
8517
+ }
8518
+ function identifyUser(privyUserId, props) {
8519
+ if (!isReady() || !privyUserId) return;
8520
+ try {
8521
+ posthog__default.default.identify(privyUserId, sanitizeProps(props));
8522
+ } catch {
8523
+ }
8524
+ }
8525
+ function resolveAnalyticsEnvironment(opts) {
8526
+ const explicit = opts.explicit?.trim();
8527
+ if (explicit) return explicit;
8528
+ const raw = opts.apiBaseUrl ?? "";
8529
+ let host = raw;
8530
+ try {
8531
+ host = new URL(raw).hostname;
8532
+ } catch {
8533
+ }
8534
+ const h = host.toLowerCase();
8535
+ if (h === "" || h.includes("localhost") || h.startsWith("127.")) return "development";
8536
+ if (h.includes("smokebox")) return "smokebox";
8537
+ if (h.includes("sandbox")) return "sandbox";
8538
+ if (h.includes("staging")) return "staging";
8539
+ return "production";
8540
+ }
8541
+ function resetUser() {
8542
+ if (!isReady()) return;
8543
+ try {
8544
+ posthog__default.default.reset();
8545
+ } catch {
8546
+ }
8547
+ }
8548
+
8549
+ // src/analyticsEvents.ts
8550
+ function providerName(state, providerId) {
8551
+ return state.providers.find((p) => p.id === providerId)?.name;
8552
+ }
8553
+ function amountUsd(transfer) {
8554
+ return transfer.amount?.currency === "USD" ? transfer.amount.amount : transfer.amount?.amount;
8555
+ }
8556
+ function sourceChain(transfer) {
8557
+ return transfer.sources?.[0]?.provider?.chainFamily;
8558
+ }
8559
+ function trackAction(action, state, ctx) {
8560
+ const device = ctx.device;
8561
+ switch (action.type) {
8562
+ case "PASSKEY_ACTIVATED":
8563
+ track("auth_succeeded", { method: "passkey", device });
8564
+ break;
8565
+ case "SELECT_PROVIDER":
8566
+ track("wallet_provider_selected", {
8567
+ device,
8568
+ providerId: action.providerId,
8569
+ providerName: providerName(state, action.providerId),
8570
+ transport: device === "desktop" ? "inline" : "deeplink"
8571
+ });
8572
+ break;
8573
+ case "MOBILE_DEEPLINK_READY":
8574
+ track("wallet_deeplink_opened", { device });
8575
+ break;
8576
+ case "SET_SETUP_DEPOSIT_TOKEN":
8577
+ track("token_selected", {
8578
+ device,
8579
+ tokenSymbol: action.symbol,
8580
+ chainName: action.chainName
8581
+ });
8582
+ break;
8583
+ case "FINALIZE_AMOUNT": {
8584
+ const parsed = Number(state.amount);
8585
+ track("amount_entered", {
8586
+ device,
8587
+ amountUsd: Number.isFinite(parsed) ? parsed : void 0
8588
+ });
8589
+ break;
8590
+ }
8591
+ case "PAY_STARTED":
8592
+ track("deposit_clicked", { device });
8593
+ break;
8594
+ case "TRANSFER_CREATED":
8595
+ track("transfer_created", {
8596
+ device,
8597
+ chainFamily: sourceChain(action.transfer)
8598
+ });
8599
+ break;
8600
+ case "TRANSFER_SIGNED":
8601
+ track("transfer_signed", { device });
8602
+ break;
8603
+ case "TRANSFER_COMPLETED":
8604
+ track("transfer_completed", {
8605
+ device,
8606
+ amountUsd: amountUsd(action.transfer),
8607
+ chainFamily: sourceChain(action.transfer)
8608
+ });
8609
+ break;
8610
+ case "CONFIRM_SIGN_SUCCESS":
8611
+ track("confirm_sign_success", { device });
8612
+ break;
8613
+ case "MOBILE_SETUP_COMPLETE":
8614
+ track("wallet_setup_complete", { device });
8615
+ break;
8616
+ case "TRANSFER_FAILED":
8617
+ track("transfer_error", {
8618
+ device,
8619
+ type: "transfer_failed",
8620
+ stage: "processing",
8621
+ message: action.error
8622
+ });
8623
+ break;
8624
+ case "PROCESSING_TIMEOUT":
8625
+ track("transfer_error", {
8626
+ device,
8627
+ type: "processing_timeout",
8628
+ stage: "processing",
8629
+ message: action.error
8630
+ });
8631
+ break;
8632
+ case "SIGN_PAYLOAD_EXPIRED":
8633
+ track("transfer_error", {
8634
+ device,
8635
+ type: "sign_payload_expired",
8636
+ stage: "signing",
8637
+ message: action.error
8638
+ });
8639
+ break;
8640
+ case "PAY_ERROR":
8641
+ track("transfer_error", {
8642
+ device,
8643
+ type: "pay_error",
8644
+ stage: "creation",
8645
+ message: action.error
8646
+ });
8647
+ break;
8648
+ }
8649
+ }
8650
+ function useAnalyticsScreenView(phase, device) {
8651
+ const lastScreenRef = react.useRef(null);
8652
+ const screen = screenForPhase(phase);
8653
+ react.useEffect(() => {
8654
+ if (lastScreenRef.current === screen) return;
8655
+ lastScreenRef.current = screen;
8656
+ track("screen_viewed", { screen, phase: phase.step, device });
8657
+ }, [screen, phase.step, device]);
8658
+ }
8659
+ function usePostHogIdentify() {
8660
+ const { ready, authenticated, user } = reactAuth.usePrivy();
8661
+ const identifiedIdRef = react.useRef(null);
8662
+ react.useEffect(() => {
8663
+ if (!ready) return;
8664
+ if (authenticated && user?.id) {
8665
+ if (identifiedIdRef.current !== user.id) {
8666
+ identifyUser(user.id);
8667
+ identifiedIdRef.current = user.id;
8668
+ }
8669
+ return;
8670
+ }
8671
+ if (identifiedIdRef.current !== null) {
8672
+ resetUser();
8673
+ identifiedIdRef.current = null;
8674
+ }
8675
+ }, [ready, authenticated, user?.id]);
8676
+ }
8470
8677
 
8471
8678
  // src/setupDepositConfirmation.ts
8472
8679
  function deriveEffectiveSetupSource(setupDepositToken, setupSelectedSourceOption) {
@@ -9331,6 +9538,7 @@ var USDH_LOGO = svgToDataUri(USDH_SVG);
9331
9538
  var ETH_LOGO = "https://assets.relay.link/icons/currencies/eth.png";
9332
9539
  var SOL_LOGO = "https://assets.relay.link/icons/currencies/sol.png";
9333
9540
  var MON_LOGO = "https://assets.relay.link/icons/currencies/mon.png";
9541
+ var BNB_LOGO = "https://assets.relay.link/icons/currencies/bnb.png";
9334
9542
  var KNOWN_LOGOS = {
9335
9543
  metamask: METAMASK_LOGO,
9336
9544
  base: BASE_LOGO,
@@ -9349,7 +9557,8 @@ var TOKEN_LOGOS = {
9349
9557
  USDH: USDH_LOGO,
9350
9558
  ETH: ETH_LOGO,
9351
9559
  SOL: SOL_LOGO,
9352
- MON: MON_LOGO
9560
+ MON: MON_LOGO,
9561
+ BNB: BNB_LOGO
9353
9562
  };
9354
9563
  var CHAIN_LOGOS = {
9355
9564
  base: BASE_CHAIN_LOGO,
@@ -13123,7 +13332,7 @@ var lockBannerTextStyle = (color) => ({
13123
13332
  function ManualTransferPasskeyScreen({
13124
13333
  onCreatePasskey,
13125
13334
  onNoThanks,
13126
- amountUsd,
13335
+ amountUsd: amountUsd2,
13127
13336
  loading = false,
13128
13337
  error,
13129
13338
  onBack,
@@ -17827,6 +18036,7 @@ function useAuthHandlers(dispatch, apiBaseUrl, popupAuthRef) {
17827
18036
  dispatch({ type: "PASSKEY_ACTIVATED", credentialId: result.credentialId, publicKey: result.publicKey });
17828
18037
  dispatch({ type: "SYNC_PRIVY_SESSION", ready: true, authenticated: true });
17829
18038
  window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, result.credentialId);
18039
+ track("login_succeeded", { method: "passkey", popup: true });
17830
18040
  } catch (err) {
17831
18041
  captureException(err);
17832
18042
  dispatch({
@@ -17839,6 +18049,7 @@ function useAuthHandlers(dispatch, apiBaseUrl, popupAuthRef) {
17839
18049
  }, [dispatch, popupAuthRef]);
17840
18050
  const { loginWithPasskey, state: loginState } = reactAuth.useLoginWithPasskey({
17841
18051
  onComplete: (params) => {
18052
+ track("login_succeeded", { method: "passkey", popup: false });
17842
18053
  handleAuthComplete(params.user);
17843
18054
  },
17844
18055
  onError: (error) => {
@@ -17867,6 +18078,7 @@ function useAuthHandlers(dispatch, apiBaseUrl, popupAuthRef) {
17867
18078
  dispatch({ type: "PASSKEY_ACTIVATED", credentialId: result.credentialId, publicKey: result.publicKey });
17868
18079
  dispatch({ type: "SYNC_PRIVY_SESSION", ready: true, authenticated: true });
17869
18080
  window.localStorage.setItem(ACTIVE_CREDENTIAL_STORAGE_KEY, result.credentialId);
18081
+ track("signup_succeeded", { method: "passkey", popup: true });
17870
18082
  } catch (err) {
17871
18083
  captureException(err);
17872
18084
  dispatch({
@@ -17879,6 +18091,7 @@ function useAuthHandlers(dispatch, apiBaseUrl, popupAuthRef) {
17879
18091
  }, [dispatch, popupAuthRef]);
17880
18092
  const { signupWithPasskey, state: signupState } = reactAuth.useSignupWithPasskey({
17881
18093
  onComplete: (params) => {
18094
+ track("signup_succeeded", { method: "passkey", popup: false });
17882
18095
  handleAuthComplete(params.user);
17883
18096
  },
17884
18097
  onError: (error) => {
@@ -18649,7 +18862,7 @@ function useProviderHandlers(deps) {
18649
18862
  return null;
18650
18863
  }
18651
18864
  const provider = providers.find((p) => p.id === providerId);
18652
- const providerName = provider?.name ?? "Wallet";
18865
+ const providerName2 = provider?.name ?? "Wallet";
18653
18866
  try {
18654
18867
  const token = await getAccessToken();
18655
18868
  if (!token) throw new Error("Not authenticated");
@@ -18657,7 +18870,7 @@ function useProviderHandlers(deps) {
18657
18870
  const accountId = crypto.randomUUID();
18658
18871
  const account = await createAccount(apiBaseUrl, token, {
18659
18872
  id: accountId,
18660
- name: providerName,
18873
+ name: providerName2,
18661
18874
  credentialId: activeCredentialId,
18662
18875
  providerId,
18663
18876
  ...merchantAuthorization ? {
@@ -18706,7 +18919,7 @@ function useProviderHandlers(deps) {
18706
18919
  return;
18707
18920
  }
18708
18921
  const provider = providers.find((p) => p.id === providerId);
18709
- const providerName = provider?.name ?? "Wallet";
18922
+ const providerName2 = provider?.name ?? "Wallet";
18710
18923
  let shouldRestoreDesktopSelectionOnError = shouldSnapshotDesktopSelection;
18711
18924
  try {
18712
18925
  await resetWalletConnect();
@@ -18729,7 +18942,7 @@ function useProviderHandlers(deps) {
18729
18942
  const newAccountId = crypto.randomUUID();
18730
18943
  const account = await createAccount(apiBaseUrl, token, {
18731
18944
  id: newAccountId,
18732
- name: providerName,
18945
+ name: providerName2,
18733
18946
  credentialId: activeCredentialId,
18734
18947
  providerId,
18735
18948
  ...merchantAuthorization ? {
@@ -20907,7 +21120,7 @@ function BlinkPaymentInner({
20907
21120
  useWalletConnector: useWalletConnectorProp,
20908
21121
  userAgent: typeof navigator === "undefined" ? void 0 : navigator.userAgent
20909
21122
  });
20910
- const [state, dispatch] = react.useReducer(
21123
+ const [state, rawDispatch] = react.useReducer(
20911
21124
  paymentReducer,
20912
21125
  {
20913
21126
  depositAmount,
@@ -20917,6 +21130,30 @@ function BlinkPaymentInner({
20917
21130
  },
20918
21131
  createInitialState
20919
21132
  );
21133
+ const device = isDesktop ? "desktop" : "mobile";
21134
+ const stateRef = react.useRef(state);
21135
+ stateRef.current = state;
21136
+ const dispatch = react.useCallback(
21137
+ (action) => {
21138
+ trackAction(action, stateRef.current, { device });
21139
+ rawDispatch(action);
21140
+ },
21141
+ [device]
21142
+ );
21143
+ usePostHogIdentify();
21144
+ useAnalyticsScreenView(state.phase, device);
21145
+ const flowOpenedRef = react.useRef(false);
21146
+ react.useEffect(() => {
21147
+ if (flowOpenedRef.current) return;
21148
+ flowOpenedRef.current = true;
21149
+ registerSuperProps({ device });
21150
+ track("flow_opened", {
21151
+ device,
21152
+ isMobileApp: isMobileApp ?? false,
21153
+ fullWidget: enableFullWidget ?? false,
21154
+ hasAmount: depositAmount != null
21155
+ });
21156
+ }, []);
20920
21157
  const polling = useTransferPolling(3e3, effectiveGetAccessToken);
20921
21158
  const transferSigning = useTransferSigning(2e3, { getAccessToken: effectiveGetAccessToken });
20922
21159
  const mobileFlowRefs = {
@@ -21590,6 +21827,7 @@ exports.getDeviceBiometricUnlockText = getDeviceBiometricUnlockText;
21590
21827
  exports.getTheme = getTheme;
21591
21828
  exports.getThemeBase = getThemeBase;
21592
21829
  exports.getWalletCapabilities = getWalletCapabilities;
21830
+ exports.identifyUser = identifyUser;
21593
21831
  exports.isAuthorizationSessionCancelled = isAuthorizationSessionCancelled;
21594
21832
  exports.isExpectedAuthorizationCancellation = isExpectedAuthorizationCancellation;
21595
21833
  exports.isTerminalTransferStatus = isTerminalTransferStatus;
@@ -21603,11 +21841,15 @@ exports.lightTransparentTheme = lightTransparentTheme;
21603
21841
  exports.lightTransparentThemeNew = lightTransparentThemeNew;
21604
21842
  exports.mapGuestPickerEntries = mapGuestPickerEntries;
21605
21843
  exports.replaceOpenProviderForAccountSwitch = replaceOpenProviderForAccountSwitch;
21844
+ exports.resetUser = resetUser;
21845
+ exports.resolveAnalyticsEnvironment = resolveAnalyticsEnvironment;
21606
21846
  exports.resolvePasskeyRpId = resolvePasskeyRpId;
21847
+ exports.sanitizeProps = sanitizeProps;
21607
21848
  exports.screenForPhase = screenForPhase;
21608
21849
  exports.subscribeDebug = subscribeDebug;
21609
21850
  exports.supportsAtomicBatch = supportsAtomicBatch;
21610
21851
  exports.supportsPaymasterService = supportsPaymasterService;
21852
+ exports.track = track;
21611
21853
  exports.useAuthorizationExecutor = useAuthorizationExecutor;
21612
21854
  exports.useAuthorizationOrchestrator = useAuthorizationOrchestrator;
21613
21855
  exports.useBlinkConfig = useBlinkConfig;