Skip to content

Commit ae43ed5

Browse files
committed
Remove extra quote loading step
1 parent 6fb8a4e commit ae43ed5

File tree

2 files changed

+74
-80
lines changed

2 files changed

+74
-80
lines changed

packages/thirdweb/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx

Lines changed: 21 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import type { TokenWithPrices } from "../../../../../bridge/types/Token.js";
77
import type { ThirdwebClient } from "../../../../../client/client.js";
88
import { NATIVE_TOKEN_ADDRESS } from "../../../../../constants/addresses.js";
99
import type { SupportedFiatCurrency } from "../../../../../pay/convert/type.js";
10-
import { toTokens } from "../../../../../utils/units.js";
1110
import { CustomThemeProvider } from "../../../../core/design-system/CustomThemeProvider.js";
1211
import type { Theme } from "../../../../core/design-system/index.js";
1312
import type {
@@ -21,7 +20,6 @@ import { DynamicHeight } from "../../components/DynamicHeight.js";
2120
import { ErrorBanner } from "../ErrorBanner.js";
2221
import { PaymentDetails } from "../payment-details/PaymentDetails.js";
2322
import { SuccessScreen } from "../payment-success/SuccessScreen.js";
24-
import { QuoteLoader } from "../QuoteLoader.js";
2523
import { StepRunner } from "../StepRunner.js";
2624
import { useActiveWalletInfo } from "./hooks.js";
2725
import { getLastUsedTokens, setLastUsedTokens } from "./storage.js";
@@ -201,8 +199,8 @@ type SwapWidgetScreen =
201199
mode: "buy" | "sell";
202200
}
203201
| {
204-
id: "3:preview";
205-
preparedQuote: BridgePrepareResult;
202+
id: "2:preview";
203+
preparedQuote: Extract<BridgePrepareResult, { type: "buy" | "sell" }>;
206204
request: BridgePrepareRequest;
207205
quote: Buy.quote.Result | Sell.quote.Result;
208206
buyToken: TokenWithPrices;
@@ -211,19 +209,19 @@ type SwapWidgetScreen =
211209
mode: "buy" | "sell";
212210
}
213211
| {
214-
id: "4:execute";
212+
id: "3:execute";
215213
request: BridgePrepareRequest;
216214
quote: Buy.quote.Result | Sell.quote.Result;
217-
preparedQuote: BridgePrepareResult;
215+
preparedQuote: Extract<BridgePrepareResult, { type: "buy" | "sell" }>;
218216
buyToken: TokenWithPrices;
219217
sellToken: TokenWithPrices;
220218
sellTokenBalance: bigint;
221219
mode: "buy" | "sell";
222220
}
223221
| {
224-
id: "5:success";
222+
id: "4:success";
225223
completedStatuses: CompletedStatusResult[];
226-
preparedQuote: BridgePrepareResult;
224+
preparedQuote: Extract<BridgePrepareResult, { type: "buy" | "sell" }>;
227225
buyToken: TokenWithPrices;
228226
sellToken: TokenWithPrices;
229227
}
@@ -337,59 +335,23 @@ function SwapWidgetContent(props: SwapWidgetProps) {
337335
setSellToken={setSellToken}
338336
amountSelection={amountSelection}
339337
setAmountSelection={setAmountSelection}
340-
onSwap={(quote, selection) => {
338+
onSwap={(data) => {
341339
setScreen({
342-
quote,
343-
id: "2:loading-quote",
344-
...selection,
340+
id: "2:preview",
341+
buyToken: data.buyToken,
342+
sellToken: data.sellToken,
343+
sellTokenBalance: data.sellTokenBalance,
344+
mode: data.mode,
345+
preparedQuote: data.result,
346+
request: data.request,
347+
quote: data.result,
345348
});
346349
}}
347350
/>
348351
);
349352
}
350353

351-
if (screen.id === "2:loading-quote") {
352-
console.log("screen", screen);
353-
return (
354-
<QuoteLoader
355-
amount={
356-
// if buy mode, set destination amount
357-
// if sell mode, set origin amount
358-
screen.mode === "buy"
359-
? toTokens(screen.quote.destinationAmount, screen.buyToken.decimals)
360-
: toTokens(screen.quote.originAmount, screen.sellToken.decimals)
361-
}
362-
onError={handleError}
363-
onQuoteReceived={(preparedQuote, request) => {
364-
setScreen({
365-
...screen,
366-
id: "3:preview",
367-
preparedQuote,
368-
request,
369-
});
370-
}}
371-
receiver={activeWalletInfo.activeAccount.address}
372-
onBack={() => setScreen({ id: "1:swap-ui" })}
373-
uiOptions={{
374-
destinationToken: screen.buyToken,
375-
mode: "fund_wallet",
376-
currency: props.currency,
377-
}}
378-
client={props.client}
379-
destinationToken={screen.buyToken}
380-
paymentMethod={{
381-
quote: screen.quote,
382-
type: "wallet",
383-
payerWallet: activeWalletInfo.activeWallet,
384-
balance: screen.sellTokenBalance,
385-
originToken: screen.sellToken,
386-
action: screen.mode,
387-
}}
388-
/>
389-
);
390-
}
391-
392-
if (screen.id === "3:preview") {
354+
if (screen.id === "2:preview") {
393355
return (
394356
<PaymentDetails
395357
client={props.client}
@@ -399,7 +361,7 @@ function SwapWidgetContent(props: SwapWidgetProps) {
399361
onConfirm={() => {
400362
setScreen({
401363
...screen,
402-
id: "4:execute",
364+
id: "3:execute",
403365
});
404366
}}
405367
onError={handleError}
@@ -421,15 +383,15 @@ function SwapWidgetContent(props: SwapWidgetProps) {
421383
);
422384
}
423385

424-
if (screen.id === "4:execute") {
386+
if (screen.id === "3:execute") {
425387
return (
426388
<StepRunner
427389
autoStart={true}
428390
client={props.client}
429391
onBack={() => {
430392
setScreen({
431393
...screen,
432-
id: "3:preview",
394+
id: "2:preview",
433395
sellTokenBalance: screen.sellTokenBalance,
434396
});
435397
}}
@@ -438,7 +400,7 @@ function SwapWidgetContent(props: SwapWidgetProps) {
438400
props.onSuccess?.();
439401
setScreen({
440402
...screen,
441-
id: "5:success",
403+
id: "4:success",
442404
completedStatuses,
443405
});
444406
}}
@@ -449,7 +411,7 @@ function SwapWidgetContent(props: SwapWidgetProps) {
449411
);
450412
}
451413

452-
if (screen.id === "5:success") {
414+
if (screen.id === "4:success") {
453415
return (
454416
<SuccessScreen
455417
client={props.client}

packages/thirdweb/src/react/web/ui/Bridge/swap-widget/swap-ui.tsx

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import {
66
} from "@radix-ui/react-icons";
77
import { useQuery } from "@tanstack/react-query";
88
import { useState } from "react";
9+
import type { prepare as BuyPrepare } from "../../../../../bridge/Buy.js";
910
import { Buy, Sell } from "../../../../../bridge/index.js";
11+
import type { prepare as SellPrepare } from "../../../../../bridge/Sell.js";
1012
import type { BridgeChain } from "../../../../../bridge/types/Chain.js";
1113
import type { TokenWithPrices } from "../../../../../bridge/types/Token.js";
1214
import { defineChain } from "../../../../../chains/utils.js";
@@ -28,6 +30,10 @@ import {
2830
type Theme,
2931
} from "../../../../core/design-system/index.js";
3032
import { useWalletBalance } from "../../../../core/hooks/others/useWalletBalance.js";
33+
import type {
34+
BridgePrepareRequest,
35+
BridgePrepareResult,
36+
} from "../../../../core/hooks/useBridgePrepare.js";
3137
import { ConnectButton } from "../../ConnectWallet/ConnectButton.js";
3238
import { ArrowUpDownIcon } from "../../ConnectWallet/icons/ArrowUpDownIcon.js";
3339
import { WalletDotIcon } from "../../ConnectWallet/icons/WalletDotIcon.js";
@@ -57,15 +63,14 @@ type SwapUIProps = {
5763
connectOptions: SwapWidgetConnectOptions | undefined;
5864
currency: SupportedFiatCurrency;
5965
showThirdwebBranding: boolean;
60-
onSwap: (
61-
quote: Buy.quote.Result | Sell.quote.Result,
62-
selection: {
63-
buyToken: TokenWithPrices;
64-
sellTokenBalance: bigint;
65-
sellToken: TokenWithPrices;
66-
mode: "buy" | "sell";
67-
},
68-
) => void;
66+
onSwap: (data: {
67+
result: Extract<BridgePrepareResult, { type: "buy" | "sell" }>;
68+
request: Extract<BridgePrepareRequest, { type: "buy" | "sell" }>;
69+
buyToken: TokenWithPrices;
70+
sellTokenBalance: bigint;
71+
sellToken: TokenWithPrices;
72+
mode: "buy" | "sell";
73+
}) => void;
6974
buyToken: TokenSelection | undefined;
7075
sellToken: TokenSelection | undefined;
7176
setBuyToken: (token: TokenSelection | undefined) => void;
@@ -191,7 +196,10 @@ function SwapUIBase(
191196
!!buyTokenWithPrices &&
192197
!!sellTokenWithPrices &&
193198
!!props.amountSelection.amount,
194-
queryFn: async () => {
199+
queryFn: async (): Promise<{
200+
result: Extract<BridgePrepareResult, { type: "buy" | "sell" }>;
201+
request: Extract<BridgePrepareRequest, { type: "buy" | "sell" }>;
202+
}> => {
195203
if (
196204
!buyTokenWithPrices ||
197205
!sellTokenWithPrices ||
@@ -202,8 +210,8 @@ function SwapUIBase(
202210
}
203211

204212
if (props.amountSelection.type === "buy") {
205-
const res = await Buy.quote({
206-
buyAmountWei: toUnits(
213+
const buyRequestOptions: BuyPrepare.Options = {
214+
amount: toUnits(
207215
props.amountSelection.amount,
208216
buyTokenWithPrices.decimals,
209217
),
@@ -214,11 +222,23 @@ function SwapUIBase(
214222
destinationChainId: buyTokenWithPrices.chainId,
215223
destinationTokenAddress: buyTokenWithPrices.address,
216224
client: props.client,
217-
});
225+
receiver: props.activeWalletInfo.activeAccount.address,
226+
sender: props.activeWalletInfo.activeAccount.address,
227+
};
228+
229+
const buyRequest: BridgePrepareRequest = {
230+
type: "buy",
231+
...buyRequestOptions,
232+
};
233+
234+
const res = await Buy.prepare(buyRequest);
218235

219-
return res;
236+
return {
237+
result: { type: "buy", ...res },
238+
request: buyRequest,
239+
};
220240
} else if (props.amountSelection.type === "sell") {
221-
const res = await Sell.prepare({
241+
const sellRequestOptions: SellPrepare.Options = {
222242
amount: toUnits(
223243
props.amountSelection.amount,
224244
sellTokenWithPrices.decimals,
@@ -232,12 +252,22 @@ function SwapUIBase(
232252
client: props.client,
233253
receiver: props.activeWalletInfo.activeAccount.address,
234254
sender: props.activeWalletInfo.activeAccount.address,
235-
});
255+
};
256+
257+
const res = await Sell.prepare(sellRequestOptions);
258+
259+
const sellRequest: BridgePrepareRequest = {
260+
type: "sell",
261+
...sellRequestOptions,
262+
};
236263

237-
return res;
264+
return {
265+
result: { type: "sell", ...res },
266+
request: sellRequest,
267+
};
238268
}
239269

240-
return null;
270+
throw new Error("Invalid amount selection type");
241271
},
242272
refetchInterval: 20000,
243273
});
@@ -249,7 +279,7 @@ function SwapUIBase(
249279
props.amountSelection.type === "buy" &&
250280
sellTokenWithPrices
251281
? toTokens(
252-
preparedResultQuery.data.originAmount,
282+
preparedResultQuery.data.result.originAmount,
253283
sellTokenWithPrices.decimals,
254284
)
255285
: "";
@@ -261,7 +291,7 @@ function SwapUIBase(
261291
props.amountSelection.type === "sell" &&
262292
buyTokenWithPrices
263293
? toTokens(
264-
preparedResultQuery.data.destinationAmount,
294+
preparedResultQuery.data.result.destinationAmount,
265295
buyTokenWithPrices.decimals,
266296
)
267297
: "";
@@ -396,7 +426,9 @@ function SwapUIBase(
396426
sellTokenWithPrices &&
397427
sellTokenBalanceQuery.data
398428
) {
399-
props.onSwap(preparedResultQuery.data, {
429+
props.onSwap({
430+
result: preparedResultQuery.data.result,
431+
request: preparedResultQuery.data.request,
400432
buyToken: buyTokenWithPrices,
401433
sellToken: sellTokenWithPrices,
402434
sellTokenBalance: sellTokenBalanceQuery.data.value,

0 commit comments

Comments
 (0)