thirdweb 5.115.0 → 5.115.2

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.
Files changed (88) hide show
  1. package/dist/cjs/react/core/hooks/usePaymentMethods.js +16 -7
  2. package/dist/cjs/react/core/hooks/usePaymentMethods.js.map +1 -1
  3. package/dist/cjs/react/web/ui/Bridge/BuyWidget.js +56 -13
  4. package/dist/cjs/react/web/ui/Bridge/BuyWidget.js.map +1 -1
  5. package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js +52 -13
  6. package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js.map +1 -1
  7. package/dist/cjs/react/web/ui/Bridge/ErrorBanner.js +12 -12
  8. package/dist/cjs/react/web/ui/Bridge/ErrorBanner.js.map +1 -1
  9. package/dist/cjs/react/web/ui/Bridge/QuoteLoader.js +1 -22
  10. package/dist/cjs/react/web/ui/Bridge/QuoteLoader.js.map +1 -1
  11. package/dist/cjs/react/web/ui/Bridge/TransactionWidget.js +52 -12
  12. package/dist/cjs/react/web/ui/Bridge/TransactionWidget.js.map +1 -1
  13. package/dist/cjs/react/web/ui/Bridge/UnsupportedTokenScreen.js +13 -12
  14. package/dist/cjs/react/web/ui/Bridge/UnsupportedTokenScreen.js.map +1 -1
  15. package/dist/cjs/react/web/ui/Bridge/bridge-widget/bridge-widget.js +10 -11
  16. package/dist/cjs/react/web/ui/Bridge/bridge-widget/bridge-widget.js.map +1 -1
  17. package/dist/cjs/react/web/ui/Bridge/payment-details/PaymentDetails.js +0 -30
  18. package/dist/cjs/react/web/ui/Bridge/payment-details/PaymentDetails.js.map +1 -1
  19. package/dist/cjs/react/web/ui/Bridge/payment-selection/PaymentSelection.js +8 -15
  20. package/dist/cjs/react/web/ui/Bridge/payment-selection/PaymentSelection.js.map +1 -1
  21. package/dist/cjs/react/web/ui/Bridge/payment-selection/TokenSelection.js +1 -4
  22. package/dist/cjs/react/web/ui/Bridge/payment-selection/TokenSelection.js.map +1 -1
  23. package/dist/cjs/react/web/ui/Bridge/payment-success/SuccessScreen.js +35 -35
  24. package/dist/cjs/react/web/ui/Bridge/payment-success/SuccessScreen.js.map +1 -1
  25. package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js +12 -46
  26. package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -1
  27. package/dist/cjs/version.js +1 -1
  28. package/dist/esm/react/core/hooks/usePaymentMethods.js +16 -7
  29. package/dist/esm/react/core/hooks/usePaymentMethods.js.map +1 -1
  30. package/dist/esm/react/web/ui/Bridge/BuyWidget.js +57 -14
  31. package/dist/esm/react/web/ui/Bridge/BuyWidget.js.map +1 -1
  32. package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js +53 -14
  33. package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js.map +1 -1
  34. package/dist/esm/react/web/ui/Bridge/ErrorBanner.js +12 -12
  35. package/dist/esm/react/web/ui/Bridge/ErrorBanner.js.map +1 -1
  36. package/dist/esm/react/web/ui/Bridge/QuoteLoader.js +1 -22
  37. package/dist/esm/react/web/ui/Bridge/QuoteLoader.js.map +1 -1
  38. package/dist/esm/react/web/ui/Bridge/TransactionWidget.js +53 -13
  39. package/dist/esm/react/web/ui/Bridge/TransactionWidget.js.map +1 -1
  40. package/dist/esm/react/web/ui/Bridge/UnsupportedTokenScreen.js +13 -12
  41. package/dist/esm/react/web/ui/Bridge/UnsupportedTokenScreen.js.map +1 -1
  42. package/dist/esm/react/web/ui/Bridge/bridge-widget/bridge-widget.js +11 -12
  43. package/dist/esm/react/web/ui/Bridge/bridge-widget/bridge-widget.js.map +1 -1
  44. package/dist/esm/react/web/ui/Bridge/payment-details/PaymentDetails.js +0 -30
  45. package/dist/esm/react/web/ui/Bridge/payment-details/PaymentDetails.js.map +1 -1
  46. package/dist/esm/react/web/ui/Bridge/payment-selection/PaymentSelection.js +8 -15
  47. package/dist/esm/react/web/ui/Bridge/payment-selection/PaymentSelection.js.map +1 -1
  48. package/dist/esm/react/web/ui/Bridge/payment-selection/TokenSelection.js +1 -4
  49. package/dist/esm/react/web/ui/Bridge/payment-selection/TokenSelection.js.map +1 -1
  50. package/dist/esm/react/web/ui/Bridge/payment-success/SuccessScreen.js +37 -37
  51. package/dist/esm/react/web/ui/Bridge/payment-success/SuccessScreen.js.map +1 -1
  52. package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js +13 -47
  53. package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -1
  54. package/dist/esm/version.js +1 -1
  55. package/dist/scripts/bridge-widget.js +114 -114
  56. package/dist/types/react/core/hooks/usePaymentMethods.d.ts +2 -2
  57. package/dist/types/react/core/hooks/usePaymentMethods.d.ts.map +1 -1
  58. package/dist/types/react/web/ui/Bridge/BuyWidget.d.ts.map +1 -1
  59. package/dist/types/react/web/ui/Bridge/CheckoutWidget.d.ts.map +1 -1
  60. package/dist/types/react/web/ui/Bridge/ErrorBanner.d.ts.map +1 -1
  61. package/dist/types/react/web/ui/Bridge/QuoteLoader.d.ts +1 -1
  62. package/dist/types/react/web/ui/Bridge/QuoteLoader.d.ts.map +1 -1
  63. package/dist/types/react/web/ui/Bridge/TransactionWidget.d.ts.map +1 -1
  64. package/dist/types/react/web/ui/Bridge/bridge-widget/bridge-widget.d.ts.map +1 -1
  65. package/dist/types/react/web/ui/Bridge/payment-details/PaymentDetails.d.ts.map +1 -1
  66. package/dist/types/react/web/ui/Bridge/payment-selection/PaymentSelection.d.ts +2 -2
  67. package/dist/types/react/web/ui/Bridge/payment-selection/PaymentSelection.d.ts.map +1 -1
  68. package/dist/types/react/web/ui/Bridge/payment-selection/TokenSelection.d.ts.map +1 -1
  69. package/dist/types/react/web/ui/Bridge/swap-widget/SwapWidget.d.ts.map +1 -1
  70. package/dist/types/react/web/ui/Bridge/types.d.ts +2 -1
  71. package/dist/types/react/web/ui/Bridge/types.d.ts.map +1 -1
  72. package/dist/types/version.d.ts +1 -1
  73. package/package.json +5 -5
  74. package/src/react/core/hooks/usePaymentMethods.ts +25 -11
  75. package/src/react/web/ui/Bridge/BuyWidget.tsx +63 -14
  76. package/src/react/web/ui/Bridge/CheckoutWidget.tsx +61 -14
  77. package/src/react/web/ui/Bridge/ErrorBanner.tsx +11 -12
  78. package/src/react/web/ui/Bridge/QuoteLoader.tsx +1 -25
  79. package/src/react/web/ui/Bridge/TransactionWidget.tsx +61 -13
  80. package/src/react/web/ui/Bridge/UnsupportedTokenScreen.tsx +12 -12
  81. package/src/react/web/ui/Bridge/bridge-widget/bridge-widget.tsx +10 -12
  82. package/src/react/web/ui/Bridge/payment-details/PaymentDetails.tsx +0 -37
  83. package/src/react/web/ui/Bridge/payment-selection/PaymentSelection.tsx +10 -18
  84. package/src/react/web/ui/Bridge/payment-selection/TokenSelection.tsx +1 -4
  85. package/src/react/web/ui/Bridge/payment-success/SuccessScreen.tsx +37 -37
  86. package/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx +12 -65
  87. package/src/react/web/ui/Bridge/types.ts +2 -1
  88. package/src/version.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { useQuery } from "@tanstack/react-query";
