Skip to content

Commit 82a30af

Browse files
authored
Supported chain and tokens using overriden state (#4388)
1 parent 9e8d3e6 commit 82a30af

File tree

4 files changed

+104
-59
lines changed

4 files changed

+104
-59
lines changed

.changeset/funny-crews-invite.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"thirdweb": patch
3+
---
4+
5+
Update setting default source chain and token

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/BuyScreen.tsx

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ import {
5959
type PaymentMethods,
6060
useEnabledPaymentMethods,
6161
} from "./main/useEnabledPaymentMethods.js";
62-
import { useUISelectionStates } from "./main/useUISelectionStates.js";
62+
import {
63+
useFiatCurrencySelectionStates,
64+
useFromTokenSelectionStates,
65+
useToTokenSelectionStates,
66+
} from "./main/useUISelectionStates.js";
6367
import { openOnrampPopup } from "./openOnRamppopup.js";
6468
import { BuyTokenInput } from "./swap/BuyTokenInput.js";
6569
import { FiatFees, SwapFees } from "./swap/Fees.js";
@@ -134,33 +138,26 @@ function BuyScreenContent(props: BuyScreenContentProps) {
134138
id: "main",
135139
});
136140

137-
const [hasEditedAmount, setHasEditedAmount] = useState(false);
138-
139-
const onDone = useCallback(() => {
140-
setScreen({ id: "main" });
141-
props.onDone();
142-
}, [props.onDone]);
143-
144-
// UI selection
145141
const {
146142
tokenAmount,
147143
setTokenAmount,
148144
toChain,
149145
setToChain,
150146
deferredTokenAmount,
151-
fromChain,
152-
setFromChain,
153147
toToken,
154148
setToToken,
155-
fromToken,
156-
setFromToken,
157-
selectedCurrency,
158-
setSelectedCurrency,
159-
} = useUISelectionStates({
149+
} = useToTokenSelectionStates({
160150
payOptions,
161151
supportedDestinations,
162152
});
163153

154+
const [hasEditedAmount, setHasEditedAmount] = useState(false);
155+
156+
const onDone = useCallback(() => {
157+
setScreen({ id: "main" });
158+
props.onDone();
159+
}, [props.onDone]);
160+
164161
// check if the screen is expanded or not
165162

166163
// update supportedSources whenever toToken or toChain is updated
@@ -186,21 +183,24 @@ function BuyScreenContent(props: BuyScreenContentProps) {
186183
}
187184

188185
const supportedSources = supportedSourcesQuery.data;
189-
if (supportedSources[0]?.chain) {
190-
setFromChain(supportedSources[0]?.chain);
191-
}
192186

193187
return createSupportedTokens(
194188
supportedSources,
195189
payOptions,
196190
props.supportedTokens,
197191
);
198-
}, [
199-
props.supportedTokens,
200-
supportedSourcesQuery.data,
201-
payOptions,
202-
setFromChain,
203-
]);
192+
}, [props.supportedTokens, supportedSourcesQuery.data, payOptions]);
193+
194+
const { fromChain, setFromChain, fromToken, setFromToken } =
195+
useFromTokenSelectionStates({
196+
payOptions,
197+
supportedSources: supportedSourcesQuery.data || [],
198+
});
199+
200+
const { selectedCurrency, setSelectedCurrency } =
201+
useFiatCurrencySelectionStates({
202+
payOptions,
203+
});
204204

