thirdweb 5.115.1 → 5.115.3-nightly-b0eccf365a7521ec882fca9e680837c84147041e-20251205000343

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SwapWidget.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAGhF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yCAAyC,CAAC;AAErE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAWvF,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,cAAc,CAAC;IACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgDG;IACH,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE;YACT,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,CAAC,EAAE;YACV,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QACjB,KAAK,EAAE,iBAAiB,CAAC;QACzB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;KACnC,KAAK,IAAI,CAAC;IACX;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAoBhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAcA"}
1
+ {"version":3,"file":"SwapWidget.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAGhF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yCAAyC,CAAC;AAErE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAUvF,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,cAAc,CAAC;IACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgDG;IACH,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE;YACT,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,CAAC,EAAE;YACV,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QACjB,KAAK,EAAE,iBAAiB,CAAC;QACzB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;KACnC,KAAK,IAAI,CAAC;IACX;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAoBhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAcA"}
@@ -1 +1 @@
1
- {"version":3,"file":"select-token-ui.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/select-token-ui.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAsBtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASnE;;GAEG;AACH,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,cAAc,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,CAAC;AAYF;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,2CAoFpD"}
1
+ {"version":3,"file":"select-token-ui.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/select-token-ui.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAwBtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASnE;;GAEG;AACH,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,EAAE,cAAc,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,CAAC;AAWF;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,2CA2EpD"}
@@ -1,2 +1,2 @@
1
- export declare const version = "5.115.1";
1
+ export declare const version = "5.115.3-nightly-b0eccf365a7521ec882fca9e680837c84147041e-20251205000343";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,YAAY,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,4EAA4E,CAAC"}
package/package.json CHANGED
@@ -399,7 +399,7 @@
399
399
  }
400
400
  },
401
401
  "typings": "./dist/types/exports/thirdweb.d.ts",