4
- import { useCallback, useMemo, useState } from "react";
4
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
5
  import { trackPayEvent } from "../../../../analytics/track/pay.js";
6
6
  import type { TokenWithPrices } from "../../../../bridge/index.js";
7
7
  import type { Chain } from "../../../../chains/types.js";
@@ -349,18 +349,17 @@ type TransactionQueryResult =
349
349
  };
350
350
 
351
351
  export function TransactionWidgetContentWrapper(props: TransactionWidgetProps) {
352
- useQuery({
353
- queryFn: () => {
354
- trackPayEvent({
355
- chainId: props.transaction.chain.id,
356
- client: props.client,
357
- event: "ub:ui:transaction_widget:render",
358
- toToken: props.tokenAddress,
359
- });
360
- return true;
361
- },
362
- queryKey: ["transaction_widget:render"],
363
- });
352
+ const hasFiredRenderEvent = useRef(false);
353
+ useEffect(() => {
354
+ if (hasFiredRenderEvent.current) return;
355
+ hasFiredRenderEvent.current = true;
356
+ trackPayEvent({
357
+ chainId: props.transaction.chain.id,
358
+ client: props.client,
359
+ event: "ub:ui:transaction_widget:render",
360
+ toToken: props.tokenAddress,
361
+ });
362
+ }, [props.client, props.transaction.chain.id, props.tokenAddress]);
364
363
 
365
364
  const localQuery = useConnectLocale(props.locale || "en_US");
366
365
 
@@ -573,6 +572,12 @@ function TransactionWidgetContent(
573
572
  }}