205205
const enabledPaymentMethods = useEnabledPaymentMethods({
206206
payOptions: props.payOptions,

packages/thirdweb/src/react/web/ui/ConnectWallet/screens/Buy/main/useUISelectionStates.ts

Lines changed: 73 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,32 @@ import {
1515
} from "../fiat/currencies.js";
1616
import type { SupportedChainAndTokens } from "../swap/useSwapSupportedChains.js";
1717

18-
// handle states for token and chain selection
18+
type SupportedSourcesInputData = {
19+
chain: Chain;
20+
tokens: {
21+
address: string;
22+
buyWithCryptoEnabled: boolean;
23+
buyWithFiatEnabled: boolean;
24+
name: string;
25+
symbol: string;
26+
}[];
27+
};
1928

20-
export function useUISelectionStates(options: {
29+
// handle states for token and chain selection
30+
export function useToTokenSelectionStates(options: {
2131
payOptions: PayUIOptions;
2232
supportedDestinations: SupportedChainAndTokens;
2333
}) {
24-
const activeChain = useActiveWalletChain();
2534
const { payOptions, supportedDestinations } = options;
26-
35+
// --------------------------------------------------------------------------
2736
// buy token amount ---------------------------------------------------------
2837
// NOTE - for transaction / direct payment modes, the token amount is set when the user tap continue
2938
const prefillBuy = (payOptions as FundWalletOptions)?.prefillBuy;
39+
const activeChain = useActiveWalletChain();
3040
const initialTokenAmount = prefillBuy?.amount || "";
31-
3241
const [tokenAmount, setTokenAmount] = useState<string>(initialTokenAmount);
3342
const deferredTokenAmount = useDebouncedValue(tokenAmount, 300);
3443

35-
// --------------------------------------------------------------------------
36-
3744
// Destination chain and token selection -----------------------------------
3845
const [toChain, setToChain] = useState<Chain>(
3946
// use prefill chain if available
@@ -52,27 +59,73 @@ export function useUISelectionStates(options: {
5259
(payOptions.mode === "direct_payment" && payOptions.paymentInfo.token) ||
5360
NATIVE_TOKEN,
5461
);
62+
63+
return {
64+
toChain,
65+
setToChain,
66+
toToken,
67+
setToToken,
68+
tokenAmount,
69+
setTokenAmount,
70+
deferredTokenAmount,
71+
};
72+
}
73+
74+
export function useFromTokenSelectionStates(options: {
75+
payOptions: PayUIOptions;
76+
supportedSources: SupportedSourcesInputData[];
77+
}) {
78+
const { payOptions, supportedSources } = options;
79+
5580
// --------------------------------------------------------------------------
81+
const firstSupportedSource = supportedSources?.length
82+
? supportedSources[0]
83+
: undefined;
5684

5785
// Source token and chain selection ---------------------------------------------------
58-
const [fromChain, setFromChain] = useState<Chain>(
59-
// use prefill chain if available
86+
const [fromChain_, setFromChain] = useState<Chain>();
87+
88+
// use prefill chain if available
89+
const fromChainDevSpecified =
6090
(payOptions.buyWithCrypto !== false &&
6191
payOptions.buyWithCrypto?.prefillSource?.chain) ||
62-
(payOptions.mode === "transaction" && payOptions.transaction?.chain) ||
63-
(payOptions.mode === "direct_payment" && payOptions.paymentInfo?.chain) ||
64-
// default to polygon
65-
polygon,
66-
);
92+
(payOptions.mode === "transaction" && payOptions.transaction?.chain) ||
93+
(payOptions.mode === "direct_payment" && payOptions.paymentInfo?.chain);
94+
95+
const fromChainFromApi = firstSupportedSource?.chain
96+
? firstSupportedSource.chain
97+
: undefined;
6798

68-
const [fromToken, setFromToken] = useState<ERC20OrNativeToken>(
69-
// use prefill token if available
99+
const fromChain =
100+
fromChain_ || fromChainDevSpecified || fromChainFromApi || polygon;
101+
102+
const [fromToken_, setFromToken] = useState<ERC20OrNativeToken>();
103+
104+
// use prefill token if available
105+
const fromTokenDevSpecified =
70106
(payOptions.buyWithCrypto !== false &&
71107
payOptions.buyWithCrypto?.prefillSource?.token) ||
72-
(payOptions.mode === "direct_payment" && payOptions.paymentInfo.token) ||
73-
// default to native token
74-
NATIVE_TOKEN,
75-
);
108+
(payOptions.mode === "direct_payment" && payOptions.paymentInfo.token);
109+
110+
// May be updated in the future
111+
const fromTokenFromApi = NATIVE_TOKEN;
112+
113+
// supported tokens query in here
114+
const fromToken =
115+
fromToken_ || fromTokenDevSpecified || fromTokenFromApi || NATIVE_TOKEN;
116+
117+
return {
118+
fromChain,
119+
setFromChain,
120+
fromToken,
121+
setFromToken,
122+
};
123+
}
124+
125+
export function useFiatCurrencySelectionStates(options: {
126+
payOptions: PayUIOptions;
127+
}) {
128+
const { payOptions } = options;
76129

77130
// --------------------------------------------------------------------------
78131
const devSpecifiedDefaultCurrency =
@@ -89,20 +142,7 @@ export function useUISelectionStates(options: {
89142
);
90143

91144
return {
92-
tokenAmount,
93-
setTokenAmount,
94-
95-
toChain,
96-
setToChain,
97-
deferredTokenAmount,
98-
fromChain,
99-
setFromChain,
100-
toToken,
101-
setToToken,
102-
fromToken,
103-
setFromToken,
104145
selectedCurrency,
105-
106146
setSelectedCurrency,
107147
};
108148
}

packages/thirdweb/src/utils/domains.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type DomainOverrides = {
1111
inAppWallet?: string;
1212
/**
1313
* The base URL for the payment server.
14-
* @default "interstate.thirdweb.com"
14+
* @default "pay.thirdweb.com"
1515
*/
1616
pay?: string;
1717
/**

0 commit comments

Comments
 (0)