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.
- package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js +2 -46
- package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -1
- package/dist/cjs/react/web/ui/Bridge/swap-widget/select-token-ui.js +46 -88
- package/dist/cjs/react/web/ui/Bridge/swap-widget/select-token-ui.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js +3 -47
- package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -1
- package/dist/esm/react/web/ui/Bridge/swap-widget/select-token-ui.js +46 -88
- package/dist/esm/react/web/ui/Bridge/swap-widget/select-token-ui.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/scripts/bridge-widget.js +100 -100
- package/dist/types/react/web/ui/Bridge/swap-widget/SwapWidget.d.ts.map +1 -1
- package/dist/types/react/web/ui/Bridge/swap-widget/select-token-ui.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/version.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx +3 -66
- package/src/react/web/ui/Bridge/swap-widget/select-token-ui.tsx +115 -178
- package/src/version.ts +1 -1
|
@@ -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;
|
|
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;
|
|
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"}
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "5.115.
|
|
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,
|
|
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.
|
|
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 {
|
|
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: "
|
|
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: "
|
|
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
|
|
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 [
|
|
64
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
118
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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.
|
|
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
|
|
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
|
|
185
|
-
return
|
|
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
|
-
}, [
|
|
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
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
|
465
|
-
!props.
|
|
466
|
-
|
|
467
|
-
|
|
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="
|
|
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.
|
|
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
|
-
{
|
|
583
|
-
|
|
584
|
-
|
|
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
|
-
{
|
|
600
|
-
|
|
601
|
-
|
|
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
|
-
{
|
|
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.
|
|
612
|
+
props.showMore?.();
|
|
634
613
|
}}
|
|
635
614
|
>
|
|
636
615
|
Load More
|
|
637
616
|
</Button>
|
|
638
617
|
)}
|
|
639
618
|
|
|
640
|
-
{
|
|
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
|
+
export const version = "5.115.3-nightly-b0eccf365a7521ec882fca9e680837c84147041e-20251205000343";
|