574
573
  connectOptions={props.connectOptions}
575
574
  onContinue={(destinationAmount, destinationToken, receiverAddress) => {
575
+ trackPayEvent({
576
+ client: props.client,
577
+ event: "payment_selection",
578
+ toChainId: destinationToken.chainId,
579
+ toToken: destinationToken.address,
580
+ });
576
581
  setScreen({
577
582
  id: "buy:1.methodSelection",
578
583
  destinationAmount,
@@ -618,6 +623,20 @@ function TransactionWidgetContent(
618
623
  handleError(error);
619
624
  }}
620
625
  onPaymentMethodSelected={(paymentMethod) => {
626
+ trackPayEvent({
627
+ chainId:
628
+ paymentMethod.type === "wallet"
629
+ ? paymentMethod.originToken.chainId
630
+ : undefined,
631
+ client: props.client,
632
+ event: "ub:ui:loading_quote:transaction",
633
+ fromToken:
634
+ paymentMethod.type === "wallet"
635
+ ? paymentMethod.originToken.address
636
+ : undefined,
637
+ toChainId: screen.destinationToken.chainId,
638
+ toToken: screen.destinationToken.address,
639
+ });
621
640
  setScreen({
622
641
  ...screen,
623
642
  id: "buy:2.load-quote",
@@ -651,6 +670,35 @@ function TransactionWidgetContent(
651
670
  handleError(error);
652
671
  }}
653
672
  onQuoteReceived={(preparedQuote, request) => {
673
+ if (
674
+ preparedQuote.type === "buy" ||
675
+ preparedQuote.type === "sell" ||
676
+ preparedQuote.type === "transfer"
677
+ ) {
678
+ trackPayEvent({
679
+ chainId:
680
+ preparedQuote.type === "transfer"
681
+ ? preparedQuote.intent.chainId
682
+ : preparedQuote.intent.originChainId,
683
+ client: props.client,
684
+ event: "payment_details",
685
+ fromToken:
686
+ preparedQuote.type === "transfer"
687
+ ? preparedQuote.intent.tokenAddress
688
+ : preparedQuote.intent.originTokenAddress,
689
+ toChainId:
690
+ preparedQuote.type === "transfer"
691
+ ? preparedQuote.intent.chainId
692
+ : preparedQuote.intent.destinationChainId,
693
+ toToken:
694
+ preparedQuote.type === "transfer"
695
+ ? preparedQuote.intent.tokenAddress
696
+ : preparedQuote.intent.destinationTokenAddress,
697
+ walletAddress:
698
+ screen.paymentMethod.payerWallet?.getAccount()?.address,
699
+ walletType: screen.paymentMethod.payerWallet?.id,
700
+ });
701
+ }
654
702
  setScreen({
655
703
  ...screen,
656
704
  id: "buy:3.preview",
@@ -1,4 +1,4 @@
1
- import { useQuery } from "@tanstack/react-query";
1
+ import { useEffect, useRef } from "react";
2
2
  import { trackPayEvent } from "../../../../analytics/track/pay.js";
3
3
  import type { Chain } from "../../../../chains/types.js";
4
4
  import type { ThirdwebClient } from "../../../../client/client.js";
@@ -27,17 +27,17 @@ export function UnsupportedTokenScreen(props: UnsupportedTokenScreenProps) {
27
27
 
28
28
  const { data: chainMetadata } = useChainMetadata(chain);
29
29
 
30
- useQuery({
31
- queryFn: () => {
32
- trackPayEvent({
33
- chainId: chain.id,
34
- client,
35
- event: "ub:ui:unsupported_token",
36
- fromToken: tokenAddress,
37
- });
38
- },
39
- queryKey: ["unsupported_token"],
40
- });
30
+ const hasFiredUnsupportedEvent = useRef(false);
31
+ useEffect(() => {
32
+ if (hasFiredUnsupportedEvent.current) return;
33
+ hasFiredUnsupportedEvent.current = true;
34
+ trackPayEvent({
35
+ chainId: chain.id,
36
+ client,
37
+ event: "ub:ui:unsupported_token",
38
+ fromToken: tokenAddress,
39
+ });
40
+ }, [chain.id, client, tokenAddress]);
41
41
 
42
42
  if (chainMetadata?.testnet) {
43
43
  return (
@@ -1,5 +1,4 @@
1
- import { useQuery } from "@tanstack/react-query";
2
- import { useState } from "react";
1
+ import { useEffect, useRef, useState } from "react";
3
2
  import { trackPayEvent } from "../../../../../analytics/track/pay.js";
4
3
  import { defineChain } from "../../../../../chains/utils.js";
5
4
  import type { ThirdwebClient } from "../../../../../client/client.js";
@@ -251,16 +250,15 @@ export type BridgeWidgetProps = {
251
250
  export function BridgeWidget(props: BridgeWidgetProps) {
252
251
  const [tab, setTab] = useState<"swap" | "buy">("swap");
253
252
 
254
- useQuery({
255
- queryFn: () => {
256
- trackPayEvent({
257
- client: props.client,
258
- event: "ub:ui:bridge_widget:render",
259
- });
260
- return true;
261
- },
262
- queryKey: ["bridge_widget:render"],
263
- });
253
+ const hasFiredRenderEvent = useRef(false);
254
+ useEffect(() => {
255
+ if (hasFiredRenderEvent.current) return;
256
+ hasFiredRenderEvent.current = true;
257
+ trackPayEvent({
258
+ client: props.client,
259
+ event: "ub:ui:bridge_widget:render",
260
+ });
261
+ }, [props.client]);
264
262
 
265
263
  return (
266
264
  <CustomThemeProvider theme={props.theme}>
@@ -1,7 +1,5 @@
1
1
  "use client";
2
- import { useQuery } from "@tanstack/react-query";
3
2
  import { useMemo } from "react";
4
- import { trackPayEvent } from "../../../../../analytics/track/pay.js";
5
3
  import { defineChain } from "../../../../../chains/utils.js";
6
4
  import type { ThirdwebClient } from "../../../../../client/client.js";
7
5
  import type { SupportedFiatCurrency } from "../../../../../pay/convert/type.js";
@@ -82,41 +80,6 @@ export function PaymentDetails({
82
80
  }
83
81
  };
84
82
 
85
- useQuery({
86
- queryFn: () => {
87
- if (
88
- preparedQuote.type === "buy" ||
89
- preparedQuote.type === "sell" ||
90
- preparedQuote.type === "transfer"
91
- ) {
92
- trackPayEvent({
93
- chainId:
94
- preparedQuote.type === "transfer"
95
- ? preparedQuote.intent.chainId
96
- : preparedQuote.intent.originChainId,
97
- client,
98
- event: "payment_details",
99
- fromToken:
100
- preparedQuote.type === "transfer"
101
- ? preparedQuote.intent.tokenAddress
102
- : preparedQuote.intent.originTokenAddress,
103
- toChainId:
104
- preparedQuote.type === "transfer"
105
- ? preparedQuote.intent.chainId
106
- : preparedQuote.intent.destinationChainId,
107
- toToken:
108
- preparedQuote.type === "transfer"
109
- ? preparedQuote.intent.tokenAddress
110
- : preparedQuote.intent.destinationTokenAddress,
111
- walletAddress: paymentMethod.payerWallet?.getAccount()?.address,
112
- walletType: paymentMethod.payerWallet?.id,
113
- });
114
- }
115
- return true;
116
- },
117
- queryKey: ["payment_details", preparedQuote.type],
118
- });
119
-
120
83
  const chainsQuery = useChainsQuery(
121
84
  preparedQuote.steps.flatMap((s) => [
122
85
  defineChain(s.originToken.chainId),
@@ -1,8 +1,7 @@
1
1
  "use client";
2
- import { useQuery } from "@tanstack/react-query";
3
2
  import { useEffect, useState } from "react";
4
3
  import { trackPayEvent } from "../../../../../analytics/track/pay.js";
5
- import type { Token } from "../../../../../bridge/types/Token.js";
4
+ import type { TokenWithPrices } from "../../../../../bridge/types/Token.js";
6
5
  import { defineChain } from "../../../../../chains/utils.js";
7
6
  import type { ThirdwebClient } from "../../../../../client/client.js";
8
7
  import type { SupportedFiatCurrency } from "../../../../../pay/convert/type.js";
@@ -27,7 +26,7 @@ type PaymentSelectionProps = {
27
26
  /**
28
27
  * The destination token to bridge to
29
28
  */
30
- destinationToken: Token;
29
+ destinationToken: TokenWithPrices;
31
30
 
32
31
  /**
33
32
  * The destination amount to bridge
@@ -129,21 +128,6 @@ export function PaymentSelection({
129
128
 
130
129
  const [currentStep, setCurrentStep] = useState<Step>(initialStep);
131
130
 
132
- useQuery({
133
- queryFn: () => {
134
- trackPayEvent({
135
- client,
136
- event: "payment_selection",
137
- toChainId: destinationToken.chainId,
138
- toToken: destinationToken.address,
139
- walletAddress: payerWallet?.getAccount()?.address,
140
- walletType: payerWallet?.id,
141
- });
142
- return true;
143
- },
144
- queryKey: ["payment_selection"],
145
- });
146
-
147
131
  const payerWallet =
148
132
  currentStep.type === "tokenSelection"
149
133
  ? currentStep.selectedWallet
@@ -176,6 +160,10 @@ export function PaymentSelection({
176
160
  };
177
161
 
178
162
  const handleWalletSelected = (wallet: Wallet) => {
163
+ trackPayEvent({
164
+ client,
165
+ event: "ub:ui:token_selection",
166
+ });
179
167
  setCurrentStep({ selectedWallet: wallet, type: "tokenSelection" });
180
168
  };
181
169
 
@@ -184,6 +172,10 @@ export function PaymentSelection({
184
172
  };
185
173
 
186
174
  const handleFiatSelected = () => {
175
+ trackPayEvent({
176
+ client,
177
+ event: "ub:ui:fiat_provider_selection",
178
+ });
187
179
  setCurrentStep({ type: "fiatProviderSelection" });
188
180
  };
189
181
 
@@ -47,10 +47,7 @@ function PaymentMethodTokenRow({
47
47
  }: PaymentMethodTokenRowProps) {
48
48
  const theme = useCustomTheme();
49
49
 
50
- const displayOriginAmount = paymentMethod.quote.originAmount;
51
- const hasEnoughBalance = displayOriginAmount
52
- ? paymentMethod.balance >= displayOriginAmount
53
- : false;
50
+ const hasEnoughBalance = paymentMethod.hasEnoughBalance;
54
51
  const currencyPrice = paymentMethod.originToken.prices[currency || "USD"];
55
52
 
56
53
  return (
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { CheckIcon } from "@radix-ui/react-icons";
3
- import { useQuery, useQueryClient } from "@tanstack/react-query";
4
- import { useState } from "react";
3
+ import { useQueryClient } from "@tanstack/react-query";
4
+ import { useEffect, useRef, useState } from "react";
5
5
  import { trackPayEvent } from "../../../../../analytics/track/pay.js";
6
6
  import type { ThirdwebClient } from "../../../../../client/client.js";
7
7
  import type { WindowAdapter } from "../../../../core/adapters/WindowAdapter.js";
@@ -63,43 +63,43 @@ export function SuccessScreen({
63
63
  const [viewState, setViewState] = useState<ViewState>("success");
64
64
  const queryClient = useQueryClient();
65
65
 
66
- useQuery({
67
- queryFn: () => {
68
- if (preparedQuote.type === "buy" || preparedQuote.type === "sell") {
69
- trackPayEvent({
70
- chainId: preparedQuote.intent.originChainId,
71
- client: client,
72
- event: "ub:ui:success_screen",
73
- fromToken: preparedQuote.intent.originTokenAddress,
74
- toChainId: preparedQuote.intent.destinationChainId,
75
- toToken: preparedQuote.intent.destinationTokenAddress,
76
- walletAddress: preparedQuote.intent.sender,
77
- });
78
- }
79
- if (preparedQuote.type === "transfer") {
80
- trackPayEvent({
81
- chainId: preparedQuote.intent.chainId,
82
- client: client,
83
- event: "ub:ui:success_screen",
84
- fromToken: preparedQuote.intent.tokenAddress,
85
- toChainId: preparedQuote.intent.chainId,
86
- toToken: preparedQuote.intent.tokenAddress,
87
- walletAddress: preparedQuote.intent.sender,
88
- });
89
- }
90
- queryClient.invalidateQueries({
91
- queryKey: ["bridge/v1/wallets"],
66
+ const hasFiredSuccessEvent = useRef(false);
67
+ useEffect(() => {
68
+ if (hasFiredSuccessEvent.current) return;
69
+ hasFiredSuccessEvent.current = true;
70
+
71
+ if (preparedQuote.type === "buy" || preparedQuote.type === "sell") {
72
+ trackPayEvent({
73
+ chainId: preparedQuote.intent.originChainId,
74
+ client: client,
75
+ event: "ub:ui:success_screen",
76
+ fromToken: preparedQuote.intent.originTokenAddress,
77
+ toChainId: preparedQuote.intent.destinationChainId,
78
+ toToken: preparedQuote.intent.destinationTokenAddress,
79
+ walletAddress: preparedQuote.intent.sender,
92
80
  });
93
- queryClient.invalidateQueries({
94
- queryKey: ["walletBalance"],
81
+ }
82
+ if (preparedQuote.type === "transfer") {
83
+ trackPayEvent({
84
+ chainId: preparedQuote.intent.chainId,
85
+ client: client,
86
+ event: "ub:ui:success_screen",
87
+ fromToken: preparedQuote.intent.tokenAddress,
88
+ toChainId: preparedQuote.intent.chainId,
89
+ toToken: preparedQuote.intent.tokenAddress,
90
+ walletAddress: preparedQuote.intent.sender,
95
91
  });
96
- queryClient.invalidateQueries({
97
- queryKey: ["payment-methods"],
98
- });
99
- return true;
100
- },
101
- queryKey: ["success_screen", preparedQuote.type],
102
- });
92
+ }
93
+ queryClient.invalidateQueries({
94
+ queryKey: ["bridge/v1/wallets"],
95
+ });
96
+ queryClient.invalidateQueries({
97
+ queryKey: ["walletBalance"],
98
+ });
99
+ queryClient.invalidateQueries({
100
+ queryKey: ["payment-methods"],
101
+ });
102
+ }, [client, preparedQuote, queryClient]);
103
103
 
104
104
  if (viewState === "detail") {
105
105
  return (
@@ -1,7 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useQuery } from "@tanstack/react-query";
4
- import { useCallback, useEffect, useState } from "react";
3
+ import { useEffect, useRef, useState } from "react";
5
4
  import { trackPayEvent } from "../../../../../analytics/track/pay.js";
6
5
  import type { Buy, Sell } from "../../../../../bridge/index.js";
7
6
  import type { TokenWithPrices } from "../../../../../bridge/types/Token.js";
@@ -17,7 +16,6 @@ import { webWindowAdapter } from "../../../adapters/WindowAdapter.js";
17
16
  import { EmbedContainer } from "../../ConnectWallet/Modal/ConnectEmbed.js";
18
17
  import { DynamicHeight } from "../../components/DynamicHeight.js";
19
18
  import { ErrorBanner } from "../ErrorBanner.js";
20
- import { PaymentDetails } from "../payment-details/PaymentDetails.js";
21
19
  import { SuccessScreen } from "../payment-success/SuccessScreen.js";
22
20
  import { StepRunner } from "../StepRunner.js";
23
21
  import { useActiveWalletInfo } from "./hooks.js";
@@ -246,16 +244,15 @@ export type SwapWidgetProps = {
246
244
  * @bridge
247
245
  */
248
246
  export function SwapWidget(props: SwapWidgetProps) {
249
- useQuery({
250
- queryFn: () => {
251
- trackPayEvent({
252
- client: props.client,
253
- event: "ub:ui:swap_widget:render",
254
- });
255
- return true;
256
- },
257
- queryKey: ["swap_widget:render"],
258
- });
247
+ const hasFiredRenderEvent = useRef(false);
248
+ useEffect(() => {
249
+ if (hasFiredRenderEvent.current) return;
250
+ hasFiredRenderEvent.current = true;
251
+ trackPayEvent({
252
+ client: props.client,
253
+ event: "ub:ui:swap_widget:render",
254
+ });
255
+ }, [props.client]);
259
256
 
260
257
  return (
261
258
  <SwapWidgetContainer
@@ -366,19 +363,6 @@ function SwapWidgetContent(
366
363
  // preload requests
367
364
  useBridgeChains(props.client);
368
365
 
369
- const handleError = useCallback(
370
- (error: Error, quote: SwapPreparedQuote) => {
371
- console.error(error);
372
- props.onError?.(error, quote);
373
- setScreen({
374
- id: "error",
375
- preparedQuote: quote,
376
- error,
377
- });
378
- },
379
- [props.onError],
380
- );
381
-
382
366
  // if wallet suddenly disconnects, show screen 1
383
367
  if (screen.id === "1:swap-ui" || !activeWalletInfo) {
384
368
  return (
@@ -402,7 +386,7 @@ function SwapWidgetContent(
402
386
  setAmountSelection={setAmountSelection}
403
387
  onSwap={(data) => {
404
388
  setScreen({
405
- id: "2:preview",
389
+ id: "3:execute",
406
390
  buyToken: data.buyToken,
407
391
  sellToken: data.sellToken,
408
392
  sellTokenBalance: data.sellTokenBalance,
@@ -416,42 +400,6 @@ function SwapWidgetContent(
416
400
  );
417
401
  }
418
402
 
419
- if (screen.id === "2:preview") {
420
- return (
421
- <PaymentDetails
422
- metadata={{
423
- title: "Review Swap",
424
- description: undefined,
425
- }}
426
- confirmButtonLabel="Swap"
427
- client={props.client}
428
- onBack={() => {
429
- setScreen({ id: "1:swap-ui" });
430
- }}
431
- onConfirm={() => {
432
- setScreen({
433
- ...screen,
434
- id: "3:execute",
435
- });
436
- }}
437
- onError={(error) => handleError(error, screen.preparedQuote)}
438
- paymentMethod={{
439
- quote: screen.quote,
440
- type: "wallet",
441
- payerWallet: activeWalletInfo.activeWallet,
442
- balance: screen.sellTokenBalance,
443
- originToken: screen.sellToken,
444
- action: screen.mode,
445
- }}
446
- preparedQuote={screen.preparedQuote}
447
- currency={props.currency}
448
- modeInfo={{
449
- mode: "fund_wallet",
450
- }}
451
- />
452
- );
453
- }
454
-
455
403
  if (screen.id === "3:execute") {
456
404
  return (
457
405
  <StepRunner
@@ -462,8 +410,7 @@ function SwapWidgetContent(
462
410
  onBack={() => {
463
411
  setScreen({
464
412
  ...screen,
465
- id: "2:preview",
466
- sellTokenBalance: screen.sellTokenBalance,
413
+ id: "1:swap-ui",
467
414
  });
468
415
  }}
469
416
  onCancel={() => props.onCancel?.(screen.preparedQuote)}
@@ -37,7 +37,8 @@ export type PaymentMethod =
37
37
  payerWallet: Wallet;
38
38
  originToken: TokenWithPrices;
39
39
  balance: bigint;
40
- quote: Quote;
40
+ quote?: Quote;
41
+ hasEnoughBalance: boolean;
41
42
  }
42
43
  | {
43
44
  type: "fiat";
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "5.115.0";
1
+ export const version = "5.115.2";