402
- "version": "5.115.1",
402
+ "version": "5.115.3-nightly-b0eccf365a7521ec882fca9e680837c84147041e-20251205000343",
403
403
  "scripts": {
404
404
  "bench": "vitest -c ./test/vitest.config.ts bench",
405
405
  "bench:compare": "bun run ./benchmarks/run.ts",
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { useEffect, useRef, useState } from "react";
4
4
  import { trackPayEvent } from "../../../../../analytics/track/pay.js";
5
5
  import type { Buy, Sell } from "../../../../../bridge/index.js";
6
6
  import type { TokenWithPrices } from "../../../../../bridge/types/Token.js";
@@ -16,7 +16,6 @@ import { webWindowAdapter } from "../../../adapters/WindowAdapter.js";
16
16
  import { EmbedContainer } from "../../ConnectWallet/Modal/ConnectEmbed.js";
17
17
  import { DynamicHeight } from "../../components/DynamicHeight.js";
18
18
  import { ErrorBanner } from "../ErrorBanner.js";
19
- import { PaymentDetails } from "../payment-details/PaymentDetails.js";
20
19
  import { SuccessScreen } from "../payment-success/SuccessScreen.js";
21
20
  import { StepRunner } from "../StepRunner.js";
22
21
  import { useActiveWalletInfo } from "./hooks.js";
@@ -364,19 +363,6 @@ function SwapWidgetContent(
364
363
  // preload requests
365
364
  useBridgeChains(props.client);
366
365
 
367
- const handleError = useCallback(
368
- (error: Error, quote: SwapPreparedQuote) => {
369
- console.error(error);
370
- props.onError?.(error, quote);
371
- setScreen({
372
- id: "error",
373
- preparedQuote: quote,
374
- error,
375
- });
376
- },
377
- [props.onError],
378
- );
379
-
380
366
  // if wallet suddenly disconnects, show screen 1
381
367
  if (screen.id === "1:swap-ui" || !activeWalletInfo) {
382
368
  return (
@@ -399,19 +385,8 @@ function SwapWidgetContent(
399
385
  amountSelection={amountSelection}
400
386
  setAmountSelection={setAmountSelection}
401
387
  onSwap={(data) => {
402
- trackPayEvent({
403
- chainId: data.result.intent.originChainId,
404
- client: props.client,
405
- event: "payment_details",
406
- fromToken: data.result.intent.originTokenAddress,
407
- toChainId: data.result.intent.destinationChainId,
408
- toToken: data.result.intent.destinationTokenAddress,
409
- walletAddress:
410
- activeWalletInfo?.activeWallet?.getAccount()?.address,
411
- walletType: activeWalletInfo?.activeWallet?.id,
412
- });
413
388
  setScreen({
414
- id: "2:preview",
389
+ id: "3:execute",
415
390
  buyToken: data.buyToken,
416
391
  sellToken: data.sellToken,
417
392
  sellTokenBalance: data.sellTokenBalance,
@@ -425,43 +400,6 @@ function SwapWidgetContent(
425
400
  );
426
401
  }
427
402
 
428
- if (screen.id === "2:preview") {
429
- return (
430
- <PaymentDetails
431
- metadata={{
432
- title: "Review Swap",
433
- description: undefined,
434
- }}
435
- confirmButtonLabel="Swap"
436
- client={props.client}
437
- onBack={() => {
438
- setScreen({ id: "1:swap-ui" });
439
- }}
440
- onConfirm={() => {
441
- setScreen({
442
- ...screen,
443
- id: "3:execute",
444
- });
445
- }}
446
- onError={(error) => handleError(error, screen.preparedQuote)}
447
- paymentMethod={{
448
- quote: screen.quote,
449
- type: "wallet",
450
- payerWallet: activeWalletInfo.activeWallet,
451
- balance: screen.sellTokenBalance,
452
- originToken: screen.sellToken,
453
- action: screen.mode,
454
- hasEnoughBalance: true,
455
- }}
456
- preparedQuote={screen.preparedQuote}
457
- currency={props.currency}
458
- modeInfo={{
459
- mode: "fund_wallet",
460
- }}
461
- />
462
- );
463
- }
464
-
465
403
  if (screen.id === "3:execute") {
466
404
  return (
467
405
  <StepRunner
@@ -472,8 +410,7 @@ function SwapWidgetContent(
472
410
  onBack={() => {
473
411
  setScreen({
474
412
  ...screen,
475
- id: "2:preview",
476
- sellTokenBalance: screen.sellTokenBalance,
413
+ id: "1:swap-ui",
477
414
  });
478
415
  }}
479
416
  onCancel={() => props.onCancel?.(screen.preparedQuote)}
@@ -10,6 +10,8 @@ import {
10
10
  radius,
11
11
  spacing,
12
12
  } from "../../../../core/design-system/index.js";
13
+ import { CoinsIcon } from "../../ConnectWallet/icons/CoinsIcon.js";
14
+ import { WalletDotIcon } from "../../ConnectWallet/icons/WalletDotIcon.js";
13
15
  import { Container, noScrollBar } from "../../components/basic.js";
14
16
  import { Button } from "../../components/buttons.js";
15
17
  import { Img } from "../../components/Img.js";
@@ -50,8 +52,7 @@ function findChain(chains: BridgeChain[], activeChainId: number | undefined) {
50
52
  return chains.find((chain) => chain.chainId === activeChainId);
51
53
  }
52
54
 
53
- const ALL_TOKENS_LIMIT = 100;
54
- const OWNED_TOKENS_LIMIT = 50;
55
+ const INITIAL_LIMIT = 100;
55
56
 
56
57
  /**
57
58
  * @internal
@@ -60,8 +61,12 @@ export function SelectToken(props: SelectTokenUIProps) {
60
61
  const chainQuery = useBridgeChains(props.client);
61
62
  const [search, _setSearch] = useState("");
62
63
  const debouncedSearch = useDebouncedValue(search, 500);
63
- const [allTokensLimit, setAllTokensLimit] = useState(ALL_TOKENS_LIMIT);
64
- const [ownedTokensLimit, setOwnedTokensLimit] = useState(OWNED_TOKENS_LIMIT);
64
+ const [limit, setLimit] = useState(INITIAL_LIMIT);
65
+
66
+ const setSearch = useCallback((search: string) => {
67
+ _setSearch(search);
68
+ setLimit(INITIAL_LIMIT);
69
+ }, []);
65
70
 
66
71
  const [_selectedChain, setSelectedChain] = useState<BridgeChain | undefined>(
67
72
  undefined,
@@ -79,7 +84,7 @@ export function SelectToken(props: SelectTokenUIProps) {
79
84
  client: props.client,
80
85
  chainId: selectedChain?.chainId,
81
86
  search: debouncedSearch,
82
- limit: allTokensLimit,
87
+ limit,
83
88
  offset: 0,
84
89
  });
85
90
 
@@ -87,7 +92,7 @@ export function SelectToken(props: SelectTokenUIProps) {
87
92
  const ownedTokensQuery = useTokenBalances({
88
93
  clientId: props.client.clientId,
89
94
  chainId: selectedChain?.chainId,
90
- limit: ownedTokensLimit,
95
+ limit,
91
96
  page: 1,
92
97
  walletAddress: props.activeWalletInfo?.activeAccount.address,
93
98
  });
@@ -104,62 +109,43 @@ export function SelectToken(props: SelectTokenUIProps) {
104
109
  });
105
110
  }, [ownedTokensQuery.data?.tokens, debouncedSearch]);
106
111
 
107
- const setSearch = useCallback((search: string) => {
108
- _setSearch(search);
109
- setAllTokensLimit(ALL_TOKENS_LIMIT);
110
- setOwnedTokensLimit(OWNED_TOKENS_LIMIT);
111
- }, []);
112
+ const isFetching = tokensQuery.isFetching || ownedTokensQuery.isFetching;
112
113
 
113
114
  return (
114
115
  <SelectTokenUI
115
116
  {...props}
116
- ownedTokens={{
117
- data: filteredOwnedTokens || [],
118
- isFetching: ownedTokensQuery.isFetching,
119
- showMore: ownedTokensQuery.data?.pagination.hasMore
120
- ? () => {
121
- setOwnedTokensLimit(ownedTokensLimit + OWNED_TOKENS_LIMIT);
122
- }
123
- : undefined,
124
- }}
125
- allTokens={{
126
- data: tokensQuery.data || [],
127
- isFetching: tokensQuery.isFetching,
128
- showMore:
129
- tokensQuery.data?.length === allTokensLimit
130
- ? () => {
131
- setAllTokensLimit(allTokensLimit + ALL_TOKENS_LIMIT);
132
- }
133
- : undefined,
134
- }}
117
+ ownedTokens={filteredOwnedTokens || []}
118
+ allTokens={tokensQuery.data || []}
119
+ isFetching={isFetching}
135
120
  selectedChain={selectedChain}
136
121
  setSelectedChain={setSelectedChain}
137
122
  search={search}
138
123
  setSearch={setSearch}
139
124
  selectedToken={props.selectedToken}
140
125
  setSelectedToken={props.setSelectedToken}
126
+ showMore={
127
+ tokensQuery.data?.length === limit
128
+ ? () => {
129
+ setLimit(limit + INITIAL_LIMIT);
130
+ }
131
+ : undefined
132
+ }
141
133
  />
142
134
  );
143
135
  }
144
136
 
145
137
  function SelectTokenUI(
146
138
  props: SelectTokenUIProps & {
147
- allTokens: {
148
- data: Token[];
149
- isFetching: boolean;
150
- showMore: (() => void) | undefined;
151
- };
152
- ownedTokens: {
153
- data: TokenBalance[];
154
- isFetching: boolean;
155
- showMore: (() => void) | undefined;
156
- };
139
+ ownedTokens: TokenBalance[];
140
+ allTokens: Token[];
141
+ isFetching: boolean;
157
142
  selectedChain: BridgeChain | undefined;
158
143
  setSelectedChain: (chain: BridgeChain) => void;
159
144
  search: string;
160
145
  setSearch: (search: string) => void;
161
146
  selectedToken: TokenSelection | undefined;
162
147
  setSelectedToken: (token: TokenSelection) => void;
148
+ showMore: (() => void) | undefined;
163
149
  },
164
150
  ) {
165
151
  const isMobile = useIsMobile();
@@ -169,7 +155,7 @@ function SelectTokenUI(
169
155
 
170
156
  // show tokens with icons first
171
157
  const sortedOwnedTokens = useMemo(() => {
172
- return props.ownedTokens.data.sort((a, b) => {
158
+ return props.ownedTokens.sort((a, b) => {
173
159
  if (a.icon_uri && !b.icon_uri) {
174
160
  return -1;
175
161
  }
@@ -178,11 +164,23 @@ function SelectTokenUI(
178
164
  }
179
165
  return 0;
180
166
  });
181
- }, [props.ownedTokens.data]);
167
+ }, [props.ownedTokens]);
168
+
169
+ const otherTokens = useMemo(() => {
170
+ const ownedTokenSet = new Set(
171
+ sortedOwnedTokens.map((t) =>
172
+ `${t.token_address}-${t.chain_id}`.toLowerCase(),
173
+ ),
174
+ );
175
+ return props.allTokens.filter(
176
+ (token) =>
177
+ !ownedTokenSet.has(`${token.address}-${token.chainId}`.toLowerCase()),
178
+ );
179
+ }, [props.allTokens, sortedOwnedTokens]);
182
180
 
183
181
  // show tokens with icons first
184
- const sortedAllTokens = useMemo(() => {
185
- return props.allTokens.data.sort((a, b) => {
182
+ const sortedOtherTokens = useMemo(() => {
183
+ return otherTokens.sort((a, b) => {
186
184
  if (a.iconUri && !b.iconUri) {
187
185
  return -1;
188
186
  }
@@ -191,7 +189,7 @@ function SelectTokenUI(
191
189
  }
192
190
  return 0;
193
191
  });
194
- }, [props.allTokens.data]);
192
+ }, [otherTokens]);
195
193
 
196
194
  // desktop
197
195
  if (!isMobile) {
@@ -223,20 +221,15 @@ function SelectTokenUI(
223
221
  }}
224
222
  isMobile={false}
225
223
  selectedToken={props.selectedToken}
226
- ownedTokens={{
227
- ...props.ownedTokens,
228
- data: sortedOwnedTokens,
229
- }}
230
- allTokens={{
231
- ...props.allTokens,
232
- data: sortedAllTokens,
233
- }}
224
+ isFetching={props.isFetching}
225
+ ownedTokens={props.ownedTokens}
226
+ otherTokens={sortedOtherTokens}
227
+ showMore={props.showMore}
234
228
  selectedChain={props.selectedChain}
235
229
  onSelectChain={() => setScreen("select-chain")}
236
230
  client={props.client}
237
231
  search={props.search}
238
232
  setSearch={props.setSearch}
239
- isWalletConnected={props.activeWalletInfo !== undefined}
240
233
  />
241
234
  </Container>
242
235
  </Container>
@@ -246,20 +239,15 @@ function SelectTokenUI(
246
239
  if (screen === "select-token") {
247
240
  return (
248
241
  <TokenSelectionScreen
249
- isWalletConnected={props.activeWalletInfo !== undefined}
250
242
  onSelectToken={(token) => {
251
243
  props.setSelectedToken(token);
252
244
  props.onClose();
253
245
  }}
254
246
  selectedToken={props.selectedToken}
255
- ownedTokens={{
256
- ...props.ownedTokens,
257
- data: sortedOwnedTokens,
258
- }}
259
- allTokens={{
260
- ...props.allTokens,
261
- data: sortedAllTokens,
262
- }}
247
+ isFetching={props.isFetching}
248
+ ownedTokens={props.ownedTokens}
249
+ otherTokens={sortedOtherTokens}
250
+ showMore={props.showMore}
263
251
  selectedChain={props.selectedChain}
264
252
  isMobile={true}
265
253
  onSelectChain={() => setScreen("select-chain")}
@@ -447,36 +435,17 @@ function TokenSelectionScreen(props: {
447
435
  client: ThirdwebClient;
448
436
  search: string;
449
437
  setSearch: (search: string) => void;
438
+ isFetching: boolean;
439
+ ownedTokens: TokenBalance[];
440
+ otherTokens: Token[];
441
+ showMore: (() => void) | undefined;
450
442
  selectedToken: TokenSelection | undefined;
451
443
  onSelectToken: (token: TokenSelection) => void;
452
- isWalletConnected: boolean;
453
- allTokens: {
454
- data: Token[];
455
- isFetching: boolean;
456
- showMore: (() => void) | undefined;
457
- };
458
- ownedTokens: {
459
- data: TokenBalance[];
460
- isFetching: boolean;
461
- showMore: (() => void) | undefined;
462
- };
463
444
  }) {
464
- const noAllTokensFound =
465
- !props.allTokens.isFetching && props.allTokens.data.length === 0;
466
-
467
- const noOwnedTokensFound =
468
- !props.ownedTokens.isFetching && props.ownedTokens.data.length === 0;
469
-
470
- const [activeTab, setActiveTab] = useState<"owned" | "all">("all");
471
- const showSkeletons =
472
- (props.allTokens.isFetching && activeTab === "all") ||
473
- (props.ownedTokens.isFetching && activeTab === "owned");
474
-
475
- const showNoTokensFound =
476
- (activeTab === "all" && noAllTokensFound) ||
477
- (activeTab === "owned" && noOwnedTokensFound);
478
-
479
- const theme = useCustomTheme();
445
+ const noTokensFound =
446
+ !props.isFetching &&
447
+ props.otherTokens.length === 0 &&
448
+ props.ownedTokens.length === 0;
480
449
 
481
450
  return (
482
451
  <Container fullHeight flex="column">
@@ -534,28 +503,7 @@ function TokenSelectionScreen(props: {
534
503
  />
535
504
  </Container>
536
505
 
537
- <Spacer y="sm" />
538
-
539
- {/* tabs */}
540
- {props.isWalletConnected && (
541
- <Container
542
- flex="row"
543
- gap="xs"
544
- px="md"
545
- style={{ borderBottom: `1px solid ${theme.colors.borderColor}` }}
546
- >
547
- <TabButton
548
- isSelected={activeTab === "all"}
549
- onSelect={() => setActiveTab("all")}
550
- label="All Tokens"
551
- />
552
- <TabButton
553
- isSelected={activeTab === "owned"}
554
- onSelect={() => setActiveTab("owned")}
555
- label="Your Tokens"
556
- />
557
- </Container>
558
- )}
506
+ <Spacer y="xs" />
559
507
 
560
508
  <Container
561
509
  pb="md"
@@ -571,17 +519,36 @@ function TokenSelectionScreen(props: {
571
519
  paddingBottom: spacing.md,
572
520
  }}
573
521
  >
574
- {props.isWalletConnected && <Spacer y="xxs" />}
575
-
576
- {showSkeletons &&
522
+ {props.isFetching &&
577
523
  new Array(20).fill(0).map((_, i) => (
578
524
  // biome-ignore lint/suspicious/noArrayIndexKey: ok
579
525
  <TokenButtonSkeleton key={i} />
580
526
  ))}
581
527
 
582
- {activeTab === "owned" &&
583
- !props.ownedTokens.isFetching &&
584
- props.ownedTokens.data.map((token) => (
528
+ {!props.isFetching && props.ownedTokens.length > 0 && (
529
+ <Container
530
+ px="xs"
531
+ py="xs"
532
+ flex="row"
533
+ gap="xs"
534
+ center="y"
535
+ color="secondaryText"
536
+ >
537
+ <WalletDotIcon size="14" />
538
+ <Text
539
+ size="sm"
540
+ color="secondaryText"
541
+ style={{
542
+ overflow: "unset",
543
+ }}
544
+ >
545
+ Your Tokens
546
+ </Text>
547
+ </Container>
548
+ )}
549
+
550
+ {!props.isFetching &&
551
+ props.ownedTokens.map((token) => (
585
552
  <TokenButton
586
553
  key={token.token_address}
587
554
  token={token}
@@ -596,9 +563,33 @@ function TokenSelectionScreen(props: {
596
563
  />
597
564
  ))}
598
565
 
599
- {activeTab === "all" &&
600
- !props.allTokens.isFetching &&
601
- props.allTokens.data.map((token) => (
566
+ {!props.isFetching && props.ownedTokens.length > 0 && (
567
+ <Container
568
+ px="xs"
569
+ py="xs"
570
+ flex="row"
571
+ gap="xs"
572
+ center="y"
573
+ color="secondaryText"
574
+ style={{
575
+ marginTop: spacing.sm,
576
+ }}
577
+ >
578
+ <CoinsIcon size="14" />
579
+ <Text
580
+ size="sm"
581
+ color="secondaryText"
582
+ style={{
583
+ overflow: "unset",
584
+ }}
585
+ >
586
+ Other Tokens
587
+ </Text>
588
+ </Container>
589
+ )}
590
+
591
+ {!props.isFetching &&
592
+ props.otherTokens.map((token) => (
602
593
  <TokenButton
603
594
  key={token.address}
604
595
  token={token}
@@ -613,31 +604,19 @@ function TokenSelectionScreen(props: {
613
604
  />
614
605
  ))}
615
606
 
616
- {activeTab === "all" && props.allTokens.showMore && (
617
- <Button
618
- variant="secondary"
619
- fullWidth
620
- onClick={() => {
621
- props.allTokens.showMore?.();
622
- }}
623
- >
624
- Load More
625
- </Button>
626
- )}
627
-
628
- {activeTab === "owned" && props.ownedTokens.showMore && (
607
+ {props.showMore && (
629
608
  <Button
630
609
  variant="secondary"
631
610
  fullWidth
632
611
  onClick={() => {
633
- props.ownedTokens.showMore?.();
612
+ props.showMore?.();
634
613
  }}
635
614
  >
636
615
  Load More
637
616
  </Button>
638
617
  )}
639
618
 
640
- {showNoTokensFound && (
619
+ {noTokensFound && (
641
620
  <div
642
621
  style={{
643
622
  flex: 1,
@@ -669,45 +648,3 @@ const LeftContainer = /* @__PURE__ */ StyledDiv((_) => {
669
648
  position: "relative",
670
649
  };
671
650
  });
672
-
673
- function TabButton(props: {
674
- isSelected: boolean;
675
- onSelect: () => void;
676
- label: string;
677
- }) {
678
- const theme = useCustomTheme();
679
- return (
680
- <div
681
- style={{
682
- paddingBottom: "4px",
683
- position: "relative",
684
- }}
685
- >
686
- <Button
687
- variant="ghost-solid"
688
- onClick={props.onSelect}
689
- style={{
690
- fontSize: fontSize.sm,
691
- padding: `10px ${spacing.xs}`,
692
- color: props.isSelected
693
- ? theme.colors.primaryText
694
- : theme.colors.secondaryText,
695
- }}
696
- >
697
- {props.label}
698
- </Button>
699
-
700
- {props.isSelected && (
701
- <div
702
- style={{
703
- position: "absolute",
704
- left: 0,
705
- right: 0,
706
- bottom: "-1.5px",
707
- borderBottom: `2px solid ${theme.colors.primaryText}`,
708
- }}
709
- ></div>
710
- )}
711
- </div>
712
- );
713
- }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "5.115.1";
1
+ export const version = "5.115.3-nightly-b0eccf365a7521ec882fca9e680837c84147041e-20251205000343";