@aori/mega-swap-widget 0.1.0
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/LICENSE +21 -0
- package/README.md +404 -0
- package/dist/AssetSelectionMenu-Y3EB32BT.cjs +13 -0
- package/dist/AssetSelectionMenu-Y3EB32BT.cjs.map +1 -0
- package/dist/AssetSelectionMenu-ZRG42UCZ.js +13 -0
- package/dist/AssetSelectionMenu-ZRG42UCZ.js.map +1 -0
- package/dist/ChainSelectionMenu-FBAPPFKI.cjs +11 -0
- package/dist/ChainSelectionMenu-FBAPPFKI.cjs.map +1 -0
- package/dist/ChainSelectionMenu-QO3H4TNR.js +11 -0
- package/dist/ChainSelectionMenu-QO3H4TNR.js.map +1 -0
- package/dist/SwapFormHorizontal-JDJUDFNX.js +573 -0
- package/dist/SwapFormHorizontal-JDJUDFNX.js.map +1 -0
- package/dist/SwapFormHorizontal-WG3Z3CFT.cjs +573 -0
- package/dist/SwapFormHorizontal-WG3Z3CFT.cjs.map +1 -0
- package/dist/SwapFormSplit-7CHTPLEQ.js +441 -0
- package/dist/SwapFormSplit-7CHTPLEQ.js.map +1 -0
- package/dist/SwapFormSplit-VDDIRQUQ.cjs +441 -0
- package/dist/SwapFormSplit-VDDIRQUQ.cjs.map +1 -0
- package/dist/WalletPlaceholderPanel-7YDQ4FT6.js +57 -0
- package/dist/WalletPlaceholderPanel-7YDQ4FT6.js.map +1 -0
- package/dist/WalletPlaceholderPanel-FZ6XIAMF.cjs +57 -0
- package/dist/WalletPlaceholderPanel-FZ6XIAMF.cjs.map +1 -0
- package/dist/WidgetWalletPanel-D7I5TAU3.js +789 -0
- package/dist/WidgetWalletPanel-D7I5TAU3.js.map +1 -0
- package/dist/WidgetWalletPanel-T7H6FGVN.cjs +789 -0
- package/dist/WidgetWalletPanel-T7H6FGVN.cjs.map +1 -0
- package/dist/chunk-3E6RNP2D.cjs +389 -0
- package/dist/chunk-3E6RNP2D.cjs.map +1 -0
- package/dist/chunk-5TH6MFQD.cjs +122 -0
- package/dist/chunk-5TH6MFQD.cjs.map +1 -0
- package/dist/chunk-5XSCUUOW.js +101 -0
- package/dist/chunk-5XSCUUOW.js.map +1 -0
- package/dist/chunk-6Q7MSCKS.js +2199 -0
- package/dist/chunk-6Q7MSCKS.js.map +1 -0
- package/dist/chunk-6XB5R4GF.cjs +368 -0
- package/dist/chunk-6XB5R4GF.cjs.map +1 -0
- package/dist/chunk-6YLNOZ7P.js +389 -0
- package/dist/chunk-6YLNOZ7P.js.map +1 -0
- package/dist/chunk-7AWG6OWF.js +27 -0
- package/dist/chunk-7AWG6OWF.js.map +1 -0
- package/dist/chunk-ARMW5POL.js +3082 -0
- package/dist/chunk-ARMW5POL.js.map +1 -0
- package/dist/chunk-B3ILUJ7G.cjs +101 -0
- package/dist/chunk-B3ILUJ7G.cjs.map +1 -0
- package/dist/chunk-GGM3MDFM.js +32 -0
- package/dist/chunk-GGM3MDFM.js.map +1 -0
- package/dist/chunk-GZUTUD5O.cjs +2199 -0
- package/dist/chunk-GZUTUD5O.cjs.map +1 -0
- package/dist/chunk-HXOGJSAI.cjs +3082 -0
- package/dist/chunk-HXOGJSAI.cjs.map +1 -0
- package/dist/chunk-LTA7IG3J.js +122 -0
- package/dist/chunk-LTA7IG3J.js.map +1 -0
- package/dist/chunk-NBJPKJBC.cjs +32 -0
- package/dist/chunk-NBJPKJBC.cjs.map +1 -0
- package/dist/chunk-PGYOJ5RB.cjs +27 -0
- package/dist/chunk-PGYOJ5RB.cjs.map +1 -0
- package/dist/chunk-QHW27RMH.js +199 -0
- package/dist/chunk-QHW27RMH.js.map +1 -0
- package/dist/chunk-TMC4SUEV.js +368 -0
- package/dist/chunk-TMC4SUEV.js.map +1 -0
- package/dist/chunk-XQINW7QP.cjs +199 -0
- package/dist/chunk-XQINW7QP.cjs.map +1 -0
- package/dist/index.cjs +1780 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +1424 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +555 -0
- package/dist/index.d.ts +555 -0
- package/dist/index.js +1780 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
useSwapFormContext,
|
|
4
|
+
useWidgetSwapUIStore
|
|
5
|
+
} from "./chunk-TMC4SUEV.js";
|
|
6
|
+
import {
|
|
7
|
+
ChainIcon_default,
|
|
8
|
+
TokenImage_default,
|
|
9
|
+
calculateDollarizedBalance,
|
|
10
|
+
checkedAddress,
|
|
11
|
+
getAvailableChainConfigs,
|
|
12
|
+
isGasToken,
|
|
13
|
+
useBulkBalances,
|
|
14
|
+
useDebounce,
|
|
15
|
+
useEnabledChainIds,
|
|
16
|
+
useSupportedTokensWithPricing,
|
|
17
|
+
useTokenData,
|
|
18
|
+
useTokenWithLazyLoad,
|
|
19
|
+
useWidgetConfig
|
|
20
|
+
} from "./chunk-6Q7MSCKS.js";
|
|
21
|
+
import {
|
|
22
|
+
useWalletState
|
|
23
|
+
} from "./chunk-7AWG6OWF.js";
|
|
24
|
+
|
|
25
|
+
// src/components/AssetSelectionMenu.tsx
|
|
26
|
+
import React2, { useCallback, useEffect, useMemo } from "react";
|
|
27
|
+
import { useShallow } from "zustand/react/shallow";
|
|
28
|
+
|
|
29
|
+
// src/components/AssetSelectionBalanceItem.tsx
|
|
30
|
+
import React from "react";
|
|
31
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
32
|
+
var AssetSelectionBalanceItem = React.memo(
|
|
33
|
+
({ asset, otherAsset, handleFormSelection, getToken }) => {
|
|
34
|
+
const { token: lazyToken } = useTokenWithLazyLoad(asset.chainId, asset.address);
|
|
35
|
+
const cachedToken = getToken(asset.chainId, asset.address);
|
|
36
|
+
const token = lazyToken || cachedToken || asset.assetInfo;
|
|
37
|
+
if (!token) return null;
|
|
38
|
+
const hasPrice = token.price != null;
|
|
39
|
+
const dollarValue = hasPrice && asset.decimals !== void 0 ? calculateDollarizedBalance(token, asset.balance, asset.decimals) : null;
|
|
40
|
+
return /* @__PURE__ */ jsxs(
|
|
41
|
+
"button",
|
|
42
|
+
{
|
|
43
|
+
type: "button",
|
|
44
|
+
className: "w-full flex items-center justify-between p-3 cursor-pointer",
|
|
45
|
+
style: { borderBottom: "1px solid var(--widget-border)" },
|
|
46
|
+
onClick: () => handleFormSelection(token, otherAsset),
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-3 min-w-0 flex-1", children: [
|
|
49
|
+
/* @__PURE__ */ jsx(TokenImage_default, { asset: token, size: "md", className: "flex-shrink-0" }),
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start min-w-0 flex-1", children: [
|
|
51
|
+
/* @__PURE__ */ jsx("span", { className: "text-base font-medium", style: { color: "var(--widget-foreground)" }, children: token.symbol.length > 20 ? `${token.symbol.substring(0, 20)}...` : token.symbol }),
|
|
52
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm", style: { color: "var(--widget-foreground)", opacity: 0.6 }, children: token.name.length > 20 ? `${token.name.substring(0, 20)}...` : token.name })
|
|
53
|
+
] })
|
|
54
|
+
] }),
|
|
55
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col items-end text-right flex-shrink-0", children: [
|
|
56
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-mono", style: { color: "var(--widget-foreground)", opacity: 0.5 }, children: "Balance:" }),
|
|
57
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-mono", style: { color: "var(--widget-foreground)" }, children: dollarValue != null ? `$${dollarValue.toFixed(2)}` : "\u2014" })
|
|
58
|
+
] })
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
`${token.chainId}-${token.address}`
|
|
62
|
+
);
|
|
63
|
+
},
|
|
64
|
+
(prevProps, nextProps) => prevProps.asset.address === nextProps.asset.address && prevProps.asset.chainId === nextProps.asset.chainId && prevProps.asset.balance === nextProps.asset.balance && prevProps.asset.assetInfo?.price === nextProps.asset.assetInfo?.price && prevProps.otherAsset.address === nextProps.otherAsset.address
|
|
65
|
+
);
|
|
66
|
+
AssetSelectionBalanceItem.displayName = "AssetSelectionBalanceItem";
|
|
67
|
+
|
|
68
|
+
// src/components/AssetSelectionMenu.tsx
|
|
69
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
70
|
+
var AssetSelectionMenu = ({
|
|
71
|
+
toggle,
|
|
72
|
+
side,
|
|
73
|
+
otherAsset,
|
|
74
|
+
containerHeight,
|
|
75
|
+
onChainHover,
|
|
76
|
+
onMoreChainsClick,
|
|
77
|
+
selectedChainFilter
|
|
78
|
+
}) => {
|
|
79
|
+
const { address: userAddress } = useWalletState();
|
|
80
|
+
const {
|
|
81
|
+
assetSelectionSearch: searchQuery,
|
|
82
|
+
assetSelectionChain: selectedChain,
|
|
83
|
+
assetSelectionCategory: categoryState,
|
|
84
|
+
recentChainIds
|
|
85
|
+
} = useWidgetSwapUIStore(
|
|
86
|
+
useShallow((state) => ({
|
|
87
|
+
assetSelectionSearch: state.assetSelectionSearch,
|
|
88
|
+
assetSelectionChain: state.assetSelectionChain,
|
|
89
|
+
assetSelectionCategory: state.assetSelectionCategory,
|
|
90
|
+
recentChainIds: state.recentChainIds
|
|
91
|
+
}))
|
|
92
|
+
);
|
|
93
|
+
const debouncedSearchQuery = useDebounce(searchQuery, 300);
|
|
94
|
+
const availableChainIds = useEnabledChainIds();
|
|
95
|
+
const { supportedInputTokens, supportedOutputTokens, supportedInputChains, supportedOutputChains, inputSelectionSearch, outputSelectionSearch, showInputSelectionTokenBalances, showOutputSelectionTokenBalances } = useWidgetConfig();
|
|
96
|
+
const showSearch = side === "base" ? inputSelectionSearch : outputSelectionSearch;
|
|
97
|
+
const showBalances = side === "base" ? showInputSelectionTokenBalances : showOutputSelectionTokenBalances;
|
|
98
|
+
const { setBaseToken, setQuoteToken } = useSwapFormContext();
|
|
99
|
+
const sideTokens = side === "base" ? supportedInputTokens : supportedOutputTokens;
|
|
100
|
+
const sideChains = side === "base" ? supportedInputChains : supportedOutputChains;
|
|
101
|
+
const hideChainsBar = sideChains.length === 1;
|
|
102
|
+
const supportedTokensSet = useMemo(() => {
|
|
103
|
+
if (sideTokens.length === 0) return null;
|
|
104
|
+
const s = /* @__PURE__ */ new Set();
|
|
105
|
+
for (const t of sideTokens) {
|
|
106
|
+
s.add(`${t.chainId}-${t.address.toLowerCase()}`);
|
|
107
|
+
}
|
|
108
|
+
return s;
|
|
109
|
+
}, [sideTokens]);
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
if (hideChainsBar) {
|
|
112
|
+
useWidgetSwapUIStore.getState().setAssetSelectionChain(sideChains[0]);
|
|
113
|
+
} else if (selectedChainFilter) {
|
|
114
|
+
useWidgetSwapUIStore.getState().setAssetSelectionChain(selectedChainFilter);
|
|
115
|
+
}
|
|
116
|
+
}, [selectedChainFilter, hideChainsBar, sideChains]);
|
|
117
|
+
const DISPLAY_CHAINS = React2.useMemo(() => {
|
|
118
|
+
const MEGAETH_CHAIN_ID = 4326;
|
|
119
|
+
const maxDisplayChains = 5;
|
|
120
|
+
const sideChainSet = sideChains.length > 0 ? new Set(sideChains) : null;
|
|
121
|
+
const availableChains = getAvailableChainConfigs(availableChainIds).filter((c) => !sideChainSet || sideChainSet.has(c.id)).map((c) => ({ chainId: c.id, name: c.displayName }));
|
|
122
|
+
const chainMap = new Map(availableChains.map((c) => [c.chainId, c]));
|
|
123
|
+
const result = [];
|
|
124
|
+
const used = /* @__PURE__ */ new Set();
|
|
125
|
+
const megaEth = chainMap.get(MEGAETH_CHAIN_ID);
|
|
126
|
+
if (megaEth) {
|
|
127
|
+
result.push(megaEth);
|
|
128
|
+
used.add(MEGAETH_CHAIN_ID);
|
|
129
|
+
}
|
|
130
|
+
for (const recentId of recentChainIds) {
|
|
131
|
+
if (result.length >= maxDisplayChains) break;
|
|
132
|
+
if (used.has(recentId)) continue;
|
|
133
|
+
const chain = chainMap.get(recentId);
|
|
134
|
+
if (chain) {
|
|
135
|
+
result.push(chain);
|
|
136
|
+
used.add(recentId);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
for (const chain of availableChains) {
|
|
140
|
+
if (result.length >= maxDisplayChains) break;
|
|
141
|
+
if (used.has(chain.chainId)) continue;
|
|
142
|
+
result.push(chain);
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}, [availableChainIds, recentChainIds, sideChains]);
|
|
146
|
+
const { enrichedTokens, isLoading } = useSupportedTokensWithPricing(
|
|
147
|
+
selectedChain === "all" ? "all" : selectedChain
|
|
148
|
+
);
|
|
149
|
+
const { tokenRegistry, getToken } = useTokenData();
|
|
150
|
+
const registrySet = useMemo(() => {
|
|
151
|
+
const s = /* @__PURE__ */ new Set();
|
|
152
|
+
for (const t of tokenRegistry) {
|
|
153
|
+
s.add(`${t.chainId}-${t.address.toLowerCase()}`);
|
|
154
|
+
}
|
|
155
|
+
return s;
|
|
156
|
+
}, [tokenRegistry]);
|
|
157
|
+
const whitelistedTokens = useMemo(() => {
|
|
158
|
+
if (!supportedTokensSet) return enrichedTokens;
|
|
159
|
+
return enrichedTokens.filter(
|
|
160
|
+
(t) => supportedTokensSet.has(`${t.chainId}-${t.address.toLowerCase()}`)
|
|
161
|
+
);
|
|
162
|
+
}, [enrichedTokens, supportedTokensSet]);
|
|
163
|
+
const tokenList = React2.useMemo(() => {
|
|
164
|
+
if (!debouncedSearchQuery) return whitelistedTokens;
|
|
165
|
+
const query = debouncedSearchQuery.toLowerCase();
|
|
166
|
+
return whitelistedTokens.filter(
|
|
167
|
+
(token) => (token.symbol || "").toLowerCase().includes(query) || (token.name || "").toLowerCase().includes(query) || token.address.toLowerCase().includes(query)
|
|
168
|
+
);
|
|
169
|
+
}, [whitelistedTokens, debouncedSearchQuery]);
|
|
170
|
+
const sortedTokens = React2.useMemo(() => {
|
|
171
|
+
const raw = selectedChain === "all" ? (tokenList || []).filter((t) => availableChainIds.includes(t.chainId)) : tokenList || [];
|
|
172
|
+
const seen = /* @__PURE__ */ new Set();
|
|
173
|
+
const base = raw.filter((t) => {
|
|
174
|
+
const k = `${t.chainId}-${t.address.toLowerCase()}`;
|
|
175
|
+
if (seen.has(k)) return false;
|
|
176
|
+
seen.add(k);
|
|
177
|
+
return true;
|
|
178
|
+
});
|
|
179
|
+
return [...base].sort((a, b) => {
|
|
180
|
+
const isAGas = isGasToken(a);
|
|
181
|
+
const isBGas = isGasToken(b);
|
|
182
|
+
if (isAGas && !isBGas) return -1;
|
|
183
|
+
if (!isAGas && isBGas) return 1;
|
|
184
|
+
if (a.marketCap && !b.marketCap) return -1;
|
|
185
|
+
if (!a.marketCap && b.marketCap) return 1;
|
|
186
|
+
if (!a.marketCap && !b.marketCap) return 0;
|
|
187
|
+
return b.marketCap - a.marketCap;
|
|
188
|
+
});
|
|
189
|
+
}, [tokenList, selectedChain, availableChainIds]);
|
|
190
|
+
const { balances: walletBalancesData, isLoading: isWalletBalanceLoading } = useBulkBalances(userAddress, availableChainIds, void 0, sideTokens.length > 0 ? sideTokens : void 0);
|
|
191
|
+
const balancesForChain = React2.useMemo(() => {
|
|
192
|
+
if (!walletBalancesData) return [];
|
|
193
|
+
const filtered = selectedChain === "all" ? walletBalancesData : walletBalancesData.filter((b) => b.chainId === selectedChain);
|
|
194
|
+
const seen = /* @__PURE__ */ new Set();
|
|
195
|
+
return filtered.filter((b) => {
|
|
196
|
+
const k = `${b.chainId}-${(b.address || "").toLowerCase()}`;
|
|
197
|
+
if (seen.has(k)) return false;
|
|
198
|
+
seen.add(k);
|
|
199
|
+
return true;
|
|
200
|
+
});
|
|
201
|
+
}, [walletBalancesData, selectedChain]);
|
|
202
|
+
const handleSearch = useCallback((e) => {
|
|
203
|
+
const query = e.target.value.toLowerCase();
|
|
204
|
+
const addressInput = checkedAddress(query);
|
|
205
|
+
const store = useWidgetSwapUIStore.getState();
|
|
206
|
+
if (addressInput) {
|
|
207
|
+
store.setAssetSelectionSearch(addressInput);
|
|
208
|
+
store.setAssetSelectionAddressInput(addressInput);
|
|
209
|
+
} else {
|
|
210
|
+
store.setAssetSelectionAddressInput("");
|
|
211
|
+
store.setAssetSelectionSearch(query);
|
|
212
|
+
}
|
|
213
|
+
}, []);
|
|
214
|
+
const handleFormSelection = useCallback(
|
|
215
|
+
async (asset) => {
|
|
216
|
+
if (side === "base") await setBaseToken(asset);
|
|
217
|
+
else if (side === "quote") await setQuoteToken(asset);
|
|
218
|
+
toggle();
|
|
219
|
+
},
|
|
220
|
+
[toggle, side, setBaseToken, setQuoteToken]
|
|
221
|
+
);
|
|
222
|
+
return /* @__PURE__ */ jsxs2("div", { className: "w-full h-full flex flex-col pt-2.5", children: [
|
|
223
|
+
!hideChainsBar && /* @__PURE__ */ jsxs2("div", { className: "flex flex-row justify-between py-1 flex-shrink-0 h-10", children: [
|
|
224
|
+
/* @__PURE__ */ jsx2(
|
|
225
|
+
"button",
|
|
226
|
+
{
|
|
227
|
+
type: "button",
|
|
228
|
+
className: "flex flex-row items-center w-full h-full px-2.5 whitespace-nowrap font-bold uppercase text-xs cursor-pointer",
|
|
229
|
+
style: {
|
|
230
|
+
backgroundColor: selectedChain === "all" && !selectedChainFilter ? "var(--widget-primary)" : "var(--widget-secondary)",
|
|
231
|
+
color: selectedChain === "all" && !selectedChainFilter ? "var(--widget-primary-foreground)" : "var(--widget-secondary-foreground)",
|
|
232
|
+
border: "1px solid var(--widget-border)",
|
|
233
|
+
borderRadius: "var(--widget-radius) 0 0 var(--widget-radius)"
|
|
234
|
+
},
|
|
235
|
+
onClick: (e) => {
|
|
236
|
+
e.stopPropagation();
|
|
237
|
+
useWidgetSwapUIStore.getState().setAssetSelectionChain("all");
|
|
238
|
+
},
|
|
239
|
+
onMouseEnter: () => onChainHover?.("All Chains"),
|
|
240
|
+
onMouseLeave: () => onChainHover?.(null),
|
|
241
|
+
children: "All"
|
|
242
|
+
}
|
|
243
|
+
),
|
|
244
|
+
DISPLAY_CHAINS.map((chain, index) => /* @__PURE__ */ jsx2(
|
|
245
|
+
"button",
|
|
246
|
+
{
|
|
247
|
+
type: "button",
|
|
248
|
+
className: "flex items-center justify-center px-2 w-full cursor-pointer",
|
|
249
|
+
style: {
|
|
250
|
+
backgroundColor: selectedChain === chain.chainId ? "var(--widget-primary)" : "var(--widget-secondary)",
|
|
251
|
+
color: selectedChain === chain.chainId ? "var(--widget-primary-foreground)" : "var(--widget-secondary-foreground)",
|
|
252
|
+
borderTop: "1px solid var(--widget-border)",
|
|
253
|
+
borderBottom: "1px solid var(--widget-border)",
|
|
254
|
+
borderLeft: index === 0 ? "none" : "1px solid var(--widget-border)",
|
|
255
|
+
borderRight: "1px solid var(--widget-border)"
|
|
256
|
+
},
|
|
257
|
+
onClick: (e) => {
|
|
258
|
+
e.stopPropagation();
|
|
259
|
+
useWidgetSwapUIStore.getState().setAssetSelectionChain(chain.chainId);
|
|
260
|
+
},
|
|
261
|
+
onMouseEnter: () => onChainHover?.(chain.name),
|
|
262
|
+
onMouseLeave: () => onChainHover?.(null),
|
|
263
|
+
children: /* @__PURE__ */ jsx2("div", { className: "mb-px h-4 w-4", children: /* @__PURE__ */ jsx2(ChainIcon_default, { chain: chain.chainId, size: "xs" }) })
|
|
264
|
+
},
|
|
265
|
+
chain.chainId
|
|
266
|
+
)),
|
|
267
|
+
onMoreChainsClick && /* @__PURE__ */ jsx2(
|
|
268
|
+
"button",
|
|
269
|
+
{
|
|
270
|
+
type: "button",
|
|
271
|
+
className: "flex flex-row cursor-pointer items-center w-full h-full px-2.5 whitespace-nowrap uppercase font-bold text-xs",
|
|
272
|
+
style: { backgroundColor: "var(--widget-secondary)", color: "var(--widget-secondary-foreground)", border: "1px solid var(--widget-border)", borderRadius: "0 var(--widget-radius) var(--widget-radius) 0" },
|
|
273
|
+
onClick: (e) => {
|
|
274
|
+
e.stopPropagation();
|
|
275
|
+
onMoreChainsClick();
|
|
276
|
+
},
|
|
277
|
+
children: "More"
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
] }),
|
|
281
|
+
showSearch && /* @__PURE__ */ jsx2("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsxs2("div", { className: "relative mt-1", children: [
|
|
282
|
+
/* @__PURE__ */ jsx2(
|
|
283
|
+
"input",
|
|
284
|
+
{
|
|
285
|
+
className: "w-full h-10 px-4 text-sm",
|
|
286
|
+
style: { backgroundColor: "var(--widget-card)", color: "var(--widget-card-foreground)", border: "1px solid var(--widget-border)" },
|
|
287
|
+
placeholder: "Search tokens by name, symbol, or address...",
|
|
288
|
+
autoComplete: "off",
|
|
289
|
+
value: searchQuery,
|
|
290
|
+
onChange: handleSearch
|
|
291
|
+
}
|
|
292
|
+
),
|
|
293
|
+
searchQuery && /* @__PURE__ */ jsx2(
|
|
294
|
+
"button",
|
|
295
|
+
{
|
|
296
|
+
type: "button",
|
|
297
|
+
onClick: () => useWidgetSwapUIStore.getState().setAssetSelectionSearch(""),
|
|
298
|
+
className: "absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer rounded-full px-2 py-1 text-xs",
|
|
299
|
+
style: {
|
|
300
|
+
backgroundColor: "var(--widget-secondary)",
|
|
301
|
+
color: "var(--widget-secondary-foreground)",
|
|
302
|
+
border: "1px solid var(--widget-border)"
|
|
303
|
+
},
|
|
304
|
+
children: "clear"
|
|
305
|
+
}
|
|
306
|
+
)
|
|
307
|
+
] }) }),
|
|
308
|
+
/* @__PURE__ */ jsxs2(
|
|
309
|
+
"div",
|
|
310
|
+
{
|
|
311
|
+
className: "flex-1 min-h-0 overflow-auto mt-2",
|
|
312
|
+
style: { backgroundColor: "var(--widget-background)" },
|
|
313
|
+
children: [
|
|
314
|
+
showBalances && !isWalletBalanceLoading && balancesForChain.length > 0 && !searchQuery && categoryState === "all" && /* @__PURE__ */ jsxs2("div", { children: [
|
|
315
|
+
/* @__PURE__ */ jsx2("p", { className: "my-1 ml-4 text-xs", style: { color: "var(--widget-muted-foreground)" }, children: "Your Tokens" }),
|
|
316
|
+
balancesForChain.filter((a) => {
|
|
317
|
+
if (!a.assetInfo) return false;
|
|
318
|
+
if (supportedTokensSet) {
|
|
319
|
+
return supportedTokensSet.has(`${a.assetInfo.chainId}-${a.assetInfo.address.toLowerCase()}`);
|
|
320
|
+
}
|
|
321
|
+
return isGasToken(a.assetInfo) || registrySet.has(
|
|
322
|
+
`${a.assetInfo.chainId}-${a.assetInfo.address.toLowerCase()}`
|
|
323
|
+
);
|
|
324
|
+
}).sort((a, b) => {
|
|
325
|
+
const aToken = getToken(a.chainId, a.address) || a.assetInfo;
|
|
326
|
+
const bToken = getToken(b.chainId, b.address) || b.assetInfo;
|
|
327
|
+
const aVal = aToken && a.decimals !== void 0 ? calculateDollarizedBalance(aToken, a.balance, a.decimals) : 0;
|
|
328
|
+
const bVal = bToken && b.decimals !== void 0 ? calculateDollarizedBalance(bToken, b.balance, b.decimals) : 0;
|
|
329
|
+
return bVal - aVal;
|
|
330
|
+
}).map((asset) => {
|
|
331
|
+
if (!asset.assetInfo || !otherAsset) return null;
|
|
332
|
+
return /* @__PURE__ */ jsx2(
|
|
333
|
+
AssetSelectionBalanceItem,
|
|
334
|
+
{
|
|
335
|
+
asset,
|
|
336
|
+
otherAsset,
|
|
337
|
+
handleFormSelection,
|
|
338
|
+
getToken
|
|
339
|
+
},
|
|
340
|
+
`${asset.assetInfo.chainId}-${asset.assetInfo.address}`
|
|
341
|
+
);
|
|
342
|
+
})
|
|
343
|
+
] }),
|
|
344
|
+
/* @__PURE__ */ jsx2("p", { className: "my-2 ml-4 text-xs", style: { color: "var(--widget-muted-foreground)" }, children: searchQuery ? "Search Results" : "Supported Tokens" }),
|
|
345
|
+
isLoading ? /* @__PURE__ */ jsx2("div", { className: "flex items-center justify-center p-8", children: /* @__PURE__ */ jsx2("span", { style: { color: "var(--widget-muted-foreground)" }, children: "Loading tokens..." }) }) : sortedTokens.length === 0 ? /* @__PURE__ */ jsx2("div", { className: "px-4 py-3 text-sm", style: { color: "var(--widget-muted-foreground)" }, children: "Token Not Found" }) : sortedTokens.map((token) => /* @__PURE__ */ jsxs2(
|
|
346
|
+
"div",
|
|
347
|
+
{
|
|
348
|
+
role: "button",
|
|
349
|
+
tabIndex: 0,
|
|
350
|
+
className: "w-full flex items-center justify-between p-3 cursor-pointer",
|
|
351
|
+
style: { borderBottom: "1px solid var(--widget-border)" },
|
|
352
|
+
onClick: () => handleFormSelection(token),
|
|
353
|
+
onKeyDown: (e) => {
|
|
354
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
355
|
+
e.preventDefault();
|
|
356
|
+
handleFormSelection(token);
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
children: [
|
|
360
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center space-x-3 min-w-0 flex-1", children: [
|
|
361
|
+
/* @__PURE__ */ jsx2(TokenImage_default, { asset: token, size: "md", className: "flex-shrink-0" }),
|
|
362
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex flex-col items-start min-w-0 flex-1", children: [
|
|
363
|
+
/* @__PURE__ */ jsx2("span", { className: "text-base font-medium truncate", style: { color: "var(--widget-foreground)" }, children: (token.symbol || "").length > 20 ? `${token.symbol.substring(0, 20)}...` : token.symbol || "\u2014" }),
|
|
364
|
+
/* @__PURE__ */ jsx2("span", { className: "text-sm truncate", style: { color: "var(--widget-muted-foreground)" }, children: (token.name || "").length > 20 ? `${token.name.substring(0, 20)}...` : token.name || "\u2014" })
|
|
365
|
+
] })
|
|
366
|
+
] }),
|
|
367
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex flex-col items-end text-right flex-shrink-0", children: [
|
|
368
|
+
/* @__PURE__ */ jsx2("span", { className: "text-xs font-mono", style: { color: "var(--widget-foreground)" }, children: token.price ? `$${token.price >= 999999 ? `${(token.price / 1e6).toFixed(2)}M` : token.price.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: token.price < 1 ? 5 : 2 })}` : "\u2014" }),
|
|
369
|
+
/* @__PURE__ */ jsxs2("span", { className: "text-xs font-mono", style: { color: "var(--widget-muted-foreground)" }, children: [
|
|
370
|
+
token.address?.slice(0, 6),
|
|
371
|
+
"...",
|
|
372
|
+
token.address?.slice(-4)
|
|
373
|
+
] })
|
|
374
|
+
] })
|
|
375
|
+
]
|
|
376
|
+
},
|
|
377
|
+
`${token.chainId}-${token.address}`
|
|
378
|
+
))
|
|
379
|
+
]
|
|
380
|
+
}
|
|
381
|
+
)
|
|
382
|
+
] });
|
|
383
|
+
};
|
|
384
|
+
var AssetSelectionMenu_default = AssetSelectionMenu;
|
|
385
|
+
|
|
386
|
+
export {
|
|
387
|
+
AssetSelectionMenu_default
|
|
388
|
+
};
|
|
389
|
+
//# sourceMappingURL=chunk-6YLNOZ7P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/AssetSelectionMenu.tsx","../src/components/AssetSelectionBalanceItem.tsx"],"sourcesContent":["'use client';\n\nimport { useSwapFormContext } from '../providers/SwapFormProvider';\nimport { useWidgetSwapUIStore } from '../stores/swapUIStore';\nimport type { Asset, SupportedChainId, TokenSelectCategory } from '../internal/types';\nimport { getAvailableChainConfigs, isGasToken } from '../internal/chainsConfig';\nimport { checkedAddress, calculateDollarizedBalance } from '../internal/helpers';\nimport { useDebounce } from '../internal/hooks/useDebounce';\nimport { useSupportedTokensWithPricing, useTokenData } from '../internal/queries/tokens/hooks';\nimport { useBulkBalances } from '../internal/queries/balances/hooks';\nimport TokenImage from '../internal/components/TokenImage';\nimport ChainIcon from '../internal/components/ChainIcon';\nimport { useWalletState } from '../wallet/useWalletState';\nimport { useWidgetConfig } from '../context/WidgetConfigContext';\nimport { useEnabledChainIds } from '../hooks/useEnabledChainIds';\nimport React, { useCallback, useEffect, useMemo } from 'react';\nimport { useShallow } from 'zustand/react/shallow';\nimport { AssetSelectionBalanceItem } from './AssetSelectionBalanceItem';\n\ninterface AssetSelectionMenuProps {\n toggle: () => void;\n side: 'base' | 'quote';\n otherAsset: Asset | null;\n containerHeight?: string;\n onChainHover?: (chainName: string | null) => void;\n onMoreChainsClick?: () => void;\n selectedChainFilter?: SupportedChainId | null;\n}\n\nconst AssetSelectionMenu: React.FC<AssetSelectionMenuProps> = ({\n toggle,\n side,\n otherAsset,\n containerHeight,\n onChainHover,\n onMoreChainsClick,\n selectedChainFilter,\n}) => {\n const { address: userAddress } = useWalletState();\n\n const {\n assetSelectionSearch: searchQuery,\n assetSelectionChain: selectedChain,\n assetSelectionCategory: categoryState,\n recentChainIds,\n } = useWidgetSwapUIStore(\n useShallow((state) => ({\n assetSelectionSearch: state.assetSelectionSearch,\n assetSelectionChain: state.assetSelectionChain,\n assetSelectionCategory: state.assetSelectionCategory,\n recentChainIds: state.recentChainIds,\n })),\n );\n\n const debouncedSearchQuery = useDebounce(searchQuery, 300);\n const availableChainIds = useEnabledChainIds();\n const { supportedInputTokens, supportedOutputTokens, supportedInputChains, supportedOutputChains, inputSelectionSearch, outputSelectionSearch, showInputSelectionTokenBalances, showOutputSelectionTokenBalances } = useWidgetConfig();\n const showSearch = side === 'base' ? inputSelectionSearch : outputSelectionSearch;\n const showBalances = side === 'base' ? showInputSelectionTokenBalances : showOutputSelectionTokenBalances;\n const { setBaseToken, setQuoteToken } = useSwapFormContext();\n\n const sideTokens = side === 'base' ? supportedInputTokens : supportedOutputTokens;\n const sideChains = side === 'base' ? supportedInputChains : supportedOutputChains;\n const hideChainsBar = sideChains.length === 1;\n\n const supportedTokensSet = useMemo(() => {\n if (sideTokens.length === 0) return null;\n const s = new Set<string>();\n for (const t of sideTokens) {\n s.add(`${t.chainId}-${t.address.toLowerCase()}`);\n }\n return s;\n }, [sideTokens]);\n\n useEffect(() => {\n if (hideChainsBar) {\n useWidgetSwapUIStore.getState().setAssetSelectionChain(sideChains[0] as SupportedChainId);\n } else if (selectedChainFilter) {\n useWidgetSwapUIStore.getState().setAssetSelectionChain(selectedChainFilter);\n }\n }, [selectedChainFilter, hideChainsBar, sideChains]);\n\n const DISPLAY_CHAINS = React.useMemo(() => {\n const MEGAETH_CHAIN_ID = 4326;\n const maxDisplayChains = 5;\n const sideChainSet = sideChains.length > 0 ? new Set(sideChains) : null;\n const availableChains = getAvailableChainConfigs(availableChainIds)\n .filter((c) => !sideChainSet || sideChainSet.has(c.id))\n .map((c) => ({ chainId: c.id, name: c.displayName }));\n const chainMap = new Map(availableChains.map((c) => [c.chainId, c]));\n const result: typeof availableChains = [];\n const used = new Set<number>();\n const megaEth = chainMap.get(MEGAETH_CHAIN_ID);\n if (megaEth) { result.push(megaEth); used.add(MEGAETH_CHAIN_ID); }\n for (const recentId of recentChainIds) {\n if (result.length >= maxDisplayChains) break;\n if (used.has(recentId as number)) continue;\n const chain = chainMap.get(recentId as number);\n if (chain) { result.push(chain); used.add(recentId as number); }\n }\n for (const chain of availableChains) {\n if (result.length >= maxDisplayChains) break;\n if (used.has(chain.chainId)) continue;\n result.push(chain);\n }\n return result;\n }, [availableChainIds, recentChainIds, sideChains]);\n\n const { enrichedTokens, isLoading } = useSupportedTokensWithPricing(\n selectedChain === 'all' ? 'all' : selectedChain,\n );\n const { tokenRegistry, getToken } = useTokenData();\n\n const registrySet = useMemo(() => {\n const s = new Set<string>();\n for (const t of tokenRegistry) {\n s.add(`${t.chainId}-${t.address.toLowerCase()}`);\n }\n return s;\n }, [tokenRegistry]);\n\n const whitelistedTokens = useMemo(() => {\n if (!supportedTokensSet) return enrichedTokens;\n return enrichedTokens.filter((t) =>\n supportedTokensSet.has(`${t.chainId}-${t.address.toLowerCase()}`),\n );\n }, [enrichedTokens, supportedTokensSet]);\n\n const tokenList = React.useMemo(() => {\n if (!debouncedSearchQuery) return whitelistedTokens;\n const query = debouncedSearchQuery.toLowerCase();\n return whitelistedTokens.filter(\n (token) =>\n (token.symbol || '').toLowerCase().includes(query) ||\n (token.name || '').toLowerCase().includes(query) ||\n token.address.toLowerCase().includes(query),\n );\n }, [whitelistedTokens, debouncedSearchQuery]);\n\n const sortedTokens = React.useMemo(() => {\n const raw = selectedChain === 'all'\n ? (tokenList || []).filter((t) => availableChainIds.includes(t.chainId))\n : (tokenList || []);\n const seen = new Set<string>();\n const base = raw.filter((t) => {\n const k = `${t.chainId}-${t.address.toLowerCase()}`;\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n return [...base].sort((a, b) => {\n const isAGas = isGasToken(a);\n const isBGas = isGasToken(b);\n if (isAGas && !isBGas) return -1;\n if (!isAGas && isBGas) return 1;\n if (a.marketCap && !b.marketCap) return -1;\n if (!a.marketCap && b.marketCap) return 1;\n if (!a.marketCap && !b.marketCap) return 0;\n return b.marketCap! - a.marketCap!;\n });\n }, [tokenList, selectedChain, availableChainIds]);\n\n const { balances: walletBalancesData, isLoading: isWalletBalanceLoading } =\n useBulkBalances(userAddress, availableChainIds, undefined, sideTokens.length > 0 ? sideTokens : undefined);\n\n const balancesForChain = React.useMemo(() => {\n if (!walletBalancesData) return [];\n const filtered = selectedChain === 'all' ? walletBalancesData : walletBalancesData.filter((b) => b.chainId === selectedChain);\n const seen = new Set<string>();\n return filtered.filter((b) => {\n const k = `${b.chainId}-${(b.address || '').toLowerCase()}`;\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n }, [walletBalancesData, selectedChain]);\n\n const handleSearch = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value.toLowerCase();\n const addressInput = checkedAddress(query);\n const store = useWidgetSwapUIStore.getState();\n if (addressInput) {\n store.setAssetSelectionSearch(addressInput);\n store.setAssetSelectionAddressInput(addressInput);\n } else {\n store.setAssetSelectionAddressInput('');\n store.setAssetSelectionSearch(query);\n }\n }, []);\n\n const handleFormSelection = useCallback(\n async (asset: Asset) => {\n if (side === 'base') await setBaseToken(asset);\n else if (side === 'quote') await setQuoteToken(asset);\n toggle();\n },\n [toggle, side, setBaseToken, setQuoteToken],\n );\n\n return (\n <div className=\"w-full h-full flex flex-col pt-2.5\">\n {!hideChainsBar && (\n <div className=\"flex flex-row justify-between py-1 flex-shrink-0 h-10\">\n <button\n type=\"button\"\n className=\"flex flex-row items-center w-full h-full px-2.5 whitespace-nowrap font-bold uppercase text-xs cursor-pointer\"\n style={{\n backgroundColor: selectedChain === 'all' && !selectedChainFilter ? 'var(--widget-primary)' : 'var(--widget-secondary)',\n color: selectedChain === 'all' && !selectedChainFilter ? 'var(--widget-primary-foreground)' : 'var(--widget-secondary-foreground)',\n border: '1px solid var(--widget-border)',\n borderRadius: 'var(--widget-radius) 0 0 var(--widget-radius)',\n }}\n onClick={(e) => { e.stopPropagation(); useWidgetSwapUIStore.getState().setAssetSelectionChain('all'); }}\n onMouseEnter={() => onChainHover?.('All Chains')}\n onMouseLeave={() => onChainHover?.(null)}\n >\n All\n </button>\n {DISPLAY_CHAINS.map((chain, index) => (\n <button\n key={chain.chainId}\n type=\"button\"\n className=\"flex items-center justify-center px-2 w-full cursor-pointer\"\n style={{\n backgroundColor: selectedChain === chain.chainId ? 'var(--widget-primary)' : 'var(--widget-secondary)',\n color: selectedChain === chain.chainId ? 'var(--widget-primary-foreground)' : 'var(--widget-secondary-foreground)',\n borderTop: '1px solid var(--widget-border)',\n borderBottom: '1px solid var(--widget-border)',\n borderLeft: index === 0 ? 'none' : '1px solid var(--widget-border)',\n borderRight: '1px solid var(--widget-border)',\n }}\n onClick={(e) => {\n e.stopPropagation();\n useWidgetSwapUIStore.getState().setAssetSelectionChain(chain.chainId as SupportedChainId);\n }}\n onMouseEnter={() => onChainHover?.(chain.name)}\n onMouseLeave={() => onChainHover?.(null)}\n >\n <div className=\"mb-px h-4 w-4\">\n <ChainIcon chain={chain.chainId} size=\"xs\" />\n </div>\n </button>\n ))}\n {onMoreChainsClick && (\n <button\n type=\"button\"\n className=\"flex flex-row cursor-pointer items-center w-full h-full px-2.5 whitespace-nowrap uppercase font-bold text-xs\"\n style={{ backgroundColor: 'var(--widget-secondary)', color: 'var(--widget-secondary-foreground)', border: '1px solid var(--widget-border)', borderRadius: '0 var(--widget-radius) var(--widget-radius) 0' }}\n onClick={(e) => { e.stopPropagation(); onMoreChainsClick(); }}\n >\n More\n </button>\n )}\n </div>\n )}\n\n {showSearch && (\n <div className=\"flex-shrink-0\">\n <div className=\"relative mt-1\">\n <input\n className=\"w-full h-10 px-4 text-sm\"\n style={{ backgroundColor: 'var(--widget-card)', color: 'var(--widget-card-foreground)', border: '1px solid var(--widget-border)' }}\n placeholder=\"Search tokens by name, symbol, or address...\"\n autoComplete=\"off\"\n value={searchQuery}\n onChange={handleSearch}\n />\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => useWidgetSwapUIStore.getState().setAssetSelectionSearch('')}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 cursor-pointer rounded-full px-2 py-1 text-xs\"\n style={{\n backgroundColor: 'var(--widget-secondary)',\n color: 'var(--widget-secondary-foreground)',\n border: '1px solid var(--widget-border)',\n }}\n >\n clear\n </button>\n )}\n </div>\n </div>\n )}\n\n <div\n className=\"flex-1 min-h-0 overflow-auto mt-2\"\n style={{ backgroundColor: 'var(--widget-background)' }}\n >\n {showBalances && !isWalletBalanceLoading && balancesForChain.length > 0 && !searchQuery && categoryState === 'all' && (\n <div>\n <p className=\"my-1 ml-4 text-xs\" style={{ color: 'var(--widget-muted-foreground)' }}>Your Tokens</p>\n {balancesForChain\n .filter((a) => {\n if (!a.assetInfo) return false;\n if (supportedTokensSet) {\n return supportedTokensSet.has(`${a.assetInfo.chainId}-${a.assetInfo.address.toLowerCase()}`);\n }\n return isGasToken(a.assetInfo) || registrySet.has(\n `${a.assetInfo.chainId}-${a.assetInfo.address.toLowerCase()}`,\n );\n })\n .sort((a, b) => {\n const aToken = getToken(a.chainId, a.address) || a.assetInfo;\n const bToken = getToken(b.chainId, b.address) || b.assetInfo;\n const aVal = aToken && a.decimals !== undefined ? calculateDollarizedBalance(aToken, a.balance, a.decimals) : 0;\n const bVal = bToken && b.decimals !== undefined ? calculateDollarizedBalance(bToken, b.balance, b.decimals) : 0;\n return bVal - aVal;\n })\n .map((asset) => {\n if (!asset.assetInfo || !otherAsset) return null;\n return (\n <AssetSelectionBalanceItem\n key={`${asset.assetInfo.chainId}-${asset.assetInfo.address}`}\n asset={asset}\n otherAsset={otherAsset}\n handleFormSelection={handleFormSelection}\n getToken={getToken}\n />\n );\n })}\n </div>\n )}\n\n <p className=\"my-2 ml-4 text-xs\" style={{ color: 'var(--widget-muted-foreground)' }}>\n {searchQuery ? 'Search Results' : 'Supported Tokens'}\n </p>\n\n {isLoading ? (\n <div className=\"flex items-center justify-center p-8\">\n <span style={{ color: 'var(--widget-muted-foreground)' }}>Loading tokens...</span>\n </div>\n ) : sortedTokens.length === 0 ? (\n <div className=\"px-4 py-3 text-sm\" style={{ color: 'var(--widget-muted-foreground)' }}>Token Not Found</div>\n ) : (\n sortedTokens.map((token) => (\n <div\n key={`${token.chainId}-${token.address}`}\n role=\"button\"\n tabIndex={0}\n className=\"w-full flex items-center justify-between p-3 cursor-pointer\"\n style={{ borderBottom: '1px solid var(--widget-border)' }}\n onClick={() => handleFormSelection(token)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleFormSelection(token); } }}\n >\n <div className=\"flex items-center space-x-3 min-w-0 flex-1\">\n <TokenImage asset={token} size=\"md\" className=\"flex-shrink-0\" />\n <div className=\"flex flex-col items-start min-w-0 flex-1\">\n <span className=\"text-base font-medium truncate\" style={{ color: 'var(--widget-foreground)' }}>\n {(token.symbol || '').length > 20 ? `${token.symbol.substring(0, 20)}...` : (token.symbol || '—')}\n </span>\n <span className=\"text-sm truncate\" style={{ color: 'var(--widget-muted-foreground)' }}>\n {(token.name || '').length > 20 ? `${token.name.substring(0, 20)}...` : (token.name || '—')}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col items-end text-right flex-shrink-0\">\n <span className=\"text-xs font-mono\" style={{ color: 'var(--widget-foreground)' }}>\n {token.price ? `$${token.price >= 999999 ? `${(token.price / 1e6).toFixed(2)}M` : token.price.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: token.price < 1 ? 5 : 2 })}` : '—'}\n </span>\n <span className=\"text-xs font-mono\" style={{ color: 'var(--widget-muted-foreground)' }}>\n {token.address?.slice(0, 6)}...{token.address?.slice(-4)}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n );\n};\n\nexport default AssetSelectionMenu;\n","'use client';\n\nimport {\n TokenImage,\n useTokenWithLazyLoad,\n type Asset,\n calculateDollarizedBalance,\n isGasToken,\n} from '../internal';\nimport React from 'react';\n\ninterface AssetSelectionBalanceItemProps {\n asset: {\n assetInfo?: Asset | null;\n balance: string;\n decimals: number;\n chainId: number;\n address: string;\n };\n otherAsset: Asset;\n handleFormSelection: (asset: Asset, otherAsset: Asset) => void;\n getToken: (chainId: number, address: string) => Asset | undefined;\n}\n\nexport const AssetSelectionBalanceItem = React.memo<AssetSelectionBalanceItemProps>(\n ({ asset, otherAsset, handleFormSelection, getToken }) => {\n const { token: lazyToken } = useTokenWithLazyLoad(asset.chainId, asset.address);\n const cachedToken = getToken(asset.chainId, asset.address);\n const token = lazyToken || cachedToken || asset.assetInfo;\n\n if (!token) return null;\n\n const hasPrice = token.price != null;\n const dollarValue =\n hasPrice && asset.decimals !== undefined\n ? calculateDollarizedBalance(token, asset.balance, asset.decimals)\n : null;\n\n return (\n <button\n key={`${token.chainId}-${token.address}`}\n type=\"button\"\n className=\"w-full flex items-center justify-between p-3 cursor-pointer\"\n style={{ borderBottom: '1px solid var(--widget-border)' }}\n onClick={() => handleFormSelection(token, otherAsset)}\n >\n <div className=\"flex items-center space-x-3 min-w-0 flex-1\">\n <TokenImage asset={token} size=\"md\" className=\"flex-shrink-0\" />\n <div className=\"flex flex-col items-start min-w-0 flex-1\">\n <span className=\"text-base font-medium\" style={{ color: 'var(--widget-foreground)' }}>\n {token.symbol.length > 20 ? `${token.symbol.substring(0, 20)}...` : token.symbol}\n </span>\n <span className=\"text-sm\" style={{ color: 'var(--widget-foreground)', opacity: 0.6 }}>\n {token.name.length > 20 ? `${token.name.substring(0, 20)}...` : token.name}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col items-end text-right flex-shrink-0\">\n <span className=\"text-xs font-mono\" style={{ color: 'var(--widget-foreground)', opacity: 0.5 }}>Balance:</span>\n <span className=\"text-xs font-mono\" style={{ color: 'var(--widget-foreground)' }}>\n {dollarValue != null ? `$${dollarValue.toFixed(2)}` : '—'}\n </span>\n </div>\n </button>\n );\n },\n (prevProps, nextProps) =>\n prevProps.asset.address === nextProps.asset.address &&\n prevProps.asset.chainId === nextProps.asset.chainId &&\n prevProps.asset.balance === nextProps.asset.balance &&\n prevProps.asset.assetInfo?.price === nextProps.asset.assetInfo?.price &&\n prevProps.otherAsset.address === nextProps.otherAsset.address,\n);\n\nAssetSelectionBalanceItem.displayName = 'AssetSelectionBalanceItem';\n"],"mappings":"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","names":["React","jsx","jsxs","React"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/wallet/useWalletState.ts
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
import { useAccount } from "wagmi";
|
|
6
|
+
function useClientMounted() {
|
|
7
|
+
const [mounted, setMounted] = useState(false);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
setMounted(true);
|
|
10
|
+
}, []);
|
|
11
|
+
return mounted;
|
|
12
|
+
}
|
|
13
|
+
function useWalletState() {
|
|
14
|
+
const mounted = useClientMounted();
|
|
15
|
+
const { address, isConnected, isConnecting, isReconnecting } = useAccount();
|
|
16
|
+
return {
|
|
17
|
+
mounted,
|
|
18
|
+
address,
|
|
19
|
+
isConnected,
|
|
20
|
+
isLoading: isConnecting || isReconnecting
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
useWalletState
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=chunk-7AWG6OWF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/wallet/useWalletState.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport { useAccount } from 'wagmi';\n\nfunction useClientMounted() {\n const [mounted, setMounted] = useState(false);\n useEffect(() => { setMounted(true); }, []);\n return mounted;\n}\n\nexport function useWalletState() {\n const mounted = useClientMounted();\n const { address, isConnected, isConnecting, isReconnecting } = useAccount();\n\n return {\n mounted,\n address,\n isConnected,\n isLoading: isConnecting || isReconnecting,\n };\n}\n"],"mappings":";;;AAEA,SAAS,WAAW,gBAAgB;AACpC,SAAS,kBAAkB;AAE3B,SAAS,mBAAmB;AAC1B,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,YAAU,MAAM;AAAE,eAAW,IAAI;AAAA,EAAG,GAAG,CAAC,CAAC;AACzC,SAAO;AACT;AAEO,SAAS,iBAAiB;AAC/B,QAAM,UAAU,iBAAiB;AACjC,QAAM,EAAE,SAAS,aAAa,cAAc,eAAe,IAAI,WAAW;AAE1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,gBAAgB;AAAA,EAC7B;AACF;","names":[]}
|