@relayprotocol/relay-kit-ui 10.0.1 → 11.0.1
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/_cjs/src/components/common/TokenSelector/PaymentMethod.js +9 -9
- package/_cjs/src/components/common/TokenSelector/PaymentMethod.js.map +1 -1
- package/_cjs/src/components/common/TokenSelector/TokenSelector.js +8 -8
- package/_cjs/src/components/common/TokenSelector/TokenSelector.js.map +1 -1
- package/_cjs/src/components/widgets/SwapWidgetRenderer.js +6 -39
- package/_cjs/src/components/widgets/SwapWidgetRenderer.js.map +1 -1
- package/_cjs/src/constants/walletCompatibility.js +4 -1
- package/_cjs/src/constants/walletCompatibility.js.map +1 -1
- package/_cjs/src/hooks/index.js +5 -3
- package/_cjs/src/hooks/index.js.map +1 -1
- package/_cjs/src/hooks/useCodexBalances.js +305 -0
- package/_cjs/src/hooks/useCodexBalances.js.map +1 -0
- package/_cjs/src/hooks/useCurrencyBalance.js +18 -74
- package/_cjs/src/hooks/useCurrencyBalance.js.map +1 -1
- package/_cjs/src/hooks/useEnhancedTokensList.js.map +1 -1
- package/_cjs/src/hooks/useMultiWalletBalances.js +19 -37
- package/_cjs/src/hooks/useMultiWalletBalances.js.map +1 -1
- package/_cjs/src/hooks/useSolanaBalance.js +60 -0
- package/_cjs/src/hooks/useSolanaBalance.js.map +1 -0
- package/_cjs/src/providers/RelayKitProvider.js +1 -1
- package/_cjs/src/providers/RelayKitProvider.js.map +1 -1
- package/_cjs/src/version.js +1 -1
- package/_cjs/src/version.js.map +1 -1
- package/_cjs/tsconfig.build.tsbuildinfo +1 -1
- package/_esm/src/components/common/TokenSelector/PaymentMethod.js +9 -9
- package/_esm/src/components/common/TokenSelector/PaymentMethod.js.map +1 -1
- package/_esm/src/components/common/TokenSelector/TokenSelector.js +10 -10
- package/_esm/src/components/common/TokenSelector/TokenSelector.js.map +1 -1
- package/_esm/src/components/widgets/SwapWidgetRenderer.js +6 -41
- package/_esm/src/components/widgets/SwapWidgetRenderer.js.map +1 -1
- package/_esm/src/constants/walletCompatibility.js +4 -1
- package/_esm/src/constants/walletCompatibility.js.map +1 -1
- package/_esm/src/hooks/index.js +3 -2
- package/_esm/src/hooks/index.js.map +1 -1
- package/_esm/src/hooks/useCodexBalances.js +311 -0
- package/_esm/src/hooks/useCodexBalances.js.map +1 -0
- package/_esm/src/hooks/useCurrencyBalance.js +18 -74
- package/_esm/src/hooks/useCurrencyBalance.js.map +1 -1
- package/_esm/src/hooks/useEnhancedTokensList.js.map +1 -1
- package/_esm/src/hooks/useMultiWalletBalances.js +18 -39
- package/_esm/src/hooks/useMultiWalletBalances.js.map +1 -1
- package/_esm/src/hooks/useSolanaBalance.js +58 -0
- package/_esm/src/hooks/useSolanaBalance.js.map +1 -0
- package/_esm/src/providers/RelayKitProvider.js +1 -1
- package/_esm/src/providers/RelayKitProvider.js.map +1 -1
- package/_esm/src/version.js +1 -1
- package/_esm/src/version.js.map +1 -1
- package/_esm/tsconfig.build.tsbuildinfo +1 -1
- package/_types/src/components/common/TokenSelector/PaymentMethod.d.ts.map +1 -1
- package/_types/src/components/common/TokenSelector/TokenSelector.d.ts.map +1 -1
- package/_types/src/components/widgets/SwapWidgetRenderer.d.ts.map +1 -1
- package/_types/src/constants/walletCompatibility.d.ts.map +1 -1
- package/_types/src/hooks/index.d.ts +3 -2
- package/_types/src/hooks/index.d.ts.map +1 -1
- package/_types/src/hooks/useCodexBalances.d.ts +45 -0
- package/_types/src/hooks/useCodexBalances.d.ts.map +1 -0
- package/_types/src/hooks/useCurrencyBalance.d.ts +0 -1
- package/_types/src/hooks/useCurrencyBalance.d.ts.map +1 -1
- package/_types/src/hooks/useEnhancedTokensList.d.ts +1 -1
- package/_types/src/hooks/useEnhancedTokensList.d.ts.map +1 -1
- package/_types/src/hooks/useMultiWalletBalances.d.ts +3 -12
- package/_types/src/hooks/useMultiWalletBalances.d.ts.map +1 -1
- package/_types/src/hooks/{useEclipseBalance.d.ts → useSolanaBalance.d.ts} +2 -2
- package/_types/src/hooks/useSolanaBalance.d.ts.map +1 -0
- package/_types/src/providers/RelayKitProvider.d.ts +3 -3
- package/_types/src/providers/RelayKitProvider.d.ts.map +1 -1
- package/_types/src/version.d.ts +1 -1
- package/_types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/_cjs/src/hooks/useDuneBalances.js +0 -100
- package/_cjs/src/hooks/useDuneBalances.js.map +0 -1
- package/_cjs/src/hooks/useEclipseBalance.js +0 -47
- package/_cjs/src/hooks/useEclipseBalance.js.map +0 -1
- package/_esm/src/hooks/useDuneBalances.js +0 -102
- package/_esm/src/hooks/useDuneBalances.js.map +0 -1
- package/_esm/src/hooks/useEclipseBalance.js +0 -44
- package/_esm/src/hooks/useEclipseBalance.js.map +0 -1
- package/_types/src/hooks/useDuneBalances.d.ts +0 -25
- package/_types/src/hooks/useDuneBalances.d.ts.map +0 -1
- package/_types/src/hooks/useEclipseBalance.d.ts.map +0 -1
|
@@ -99,13 +99,13 @@ const PaymentMethod = ({ token, trigger, chainIdsFilter, lockedChainIds, context
|
|
|
99
99
|
...chainFilterOptions
|
|
100
100
|
], [isReceivingDepositAddress, chainFilterOptions]);
|
|
101
101
|
const useDefaultTokenList = debouncedTokenSearchValue === '';
|
|
102
|
-
const { balanceMap: tokenBalances, data:
|
|
103
|
-
const
|
|
104
|
-
return
|
|
105
|
-
}, [
|
|
102
|
+
const { balanceMap: tokenBalances, data: walletTokens, isLoading: isLoadingBalances } = (0, useMultiWalletBalances_js_1.useMultiWalletBalances)(linkedWallets, address);
|
|
103
|
+
const filteredTokenBalances = (0, react_1.useMemo)(() => {
|
|
104
|
+
return walletTokens?.balances;
|
|
105
|
+
}, [walletTokens?.balances]);
|
|
106
106
|
const userTokensQuery = (0, react_1.useMemo)(() => {
|
|
107
|
-
if (
|
|
108
|
-
const sortedBalances = [...
|
|
107
|
+
if (filteredTokenBalances && filteredTokenBalances.length > 0) {
|
|
108
|
+
const sortedBalances = [...filteredTokenBalances]
|
|
109
109
|
.sort((a, b) => {
|
|
110
110
|
const aValue = a.value_usd || 0;
|
|
111
111
|
const bValue = b.value_usd || 0;
|
|
@@ -115,7 +115,7 @@ const PaymentMethod = ({ token, trigger, chainIdsFilter, lockedChainIds, context
|
|
|
115
115
|
return sortedBalances.map((balance) => `${balance.chain_id}:${balance.address}`);
|
|
116
116
|
}
|
|
117
117
|
return undefined;
|
|
118
|
-
}, [
|
|
118
|
+
}, [filteredTokenBalances]);
|
|
119
119
|
const { data: userTokens, isLoading: isLoadingUserTokens } = (0, relay_kit_hooks_1.useTokenList)(relayClient?.baseApiUrl, userTokensQuery
|
|
120
120
|
? {
|
|
121
121
|
tokens: userTokensQuery,
|
|
@@ -124,7 +124,7 @@ const PaymentMethod = ({ token, trigger, chainIdsFilter, lockedChainIds, context
|
|
|
124
124
|
referrer: relayClient?.source
|
|
125
125
|
}
|
|
126
126
|
: undefined, {
|
|
127
|
-
enabled: !!
|
|
127
|
+
enabled: !!filteredTokenBalances
|
|
128
128
|
});
|
|
129
129
|
const isSearchTermValidAddress = (0, address_js_1.isValidAddress)(chainFilter.vmType, debouncedTokenSearchValue, chainFilter.id);
|
|
130
130
|
const { data: trendingTokens, isLoading: isLoadingTrendingTokens } = (0, relay_kit_hooks_2.useTrendingCurrencies)(relayClient?.baseApiUrl, {
|
|
@@ -336,7 +336,7 @@ const PaymentMethod = ({ token, trigger, chainIdsFilter, lockedChainIds, context
|
|
|
336
336
|
handleTokenSelection(token);
|
|
337
337
|
} })) : null, tokenSearchInput.length > 0 ? ((0, jsx_runtime_1.jsx)(TokenList_js_1.TokenList, { title: "Results", tokens: sortedCombinedTokens, isLoading: isLoadingTokenList ||
|
|
338
338
|
tokenSearchInput !== debouncedTokenSearchValue, isLoadingBalances: isLoadingBalances, chainFilterId: chainFilter.id })) : chainFilter.id ? ((0, jsx_runtime_1.jsx)(TokenList_js_1.TokenList, { title: "Tokens", tokens: sortedCombinedTokens, isLoading: isLoadingTokenList, isLoadingBalances: isLoadingBalances, chainFilterId: chainFilter.id })) : ((0, jsx_runtime_1.jsx)(index_js_1.Flex, { direction: "column", className: "relay:gap-3", children: (() => {
|
|
339
|
-
const hasLoadedBalanceData = Boolean(
|
|
339
|
+
const hasLoadedBalanceData = Boolean(walletTokens);
|
|
340
340
|
const userTokensReady = !isLoadingUserTokens;
|
|
341
341
|
const isWaitingForBalanceData = address &&
|
|
342
342
|
(isLoadingBalances || isLoadingUserTokens) &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentMethod.js","sourceRoot":"","sources":["../../../../../src/components/common/TokenSelector/PaymentMethod.tsx"],"names":[],"mappings":";;;;AAAA,iCAOc;AACd,wDAA0E;AAC1E,0CAAmC;AACnC,sEAAgE;AAChE,2FAAuF;AACvF,iFAA6E;AAC7E,mFAA+E;AAG/E,iGAA6D;AAE7D,sDAA0D;AAC1D,wFAAiF;AACjF,6CAA2C;AAC3C,oEAA6D;AAC7D,4DAAyD;AACzD,gFAAuE;AACvE,wEAAiE;AACjE,sFAA+E;AAC/E,iDAA0C;AAC1C,gFAA0F;AAC1F,oEAAkE;AAClE,0DAAgF;AAChF,0EAG2C;AAC3C,wDAA0D;AAC1D,0DAAmD;AACnD,6DAAsD;AACtD,wDAA0D;AAE1D,sEAGwC;AACxC,sDAAgE;AAChE,oEAAsE;AACtE,oEAAmE;AACnE,+DAAwD;AACxD,mEAA4D;AAoB5D,MAAM,aAAa,GAA2B,CAAC,EAC7C,KAAK,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACd,OAAO,EACP,OAAO,EACP,cAAc,EACd,yBAAyB,GAAG,KAAK,EACjC,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,QAAQ,EACR,eAAe,EACf,yBAAyB,EAC1B,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,IAAA,oCAAc,GAAE,CAAA;IAC/B,MAAM,WAAW,GAAG,IAAA,2BAAc,GAAE,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAA,iCAAsB,GAAE,CAAA;IAE3D,MAAM,SAAS,GAAG,IAAA,2BAAa,EAAC,oBAAoB,CAAC,CAAA;IAErD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAA;IAEvC,MAAM,CAAC,wBAAwB,EAAE,2BAA2B,CAAC,GAC3D,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAA;IACjB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,GAAqB,CAAA;IAE3E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAmB;QAC/D,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,YAAY;KACnB,CAAC,CAAA;IACF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,EACpD,GAAG,EAAE,CAAC,IAAA,oCAAkB,GAAE,CAC3B,CAAA;IAED,MAAM,EACJ,KAAK,EAAE,gBAAgB,EACvB,cAAc,EAAE,yBAAyB,EACzC,QAAQ,EAAE,mBAAmB,EAC9B,GAAG,IAAA,2BAAgB,EAAS,EAAE,EAAE,GAAG,CAAC,CAAA;IAErC,MAAM,kBAAkB,GACtB,OAAO,KAAK,MAAM;QAChB,CAAC,CAAC,WAAW,EAAE,MAAM;YACnB,CAAC,CAAC,CAAC,kBAAkB,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;YACnD,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE;gBACf,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,CAAC,0BAA0B,IAAI,WAAW,CAAC,EAAE,KAAK,KAAK,EAAE,OAAO;QACtE,CAAC,CAAC,CAAC,0BAA0B,CAAA;IAEjC,MAAM,yBAAyB,GAAG,kBAAkB,IAAI,OAAO,KAAK,IAAI,CAAA;IAGxE,MAAM,gBAAgB,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QACpC,IAAI,MAAM,GACR,cAAc,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/B,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CACtE,IAAI,EAAE,CAAA;QAET,IAAI,CAAC,yBAAyB,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACrD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,yBAAyB,EAAE,CAAC;YAC9B,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,uDAAiC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAC5D,CAAA;QACH,CAAC;QAED,OAAO,IAAA,6BAAU,EAAC,MAAM,CAAC,CAAA;IAC3B,CAAC,EAAE;QACD,cAAc;QACd,WAAW,EAAE,MAAM;QACnB,yBAAyB;QACzB,OAAO;QACP,kBAAkB;KACnB,CAAC,CAAA;IAEF,MAAM,kBAAkB,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QACtC,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,IAAI,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACzD,IAAI,cAAc,EAAE,CAAC;YACnB,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;QACpE,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,CAAC,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAE1E,MAAM,6BAA6B,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAA;IAEnE,MAAM,kBAAkB,GACtB,OAAO,KAAK,MAAM;QAChB,CAAC,CAAC,gBAAgB,EAAE,MAAM,CACtB,CAAC,KAAK,EAAE,EAAE,CACR,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK;YACrB,KAAK,CAAC,MAAM,KAAK,KAAK;YACtB,KAAK,CAAC,MAAM,KAAK,OAAO;YACxB,KAAK,CAAC,MAAM,KAAK,QAAQ;YACzB,KAAK,CAAC,EAAE,KAAK,kBAAM,CAAC,EAAE;YACtB,KAAK,CAAC,EAAE,KAAK,mBAAO,CAAC,EAAE;YACvB,KAAK,CAAC,EAAE,KAAK,oBAAO,CAAC,EAAE,CAAC;YAC1B,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CACxC;QACH,CAAC,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CACjC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CACtC,CAAA;IAEP,MAAM,SAAS,GAAG,IAAA,eAAO,EACvB,GAAG,EAAE,CAAC;QACJ,GAAG,CAAC,yBAAyB;YAC3B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC5C,GAAG,kBAAkB;KACtB,EACD,CAAC,yBAAyB,EAAE,kBAAkB,CAAC,CAChD,CAAA;IAED,MAAM,mBAAmB,GAAG,yBAAyB,KAAK,EAAE,CAAA;IAE5D,MAAM,EACJ,UAAU,EAAE,aAAa,EACzB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,iBAAiB,EAC7B,GAAG,IAAA,kDAAsB,EACxB,aAAa,EACb,OAAO,EACP,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CACrE,CAAA;IAED,MAAM,yBAAyB,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC7C,OAAO,UAAU,EAAE,QAAQ,CAAA;IAC7B,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;IAE1B,MAAM,eAAe,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QACnC,IAAI,yBAAyB,IAAI,yBAAyB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtE,MAAM,cAAc,GAAG,CAAC,GAAG,yBAAyB,CAAC;iBAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACb,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAA;gBAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAA;gBAC/B,OAAO,MAAM,GAAG,MAAM,CAAA;YACxB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAEf,OAAO,cAAc,CAAC,GAAG,CACvB,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CACtD,CAAA;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAA;IAE/B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,GAAG,IAAA,8BAAY,EACvE,WAAW,EAAE,UAAU,EACvB,eAAe;QACb,CAAC,CAAC;YACE,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,GAAG;YACV,kBAAkB;YAClB,QAAQ,EAAE,WAAW,EAAE,MAAM;SAC9B;QACH,CAAC,CAAC,SAAS,EACb;QACE,OAAO,EAAE,CAAC,CAAC,yBAAyB;KACrC,CACF,CAAA;IAED,MAAM,wBAAwB,GAAG,IAAA,2BAAkB,EACjD,WAAW,CAAC,MAAM,EAClB,yBAAyB,EACzB,WAAW,CAAC,EAAE,CACf,CAAA;IAED,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,uBAAuB,EAAE,GAChE,IAAA,uCAAqB,EACnB,WAAW,EAAE,UAAU,EACvB;QACE,QAAQ,EAAE,WAAW,EAAE,MAAM;KAC9B,EACD;QACE,OAAO,EAAE,OAAO,KAAK,IAAI;KAC1B,CACF,CAAA;IAGH,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,IAAA,8BAAY,EACrE,WAAW,EAAE,UAAU,EACvB;QACE,QAAQ,EAAE,WAAW,CAAC,EAAE;YACtB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;YAClB,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS;QACzE,IAAI,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS;QACvE,WAAW,EAAE,mBAAmB,IAAI,CAAC,kBAAkB;QACvD,KAAK,EAAE,EAAE;QACT,kBAAkB;QAClB,QAAQ,EAAE,WAAW,EAAE,MAAM;KAC9B,CACF,CAAA;IAED,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,qBAAqB,EAAE,GACjE,IAAA,8BAAY,EACV,WAAW,EAAE,UAAU,EACvB;QACE,QAAQ,EAAE,WAAW,CAAC,EAAE;YACtB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;YAClB,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,wBAAwB;YAC/B,CAAC,CAAC,yBAAyB;YAC3B,CAAC,CAAC,SAAS;QACb,IAAI,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS;QACvE,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,EAAE;QACT,iBAAiB,EAAE,IAAI;QACvB,QAAQ,EAAE,WAAW,EAAE,MAAM;KAC9B,EACD;QACE,OAAO,EAAE,CAAC,CAAC,yBAAyB,IAAI,CAAC,kBAAkB;KAC5D,CACF,CAAA;IAGH,MAAM,iBAAiB,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QACrC,IAAI,CAAC,yBAAyB;YAAE,OAAO,SAAS,CAAA;QAChD,OAAO,IAAA,2BAAe,EAAC,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAA;IACxD,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,yBAAyB,CAAC,CAAC,CAAA;IAE7D,MAAM,gBAAgB,GAAG,IAAA,gDAAqB,EAC5C,UAAU,EACV,aAAa,EACb,OAAO,EACP,yBAAyB,EACzB,WAAW,CAAC,EAAE,EACd,IAAI,CACL,CAAA;IAED,MAAM,oBAAoB,GAAG,IAAA,gDAAqB,EAChD,cAAc,EACd,aAAa,EACb,IAAI,EACJ,yBAAyB,EACzB,SAAS,EACT,KAAK,CACN,CAAA;IACD,MAAM,oBAAoB,GAAG,IAAA,gDAAqB,EAChD,iBAAiB,EACjB,aAAa,EACb,OAAO,EACP,yBAAyB,EACzB,WAAW,CAAC,EAAE,EACd,KAAK,CACN,CAAA;IAED,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GACzD,IAAA,gBAAQ,EAA0B,IAAI,CAAC,CAAA;IACzC,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,GACzD,IAAA,gBAAQ,EAA0B,IAAI,CAAC,CAAA;IAEzC,MAAM,YAAY,GAAG,6BAA6B;QAChD,CAAC,CAAC,uBAAuB;QACzB,CAAC,CAAC,uBAAuB,CAAA;IAE3B,MAAM,qBAAqB,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC7C,kBAAkB,CAAC,IAAA,oCAAkB,GAAE,CAAC,CAAA;IAC1C,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,IAAI,EAAE,CAAC;YACT,kBAAkB,CAAC,IAAA,oCAAkB,GAAE,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAClC,mBAAmB,CAAC,EAAE,CAAC,CAAA;QACvB,0BAA0B,CAAC,IAAI,CAAC,CAAA;QAChC,0BAA0B,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,YAAY,GAAG,IAAA,mBAAW,EAC9B,CAAC,UAAmB,EAAE,EAAE;QACtB,IAAI,UAAU,GAAG,SAAS,CAAA;QAC1B,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAEhB,IAAI,CAAC;YACH,IAAI,CAAC,iBAAiB,IAAI,aAAa,EAAE,CAAC;gBACxC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAA;gBAC9C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM;wBAC9B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;wBAC5B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;oBAChB,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;wBAC3B,SAAS,IAAI,CAAC,CAAA;oBAChB,CAAC;yBAAM,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;wBAClC,SAAS,IAAI,CAAC,CAAA;oBAChB,CAAC;yBAAM,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;wBACjC,QAAQ,IAAI,CAAC,CAAA;oBACf,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,eAAe,EAAE,CACf,UAAU;gBACR,CAAC,CAAC,sBAAU,CAAC,uBAAuB;gBACpC,CAAC,CAAC,sBAAU,CAAC,sBAAsB,EACrC;gBACE,SAAS,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;gBAClD,GAAG,CAAC,CAAC,UAAU,IAAI;oBACjB,WAAW,EAAE;wBACX,UAAU;wBACV,SAAS;wBACT,SAAS;wBACT,QAAQ;wBACR,cAAc,EAAE,OAAO;qBACxB;iBACF,CAAC;aACH,CACF,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,IAAA,wCAAqB,EACvC,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,KAAK,EACL,IAAI,CACL,CAAA;YACD,cAAc,CAAC,WAAW,CAAC,CAAA;QAC7B,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,CAAA;QACnB,yBAAyB,EAAE,CAAC,UAAU,CAAC,CAAA;IACzC,CAAC,EACD;QACE,aAAa;QACb,iBAAiB;QACjB,OAAO;QACP,OAAO;QACP,eAAe;QACf,OAAO;QACP,kBAAkB;QAClB,kBAAkB;QAClB,KAAK;QACL,yBAAyB;KAC1B,CACF,CAAA;IAED,MAAM,oBAAoB,GAAG,IAAA,mBAAW,EACtC,CAAC,aAAoB,EAAE,EAAE;QACvB,MAAM,CAAC,OAAO,CAAC,CAAA;QACf,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAA;QACzC,MAAM,SAAS,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAA;QACzD,IAAI,QAAQ,GAAG,SAAS,CAAA;QAGxB,IAAI,yBAAyB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CACvC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,OAAO,KAAK,aAAa,CAAC,OAAO;gBACvC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE;oBAC1B,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,CACzC,CAAA;QACH,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,cAAc,GAAG,IAAA,mCAAiB,GAAE,CAAA;YAC1C,MAAM,QAAQ,GAAG,GAAG,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,CAAA;YACpE,MAAM,iBAAiB,GACrB,cAAc,CAAC,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAE5D,IAAI,iBAAiB,EAAE,CAAC;gBACtB,eAAe,EAAE,CAAC,sBAAU,CAAC,iBAAiB,EAAE;oBAC9C,SAAS;oBACT,YAAY,EAAE,aAAa,CAAC,MAAM;oBAClC,QAAQ,EAAE,aAAa,CAAC,OAAO;oBAC/B,aAAa,EAAE,aAAa,CAAC,OAAO;oBACpC,WAAW,EAAE,yBAAyB;oBACtC,QAAQ;iBACT,CAAC,CAAA;gBACF,QAAQ,CAAC,aAAa,CAAC,CAAA;YACzB,CAAC;iBAAM,CAAC;gBACN,kBAAkB,CAAC,aAAa,CAAC,CAAA;gBACjC,2BAA2B,CAAC,IAAI,CAAC,CAAA;gBACjC,OAAM;YACR,CAAC;QACH,CAAC;aAAM,CAAC;YACN,eAAe,EAAE,CAAC,sBAAU,CAAC,iBAAiB,EAAE;gBAC9C,SAAS;gBACT,YAAY,EAAE,aAAa,CAAC,MAAM;gBAClC,QAAQ,EAAE,aAAa,CAAC,OAAO;gBAC/B,aAAa,EAAE,aAAa,CAAC,OAAO;gBACpC,WAAW,EAAE,yBAAyB;gBACtC,QAAQ;aACT,CAAC,CAAA;YACF,QAAQ,CAAC,aAAa,CAAC,CAAA;QACzB,CAAC;QAED,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC,EACD;QACE,MAAM;QACN,QAAQ;QACR,YAAY;QACZ,UAAU;QACV,OAAO;QACP,eAAe;QACf,yBAAyB;QACzB,oBAAoB;KACrB,CACF,CAAA;IAED,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,UAAU,EAAE,CAAA;QACd,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAGV,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,IAAI,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;YACtC,YAAY,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAA;IAExB,MAAM,oBAAoB,GAAG,CAC3B,wBAAC,eAAI,IACH,SAAS,EAAC,QAAQ,EAClB,SAAS,EAAC,8FAA8F,aAGxG,uBAAC,eAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,EAAC,aAAa,YAC1C,wBAAC,iBAAM,IACL,KAAK,EAAC,OAAO,EACb,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAClC,SAAS,EAAC,6QAA6Q,aAEvR,uBAAC,mCAAe,IAAC,IAAI,EAAE,6BAAa,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,EAC/D,uBAAC,eAAI,IACH,KAAK,EAAC,WAAW,EACjB,SAAS,EAAC,mLAAmL,YAE5L,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,GACvC,IACA,GACJ,EAEP,uBAAC,eAAI,IACH,SAAS,EAAC,+EAA+E,YAGzF,wBAAC,kCAAc,IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAClB,IAAI,KAAK,KAAK,OAAO;4BAAE,OAAM;wBAC7B,MAAM,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;wBACnD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;wBACtC,MAAM,SAAS,GAAG;4BAChB,GAAG,gBAAgB;4BACnB,GAAG,oBAAoB;4BACvB,GAAG,oBAAoB;yBACxB,CAAA;wBAED,MAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAClC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC;4BACjC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,WAAW,EAAE,CAC1D,CAAA;wBACD,IAAI,aAAa,EAAE,CAAC;4BAClB,oBAAoB,CAAC,aAAa,CAAC,CAAA;wBACrC,CAAC;oBACH,CAAC,EACD,SAAS,EAAC,oFAAoF,aAG9F,uBAAC,eAAI,IACH,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAC,OAAO,EACb,SAAS,EAAC,yGAAyG,YAGnH,wBAAC,eAAI,IACH,KAAK,EAAC,QAAQ,EACd,SAAS,EAAC,0EAA0E,aAEpF,uBAAC,sCAAkB,IACjB,KAAK,EAAC,OAAO,EACb,OAAO,QACP,SAAS,EAAC,0DAA0D,YAEpE,uBAAC,gBAAK,IACJ,GAAG,EAAE,0BAA0B,EAC/B,WAAW,EAAC,oBAAoB,EAChC,IAAI,EACF,uBAAC,cAAG,IAAC,SAAS,EAAC,yDAAyD,YACtE,uBAAC,mCAAe,IACd,IAAI,EAAE,qCAAiB,EACvB,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,GACV,GACE,EAER,kBAAkB,EAAC,6BAA6B,EAChD,SAAS,EAAC,mDAAmD,EAC7D,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gDACd,MAAM,KAAK,GAAI,CAAC,CAAC,MAA2B,CAAC,KAAK,CAAA;gDAElD,mBAAmB,CAAC,KAAK,CAAC,CAAA;gDAE1B,IAAI,IAAA,2BAAkB,EAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;oDAClD,eAAe,EAAE,CACf,sBAAU,CAAC,8BAA8B,EACzC;wDACE,WAAW,EAAE,KAAK;wDAClB,YAAY,EAAE,WAAW,CAAC,EAAE;qDAC7B,CACF,CAAA;gDACH,CAAC;4CACH,CAAC,GACD,GACiB,EAGpB,CAAC,CAAC,kBAAkB,IAAI,6BAA6B,CAAC,IAAI,CACzD,uBAAC,0CAAkB,IACjB,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,cAAc,EACxB,eAAe,EAAE,eAAe,EAChC,iBAAiB,EAAE,qBAAqB,EACxC,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,GAChC,CACH,IACI,GACF,EAGP,wBAAC,eAAI,IAEH,SAAS,EAAC,QAAQ,EAClB,SAAS,EAAC,0FAA0F,EACpG,KAAK,EAAE,EAAE,cAAc,EAAE,uCAAuC,EAAE,aAGjE,WAAW,CAAC,EAAE;oCACf,gBAAgB,CAAC,MAAM,KAAK,CAAC;oCAC7B,CAAC,kBAAkB,CAAC,CAAC,CAAC,CACpB,uBAAC,oCAAe,IACd,OAAO,EAAE,WAAW,CAAC,EAAE,EACvB,kBAAkB,EAAE,kBAAkB,EACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wCAClB,oBAAoB,CAAC,KAAK,CAAC,CAAA;oCAC7B,CAAC,GACD,CACH,CAAC,CAAC,CAAC,IAAI,EAGP,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC7B,uBAAC,wBAAS,IACR,KAAK,EAAC,SAAS,EACf,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EACP,kBAAkB;wCAClB,gBAAgB,KAAK,yBAAyB,EAEhD,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,WAAW,CAAC,EAAE,GAC7B,CACH,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CACnB,uBAAC,wBAAS,IACR,KAAK,EAAC,QAAQ,EACd,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,kBAAkB,EAC7B,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,WAAW,CAAC,EAAE,GAC7B,CACH,CAAC,CAAC,CAAC,CACF,uBAAC,eAAI,IAAC,SAAS,EAAC,QAAQ,EAAC,SAAS,EAAC,aAAa,YAC7C,CAAC,GAAG,EAAE;wCACL,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;wCAChD,MAAM,eAAe,GAAG,CAAC,mBAAmB,CAAA;wCAC5C,MAAM,uBAAuB,GAC3B,OAAO;4CACP,CAAC,iBAAiB,IAAI,mBAAmB,CAAC;4CAC1C,CAAC,CAAC,oBAAoB,IAAI,CAAC,eAAe,CAAC,CAAA;wCAE7C,IAAI,uBAAuB,EAAE,CAAC;4CAC5B,OAAO,CACL,uBAAC,sCAAgB,IACf,KAAK,EAAC,aAAa,EACnB,MAAM,EAAE,EAAE,EACV,SAAS,EAAE,IAAI,EACf,iBAAiB,EAAE,KAAK,EACxB,aAAa,EAAE,WAAW,CAAC,EAAE,EAC7B,KAAK,EAAE,EAAE,GACT,CACH,CAAA;wCACH,CAAC;wCAED,MAAM,eAAe,GACnB,OAAO,IAAI,oBAAoB,IAAI,eAAe;4CAChD,CAAC,CAAC,gBAAgB,CAAC,MAAM,CACrB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,OAAO,EAAE,SAAS;gDACxB,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAC9B;4CACH,CAAC,CAAC,EAAE,CAAA;wCAER,MAAM,cAAc,GAClB,OAAO,KAAK,IAAI,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC;4CACjD,CAAC,CAAC,oBAAoB;4CACtB,CAAC,CAAC,oBAAoB,CAAA;wCAE1B,MAAM,gBAAgB,GACpB,OAAO,KAAK,IAAI,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAA;wCACrD,MAAM,wBAAwB,GAC5B,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;wCAEvC,OAAO,CACL,6DACG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC5B,uBAAC,sCAAgB,IACf,KAAK,EAAC,aAAa,EACnB,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,KAAK,EAChB,iBAAiB,EAAE,wBAAwB,EAC3C,aAAa,EAAE,WAAW,CAAC,EAAE,EAC7B,KAAK,EAAE,eAAe,CAAC,MAAM,GAC7B,CACH,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,sCAAgB,IACf,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,EACvD,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EACnC,SAAS,EACP,OAAO,KAAK,IAAI;wDACd,CAAC,CAAC,uBAAuB;wDACzB,CAAC,CAAC,kBAAkB,EAExB,iBAAiB,EAAE,wBAAwB,EAC3C,aAAa,EAAE,WAAW,CAAC,EAAE,EAC7B,KAAK,EAAE,EAAE,GACT,IACD,CACJ,CAAA;oCACH,CAAC,CAAC,EAAE,GACC,CACR,EAGA,CAAC,kBAAkB;oCACpB,CAAC,qBAAqB;oCACtB,SAAS,EAAE,MAAM,KAAK,CAAC;oCACvB,iBAAiB,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAChC,wBAAC,eAAI,IACH,SAAS,EAAC,QAAQ,EAClB,KAAK,EAAC,QAAQ,EACd,SAAS,EAAC,kDAAkD,aAE3D,CAAC,WAAW,EAAE,EAAE,IAAI,wBAAwB,IAAI,CAC/C,uBAAC,cAAG,IAAC,SAAS,EAAC,yDAAyD,YACtE,uBAAC,mCAAe,IACd,IAAI,EAAE,2BAAY,EAClB,IAAI,EAAC,IAAI,EACT,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,GACV,GACE,CACP,EACD,uBAAC,eAAI,IACH,KAAK,EAAC,QAAQ,EACd,KAAK,EAAC,OAAO,EACb,SAAS,EAAC,mBAAmB,YAE5B,CAAC,WAAW,EAAE,EAAE,IAAI,wBAAwB;gDAC3C,CAAC,CAAC,gEAAgE;gDAClE,CAAC,CAAC,aAAa,GACZ,IACF,CACR,CAAC,CAAC,CAAC,IAAI,KA5IH,WAAW,CAAC,EAAE,IAAI,KAAK,CA6IvB,IACQ,GACZ,IACF,CACR,CAAA;IAED,OAAO,CACL,6DAEG,CAAC,SAAS,IAAI,CACb,6DACE,gCAAK,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAAG,OAAO,GAAO,EACtD,IAAI,IAAI,CACP,uBAAC,cAAG,IACF,SAAS,EAAC,qLAAqL,YAE9L,oBAAoB,GACjB,CACP,IACA,CACJ,EAGA,SAAS,IAAI,CACZ,uBAAC,gBAAK,IACJ,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,KAAK,EACtB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,oEAAoE,EAC9E,YAAY,EAAE;oBACZ,MAAM,EAAE,kBAAkB;oBAC1B,KAAK,EAAE,mBAAmB;oBAC1B,QAAQ,EAAE,mBAAmB;iBAC9B,YAEA,oBAAoB,GACf,CACT,EAEA,wBAAwB,IAAI,CAC3B,uBAAC,8CAAoB,IACnB,IAAI,EAAE,wBAAwB,EAC9B,YAAY,EAAE,2BAA2B,EACzC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,EAC9D,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,IAAI,KAAK,EAAE,CAAC;wBACV,oBAAoB,CAAC,KAAK,CAAC,CAAA;oBAC7B,CAAC;oBACD,2BAA2B,CAAC,KAAK,CAAC,CAAA;gBACpC,CAAC,GACD,CACH,IACA,CACJ,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,aAAa,CAAA","sourcesContent":["import {\n type FC,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react'\nimport { Flex, Text, Input, Box, Button } from '../../primitives/index.js'\nimport { Modal } from '../Modal.js'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faMagnifyingGlass } from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass'\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen'\nimport { faChevronLeft } from '@fortawesome/free-solid-svg-icons/faChevronLeft'\nimport type { Token } from '../../../types/index.js'\nimport { type ChainFilterValue } from './ChainFilter.js'\nimport useRelayClient from '../../../hooks/useRelayClient.js'\nimport { type Address } from 'viem'\nimport { useDebounceState } from '../../../hooks/index.js'\nimport { useMultiWalletBalances } from '../../../hooks/useMultiWalletBalances.js'\nimport { useMediaQuery } from 'usehooks-ts'\nimport { useTokenList } from '@relayprotocol/relay-kit-hooks'\nimport { EventNames } from '../../../constants/events.js'\nimport { useHapticEvent } from '../../../providers/RelayKitProvider.js'\nimport { UnverifiedTokenModal } from '../UnverifiedTokenModal.js'\nimport { useEnhancedTokensList } from '../../../hooks/useEnhancedTokensList.js'\nimport { TokenList } from './TokenList.js'\nimport { UnsupportedDepositAddressChainIds } from '../../../constants/depositAddresses.js'\nimport { getRelayUiKitData } from '../../../utils/localStorage.js'\nimport { isValidAddress as isValidAddressUtil } from '../../../utils/address.js'\nimport {\n AccessibleList,\n AccessibleListItem\n} from '../../primitives/AccessibleList.js'\nimport { eclipse, solana } from '../../../utils/solana.js'\nimport { bitcoin } from '../../../utils/bitcoin.js'\nimport { SuggestedTokens } from './SuggestedTokens.js'\nimport { mergeTokenLists } from '../../../utils/tokens.js'\nimport { type ChainVM } from '@relayprotocol/relay-sdk'\nimport {\n getInitialChainFilter,\n sortChains\n} from '../../../utils/tokenSelector.js'\nimport { useInternalRelayChains } from '../../../hooks/index.js'\nimport { useTrendingCurrencies } from '@relayprotocol/relay-kit-hooks'\nimport { getStarredChainIds } from '../../../utils/localStorage.js'\nimport { PaymentTokenList } from './PaymentTokenList.js'\nimport { CompactChainFilter } from './CompactChainFilter.js'\n\nexport type PaymentMethodProps = {\n token?: Token\n trigger: ReactNode\n chainIdsFilter?: number[]\n lockedChainIds?: number[]\n context: 'from' | 'to'\n address?: Address | string\n isValidAddress?: boolean\n multiWalletSupportEnabled?: boolean\n fromChainWalletVMSupported?: boolean\n supportedWalletVMs?: Omit<ChainVM, 'hypevm' | 'lvm'>[]\n popularChainIds?: number[]\n linkedWallets?: any[]\n setToken: (token: Token) => void\n onAnalyticEvent?: (eventName: string, data?: any) => void\n onPaymentMethodOpenChange?: (open: boolean) => void\n}\n\nconst PaymentMethod: FC<PaymentMethodProps> = ({\n token,\n trigger,\n chainIdsFilter,\n lockedChainIds,\n context,\n address,\n isValidAddress,\n multiWalletSupportEnabled = false,\n fromChainWalletVMSupported,\n supportedWalletVMs,\n popularChainIds,\n linkedWallets,\n setToken,\n onAnalyticEvent,\n onPaymentMethodOpenChange\n}) => {\n const haptic = useHapticEvent()\n const relayClient = useRelayClient()\n const { chains: allRelayChains } = useInternalRelayChains()\n\n const isDesktop = useMediaQuery('(min-width: 660px)')\n\n const [open, setOpen] = useState(false)\n\n const [unverifiedTokenModalOpen, setUnverifiedTokenModalOpen] =\n useState(false)\n const [unverifiedToken, setUnverifiedToken] = useState<Token | undefined>()\n\n const [chainFilter, setChainFilter] = useState<ChainFilterValue>({\n id: undefined,\n name: 'All Chains'\n })\n const [starredChainIds, setStarredChainIds] = useState<number[] | undefined>(\n () => getStarredChainIds()\n )\n\n const {\n value: tokenSearchInput,\n debouncedValue: debouncedTokenSearchValue,\n setValue: setTokenSearchInput\n } = useDebounceState<string>('', 500)\n\n const depositAddressOnly =\n context === 'from'\n ? chainFilter?.vmType\n ? !supportedWalletVMs?.includes(chainFilter.vmType)\n : !chainFilter.id\n ? false\n : !fromChainWalletVMSupported && chainFilter.id === token?.chainId\n : !fromChainWalletVMSupported\n\n const isReceivingDepositAddress = depositAddressOnly && context === 'to'\n\n // Configure chains\n const configuredChains = useMemo(() => {\n let chains =\n allRelayChains?.filter((chain) =>\n relayClient?.chains?.find((relayChain) => relayChain.id === chain.id)\n ) ?? []\n\n if (!multiWalletSupportEnabled && context === 'from') {\n chains = chains.filter((chain) => chain.vmType === 'evm')\n }\n if (isReceivingDepositAddress) {\n chains = chains.filter(\n ({ id }) => !UnsupportedDepositAddressChainIds.includes(id)\n )\n }\n\n return sortChains(chains)\n }, [\n allRelayChains,\n relayClient?.chains,\n multiWalletSupportEnabled,\n context,\n depositAddressOnly\n ])\n\n const configuredChainIds = useMemo(() => {\n if (lockedChainIds) {\n return lockedChainIds\n }\n\n let _chainIds = configuredChains.map((chain) => chain.id)\n if (chainIdsFilter) {\n _chainIds = _chainIds.filter((id) => !chainIdsFilter.includes(id))\n }\n return _chainIds\n }, [configuredChains, lockedChainIds, chainIdsFilter, depositAddressOnly])\n\n const hasMultipleConfiguredChainIds = configuredChainIds.length > 1\n\n const chainFilterOptions =\n context === 'from'\n ? configuredChains?.filter(\n (chain) =>\n (chain.vmType === 'evm' ||\n chain.vmType === 'tvm' ||\n chain.vmType === 'tonvm' ||\n chain.vmType === 'hypevm' ||\n chain.id === solana.id ||\n chain.id === eclipse.id ||\n chain.id === bitcoin.id) &&\n configuredChainIds.includes(chain.id)\n )\n : configuredChains?.filter((chain) =>\n configuredChainIds.includes(chain.id)\n )\n\n const allChains = useMemo(\n () => [\n ...(isReceivingDepositAddress\n ? []\n : [{ id: undefined, name: 'All Chains' }]),\n ...chainFilterOptions\n ],\n [isReceivingDepositAddress, chainFilterOptions]\n )\n\n const useDefaultTokenList = debouncedTokenSearchValue === ''\n\n const {\n balanceMap: tokenBalances,\n data: duneTokens,\n isLoading: isLoadingBalances\n } = useMultiWalletBalances(\n linkedWallets,\n address,\n relayClient?.baseApiUrl?.includes('testnet') ? 'testnet' : 'mainnet'\n )\n\n const filteredDuneTokenBalances = useMemo(() => {\n return duneTokens?.balances\n }, [duneTokens?.balances])\n\n const userTokensQuery = useMemo(() => {\n if (filteredDuneTokenBalances && filteredDuneTokenBalances.length > 0) {\n const sortedBalances = [...filteredDuneTokenBalances]\n .sort((a, b) => {\n const aValue = a.value_usd || 0\n const bValue = b.value_usd || 0\n return bValue - aValue\n })\n .slice(0, 50)\n\n return sortedBalances.map(\n (balance) => `${balance.chain_id}:${balance.address}`\n )\n }\n return undefined\n }, [filteredDuneTokenBalances])\n\n const { data: userTokens, isLoading: isLoadingUserTokens } = useTokenList(\n relayClient?.baseApiUrl,\n userTokensQuery\n ? {\n tokens: userTokensQuery,\n limit: 100,\n depositAddressOnly,\n referrer: relayClient?.source\n }\n : undefined,\n {\n enabled: !!filteredDuneTokenBalances\n }\n )\n\n const isSearchTermValidAddress = isValidAddressUtil(\n chainFilter.vmType,\n debouncedTokenSearchValue,\n chainFilter.id\n )\n\n const { data: trendingTokens, isLoading: isLoadingTrendingTokens } =\n useTrendingCurrencies(\n relayClient?.baseApiUrl,\n {\n referrer: relayClient?.source\n },\n {\n enabled: context === 'to'\n }\n )\n\n // Get main token list\n const { data: tokenList, isLoading: isLoadingTokenList } = useTokenList(\n relayClient?.baseApiUrl,\n {\n chainIds: chainFilter.id\n ? [chainFilter.id]\n : configuredChains.map((c) => c.id),\n address: isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n term: !isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n defaultList: useDefaultTokenList && !depositAddressOnly,\n limit: 12,\n depositAddressOnly,\n referrer: relayClient?.source\n }\n )\n\n const { data: externalTokenList, isLoading: isLoadingExternalList } =\n useTokenList(\n relayClient?.baseApiUrl,\n {\n chainIds: chainFilter.id\n ? [chainFilter.id]\n : configuredChains.map((c) => c.id),\n address: isSearchTermValidAddress\n ? debouncedTokenSearchValue\n : undefined,\n term: !isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n defaultList: false,\n limit: 12,\n useExternalSearch: true,\n referrer: relayClient?.source\n },\n {\n enabled: !!debouncedTokenSearchValue && !depositAddressOnly\n }\n )\n\n // Merge token lists when searching\n const combinedTokenList = useMemo(() => {\n if (!debouncedTokenSearchValue) return tokenList\n return mergeTokenLists([tokenList, externalTokenList])\n }, [tokenList, externalTokenList, debouncedTokenSearchValue])\n\n const sortedUserTokens = useEnhancedTokensList(\n userTokens,\n tokenBalances,\n context,\n multiWalletSupportEnabled,\n chainFilter.id,\n true\n )\n\n const sortedTrendingTokens = useEnhancedTokensList(\n trendingTokens,\n tokenBalances,\n 'to',\n multiWalletSupportEnabled,\n undefined,\n false\n )\n const sortedCombinedTokens = useEnhancedTokensList(\n combinedTokenList,\n tokenBalances,\n context,\n multiWalletSupportEnabled,\n chainFilter.id,\n false\n )\n\n const [chainSearchInputElement, setChainSearchInputElement] =\n useState<HTMLInputElement | null>(null)\n const [tokenSearchInputElement, setTokenSearchInputElement] =\n useState<HTMLInputElement | null>(null)\n\n const inputElement = hasMultipleConfiguredChainIds\n ? chainSearchInputElement\n : tokenSearchInputElement\n\n const handleChainStarToggle = useCallback(() => {\n setStarredChainIds(getStarredChainIds())\n }, [])\n\n useEffect(() => {\n if (open) {\n setStarredChainIds(getStarredChainIds())\n }\n }, [open])\n\n const resetState = useCallback(() => {\n setTokenSearchInput('')\n setChainSearchInputElement(null)\n setTokenSearchInputElement(null)\n }, [])\n\n const onOpenChange = useCallback(\n (openChange: boolean) => {\n let tokenCount = undefined\n let usdcCount = 0\n let usdtCount = 0\n let ethCount = 0\n\n try {\n if (!isLoadingBalances && tokenBalances) {\n tokenCount = Object.keys(tokenBalances).length\n Object.values(tokenBalances).forEach((token) => {\n const tokenSymbol = token.symbol\n ? token.symbol.toLowerCase()\n : token.symbol\n if (tokenSymbol === 'usdc') {\n usdcCount += 1\n } else if (tokenSymbol === 'usdt') {\n usdtCount += 1\n } else if (tokenSymbol === 'eth') {\n ethCount += 1\n }\n })\n }\n onAnalyticEvent?.(\n openChange\n ? EventNames.SWAP_START_TOKEN_SELECT\n : EventNames.SWAP_EXIT_TOKEN_SELECT,\n {\n direction: context === 'from' ? 'input' : 'output',\n ...(!openChange && {\n balanceData: {\n tokenCount,\n usdcCount,\n usdtCount,\n ethCount,\n balanceAddress: address\n }\n })\n }\n )\n } catch (error) {\n console.error(error)\n }\n\n if (openChange) {\n const chainFilter = getInitialChainFilter(\n chainFilterOptions,\n context,\n depositAddressOnly,\n token,\n true\n )\n setChainFilter(chainFilter)\n }\n\n setOpen(openChange)\n onPaymentMethodOpenChange?.(openChange)\n },\n [\n tokenBalances,\n isLoadingBalances,\n context,\n address,\n onAnalyticEvent,\n setOpen,\n chainFilterOptions,\n depositAddressOnly,\n token,\n onPaymentMethodOpenChange\n ]\n )\n\n const handleTokenSelection = useCallback(\n (selectedToken: Token) => {\n haptic('light')\n const isVerified = selectedToken.verified\n const direction = context === 'from' ? 'input' : 'output'\n let position = undefined\n\n // Track position for search results\n if (debouncedTokenSearchValue.length > 0) {\n position = sortedCombinedTokens.findIndex(\n (token) =>\n token.chainId === selectedToken.chainId &&\n token.address?.toLowerCase() ===\n selectedToken.address?.toLowerCase()\n )\n }\n\n if (!isVerified) {\n const relayUiKitData = getRelayUiKitData()\n const tokenKey = `${selectedToken.chainId}:${selectedToken.address}`\n const isAlreadyAccepted =\n relayUiKitData.acceptedUnverifiedTokens.includes(tokenKey)\n\n if (isAlreadyAccepted) {\n onAnalyticEvent?.(EventNames.SWAP_TOKEN_SELECT, {\n direction,\n token_symbol: selectedToken.symbol,\n chain_id: selectedToken.chainId,\n token_address: selectedToken.address,\n search_term: debouncedTokenSearchValue,\n position\n })\n setToken(selectedToken)\n } else {\n setUnverifiedToken(selectedToken)\n setUnverifiedTokenModalOpen(true)\n return\n }\n } else {\n onAnalyticEvent?.(EventNames.SWAP_TOKEN_SELECT, {\n direction,\n token_symbol: selectedToken.symbol,\n chain_id: selectedToken.chainId,\n token_address: selectedToken.address,\n search_term: debouncedTokenSearchValue,\n position\n })\n setToken(selectedToken)\n }\n\n onOpenChange(false)\n },\n [\n haptic,\n setToken,\n onOpenChange,\n resetState,\n context,\n onAnalyticEvent,\n debouncedTokenSearchValue,\n sortedCombinedTokens\n ]\n )\n\n useEffect(() => {\n if (!open) {\n resetState()\n }\n }, [open])\n\n // Focus input element when modal opens\n useEffect(() => {\n if (open && inputElement && isDesktop) {\n inputElement.focus()\n }\n }, [open, inputElement])\n\n const paymentMethodContent = (\n <Flex\n direction=\"column\"\n className=\"relay:w-full relay:h-full relay:gap-3 relay:overflow-y-hidden relay:min-w-0 relay:max-w-full\"\n >\n {/* Header with back button */}\n <Flex align=\"center\" className=\"relay:gap-1\">\n <Button\n color=\"ghost\"\n size=\"none\"\n onClick={() => onOpenChange(false)}\n className=\"relay:py-1 relay:px-0 relay:min-w-[auto] relay:text-[color:var(--relay-colors-gray9)] relay:cursor-pointer relay:rounded-[8px] relay:flex relay:items-center relay:gap-1 relay:focus-visible:shadow-[inset_0_0_0_2px_var(--relay-colors-focus-color)] relay:min-[660px]:p-0\"\n >\n <FontAwesomeIcon icon={faChevronLeft} width={20} height={20} />\n <Text\n style=\"subtitle1\"\n className=\"relay:text-[color:var(--relay-colors-text-subtle)] relay:min-[660px]:text-[14px] relay:min-[660px]:text-[color:var(--relay-colors-text-default)] relay:min-[660px]:leading-[20px]\"\n >\n {context === 'from' ? 'Pay with' : 'Sell to'}\n </Text>\n </Button>\n </Flex>\n\n <Flex\n className=\"relay:flex-1 relay:gap-3 relay:overflow-hidden relay:min-w-0 relay:max-w-full\"\n >\n {/* Main Token Content */}\n <AccessibleList\n onSelect={(value) => {\n if (value === 'input') return\n const [chainId, ...addressParts] = value.split(':')\n const address = addressParts.join(':')\n const allTokens = [\n ...sortedUserTokens,\n ...sortedCombinedTokens,\n ...sortedTrendingTokens\n ]\n\n const selectedToken = allTokens.find(\n (token) =>\n token.chainId === Number(chainId) &&\n token.address?.toLowerCase() === address?.toLowerCase()\n )\n if (selectedToken) {\n handleTokenSelection(selectedToken)\n }\n }}\n className=\"relay:flex relay:flex-col relay:w-full relay:min-w-0 relay:max-w-full relay:h-full\"\n >\n {/* Search Input Section - Fixed */}\n <Flex\n direction=\"column\"\n align=\"start\"\n className=\"relay:w-full relay:gap-2 relay:bg-[var(--relay-colors-modal-background)] relay:min-w-0 relay:max-w-full\"\n >\n {/* Search input and Chain Filter Button Row */}\n <Flex\n align=\"center\"\n className=\"relay:w-full relay:gap-2 relay:min-w-0 relay:items-center relay:h-[40px]\"\n >\n <AccessibleListItem\n value=\"input\"\n asChild\n className=\"relay:flex-1 relay:min-w-0 relay:flex relay:items-center\"\n >\n <Input\n ref={setTokenSearchInputElement}\n placeholder=\"Search for a token\"\n icon={\n <Box className=\"relay:flex relay:text-[color:var(--relay-colors-gray9)]\">\n <FontAwesomeIcon\n icon={faMagnifyingGlass}\n width={16}\n height={16}\n />\n </Box>\n }\n containerClassName=\"relay:w-full relay:h-[40px]\"\n className=\"relay:w-full relay:[&::placeholder]:text-ellipsis\"\n onChange={(e) => {\n const value = (e.target as HTMLInputElement).value\n\n setTokenSearchInput(value)\n\n if (isValidAddressUtil(chainFilter.vmType, value)) {\n onAnalyticEvent?.(\n EventNames.TOKEN_SELECTOR_CONTRACT_SEARCH,\n {\n search_term: value,\n chain_filter: chainFilter.id\n }\n )\n }\n }}\n />\n </AccessibleListItem>\n\n {/* Chain Filter - Compact button with dropdown */}\n {(!configuredChainIds || hasMultipleConfiguredChainIds) && (\n <CompactChainFilter\n options={allChains}\n value={chainFilter}\n onSelect={setChainFilter}\n popularChainIds={popularChainIds}\n onChainStarToggle={handleChainStarToggle}\n starredChainIds={starredChainIds}\n onAnalyticEvent={onAnalyticEvent}\n />\n )}\n </Flex>\n </Flex>\n\n {/* Token Lists Section */}\n <Flex\n key={chainFilter.id ?? 'all'}\n direction=\"column\"\n className=\"relay:flex-1 relay:overflow-y-auto relay:gap-3 relay:pt-2 relay:min-w-0 relay:max-w-full\"\n style={{ scrollbarColor: 'var(--relay-colors-gray5) transparent' }}\n >\n {/* Suggested Tokens */}\n {chainFilter.id &&\n tokenSearchInput.length === 0 &&\n !depositAddressOnly ? (\n <SuggestedTokens\n chainId={chainFilter.id}\n depositAddressOnly={depositAddressOnly}\n onSelect={(token) => {\n handleTokenSelection(token)\n }}\n />\n ) : null}\n\n {/* Token Lists */}\n {tokenSearchInput.length > 0 ? (\n <TokenList\n title=\"Results\"\n tokens={sortedCombinedTokens}\n isLoading={\n isLoadingTokenList ||\n tokenSearchInput !== debouncedTokenSearchValue\n }\n isLoadingBalances={isLoadingBalances}\n chainFilterId={chainFilter.id}\n />\n ) : chainFilter.id ? (\n <TokenList\n title=\"Tokens\"\n tokens={sortedCombinedTokens}\n isLoading={isLoadingTokenList}\n isLoadingBalances={isLoadingBalances}\n chainFilterId={chainFilter.id}\n />\n ) : (\n <Flex direction=\"column\" className=\"relay:gap-3\">\n {(() => {\n const hasLoadedBalanceData = Boolean(duneTokens)\n const userTokensReady = !isLoadingUserTokens\n const isWaitingForBalanceData =\n address &&\n (isLoadingBalances || isLoadingUserTokens) &&\n (!hasLoadedBalanceData || !userTokensReady)\n\n if (isWaitingForBalanceData) {\n return (\n <PaymentTokenList\n title=\"Recommended\"\n tokens={[]}\n isLoading={true}\n isLoadingBalances={false}\n chainFilterId={chainFilter.id}\n limit={10}\n />\n )\n }\n\n const tokensWithValue =\n address && hasLoadedBalanceData && userTokensReady\n ? sortedUserTokens.filter(\n (token) =>\n token.balance?.value_usd &&\n token.balance.value_usd > 0\n )\n : []\n\n const fallbackTokens =\n context === 'to' && sortedTrendingTokens.length > 0\n ? sortedTrendingTokens\n : sortedCombinedTokens\n\n const isTrendingTokens =\n context === 'to' && sortedTrendingTokens.length > 0\n const shouldShowBalanceLoading =\n isLoadingBalances && Boolean(address)\n\n return (\n <>\n {tokensWithValue.length > 0 ? (\n <PaymentTokenList\n title=\"Recommended\"\n tokens={tokensWithValue}\n isLoading={false}\n isLoadingBalances={shouldShowBalanceLoading}\n chainFilterId={chainFilter.id}\n limit={tokensWithValue.length}\n />\n ) : null}\n <PaymentTokenList\n title={isTrendingTokens ? 'Global 24h' : 'Other Tokens'}\n tokens={fallbackTokens.slice(0, 10)}\n isLoading={\n context === 'to'\n ? isLoadingTrendingTokens\n : isLoadingTokenList\n }\n isLoadingBalances={shouldShowBalanceLoading}\n chainFilterId={chainFilter.id}\n limit={10}\n />\n </>\n )\n })()}\n </Flex>\n )}\n\n {/* Empty State */}\n {!isLoadingTokenList &&\n !isLoadingExternalList &&\n tokenList?.length === 0 &&\n externalTokenList?.length === 0 ? (\n <Flex\n direction=\"column\"\n align=\"center\"\n className=\"relay:py-5 relay:max-w-[312px] relay:self-center\"\n >\n {!chainFilter?.id && isSearchTermValidAddress && (\n <Box className=\"relay:text-[color:var(--relay-colors-gray8)] relay:mb-2\">\n <FontAwesomeIcon\n icon={faFolderOpen}\n size=\"xl\"\n width={27}\n height={24}\n />\n </Box>\n )}\n <Text\n color=\"subtle\"\n style=\"body2\"\n className=\"relay:text-center\"\n >\n {!chainFilter?.id && isSearchTermValidAddress\n ? 'No results. Switch to the desired chain to search by contract.'\n : 'No results.'}\n </Text>\n </Flex>\n ) : null}\n </Flex>\n </AccessibleList>\n </Flex>\n </Flex>\n )\n\n return (\n <>\n {/* Mobile: Overlay */}\n {!isDesktop && (\n <>\n <div onClick={() => onOpenChange(true)}>{trigger}</div>\n {open && (\n <Box\n className=\"relay:absolute relay:top-0 relay:left-0 relay:right-0 relay:bottom-0 relay:z-[100] relay:bg-[var(--relay-colors-widget-background)] relay:flex relay:flex-col relay:overflow-hidden\"\n >\n {paymentMethodContent}\n </Box>\n )}\n </>\n )}\n\n {/* Desktop: Modal */}\n {isDesktop && (\n <Modal\n open={open}\n onOpenChange={onOpenChange}\n showCloseButton={false}\n trigger={trigger}\n className=\"relay:p-4 relay:flex relay:flex-col relay:min-w-0 relay:box-border\"\n contentStyle={{\n height: 'min(85vh, 540px)',\n width: 'min(400px, 100vw)',\n maxWidth: 'min(400px, 100vw)'\n }}\n >\n {paymentMethodContent}\n </Modal>\n )}\n\n {unverifiedTokenModalOpen && (\n <UnverifiedTokenModal\n open={unverifiedTokenModalOpen}\n onOpenChange={setUnverifiedTokenModalOpen}\n data={unverifiedToken ? { token: unverifiedToken } : undefined}\n onAcceptToken={(token) => {\n if (token) {\n handleTokenSelection(token)\n }\n setUnverifiedTokenModalOpen(false)\n }}\n />\n )}\n </>\n )\n}\n\nexport default PaymentMethod\n"]}
|
|
1
|
+
{"version":3,"file":"PaymentMethod.js","sourceRoot":"","sources":["../../../../../src/components/common/TokenSelector/PaymentMethod.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n type FC,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react'\nimport { Flex, Text, Input, Box, Button } from '../../primitives/index.js'\nimport { Modal } from '../Modal.js'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faMagnifyingGlass } from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass'\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen'\nimport { faChevronLeft } from '@fortawesome/free-solid-svg-icons/faChevronLeft'\nimport type { Token } from '../../../types/index.js'\nimport { type ChainFilterValue } from './ChainFilter.js'\nimport useRelayClient from '../../../hooks/useRelayClient.js'\nimport { type Address } from 'viem'\nimport { useDebounceState } from '../../../hooks/index.js'\nimport { useMultiWalletBalances } from '../../../hooks/useMultiWalletBalances.js'\nimport { useMediaQuery } from 'usehooks-ts'\nimport { useTokenList } from '@relayprotocol/relay-kit-hooks'\nimport { EventNames } from '../../../constants/events.js'\nimport { useHapticEvent } from '../../../providers/RelayKitProvider.js'\nimport { UnverifiedTokenModal } from '../UnverifiedTokenModal.js'\nimport { useEnhancedTokensList } from '../../../hooks/useEnhancedTokensList.js'\nimport { TokenList } from './TokenList.js'\nimport { UnsupportedDepositAddressChainIds } from '../../../constants/depositAddresses.js'\nimport { getRelayUiKitData } from '../../../utils/localStorage.js'\nimport { isValidAddress as isValidAddressUtil } from '../../../utils/address.js'\nimport {\n AccessibleList,\n AccessibleListItem\n} from '../../primitives/AccessibleList.js'\nimport { eclipse, solana } from '../../../utils/solana.js'\nimport { bitcoin } from '../../../utils/bitcoin.js'\nimport { SuggestedTokens } from './SuggestedTokens.js'\nimport { mergeTokenLists } from '../../../utils/tokens.js'\nimport { type ChainVM } from '@relayprotocol/relay-sdk'\nimport {\n getInitialChainFilter,\n sortChains\n} from '../../../utils/tokenSelector.js'\nimport { useInternalRelayChains } from '../../../hooks/index.js'\nimport { useTrendingCurrencies } from '@relayprotocol/relay-kit-hooks'\nimport { getStarredChainIds } from '../../../utils/localStorage.js'\nimport { PaymentTokenList } from './PaymentTokenList.js'\nimport { CompactChainFilter } from './CompactChainFilter.js'\n\nexport type PaymentMethodProps = {\n token?: Token\n trigger: ReactNode\n chainIdsFilter?: number[]\n lockedChainIds?: number[]\n context: 'from' | 'to'\n address?: Address | string\n isValidAddress?: boolean\n multiWalletSupportEnabled?: boolean\n fromChainWalletVMSupported?: boolean\n supportedWalletVMs?: Omit<ChainVM, 'hypevm' | 'lvm'>[]\n popularChainIds?: number[]\n linkedWallets?: any[]\n setToken: (token: Token) => void\n onAnalyticEvent?: (eventName: string, data?: any) => void\n onPaymentMethodOpenChange?: (open: boolean) => void\n}\n\nconst PaymentMethod: FC<PaymentMethodProps> = ({\n token,\n trigger,\n chainIdsFilter,\n lockedChainIds,\n context,\n address,\n isValidAddress,\n multiWalletSupportEnabled = false,\n fromChainWalletVMSupported,\n supportedWalletVMs,\n popularChainIds,\n linkedWallets,\n setToken,\n onAnalyticEvent,\n onPaymentMethodOpenChange\n}) => {\n const haptic = useHapticEvent()\n const relayClient = useRelayClient()\n const { chains: allRelayChains } = useInternalRelayChains()\n\n const isDesktop = useMediaQuery('(min-width: 660px)')\n\n const [open, setOpen] = useState(false)\n\n const [unverifiedTokenModalOpen, setUnverifiedTokenModalOpen] =\n useState(false)\n const [unverifiedToken, setUnverifiedToken] = useState<Token | undefined>()\n\n const [chainFilter, setChainFilter] = useState<ChainFilterValue>({\n id: undefined,\n name: 'All Chains'\n })\n const [starredChainIds, setStarredChainIds] = useState<number[] | undefined>(\n () => getStarredChainIds()\n )\n\n const {\n value: tokenSearchInput,\n debouncedValue: debouncedTokenSearchValue,\n setValue: setTokenSearchInput\n } = useDebounceState<string>('', 500)\n\n const depositAddressOnly =\n context === 'from'\n ? chainFilter?.vmType\n ? !supportedWalletVMs?.includes(chainFilter.vmType)\n : !chainFilter.id\n ? false\n : !fromChainWalletVMSupported && chainFilter.id === token?.chainId\n : !fromChainWalletVMSupported\n\n const isReceivingDepositAddress = depositAddressOnly && context === 'to'\n\n // Configure chains\n const configuredChains = useMemo(() => {\n let chains =\n allRelayChains?.filter((chain) =>\n relayClient?.chains?.find((relayChain) => relayChain.id === chain.id)\n ) ?? []\n\n if (!multiWalletSupportEnabled && context === 'from') {\n chains = chains.filter((chain) => chain.vmType === 'evm')\n }\n if (isReceivingDepositAddress) {\n chains = chains.filter(\n ({ id }) => !UnsupportedDepositAddressChainIds.includes(id)\n )\n }\n\n return sortChains(chains)\n }, [\n allRelayChains,\n relayClient?.chains,\n multiWalletSupportEnabled,\n context,\n depositAddressOnly\n ])\n\n const configuredChainIds = useMemo(() => {\n if (lockedChainIds) {\n return lockedChainIds\n }\n\n let _chainIds = configuredChains.map((chain) => chain.id)\n if (chainIdsFilter) {\n _chainIds = _chainIds.filter((id) => !chainIdsFilter.includes(id))\n }\n return _chainIds\n }, [configuredChains, lockedChainIds, chainIdsFilter, depositAddressOnly])\n\n const hasMultipleConfiguredChainIds = configuredChainIds.length > 1\n\n const chainFilterOptions =\n context === 'from'\n ? configuredChains?.filter(\n (chain) =>\n (chain.vmType === 'evm' ||\n chain.vmType === 'tvm' ||\n chain.vmType === 'tonvm' ||\n chain.vmType === 'hypevm' ||\n chain.id === solana.id ||\n chain.id === eclipse.id ||\n chain.id === bitcoin.id) &&\n configuredChainIds.includes(chain.id)\n )\n : configuredChains?.filter((chain) =>\n configuredChainIds.includes(chain.id)\n )\n\n const allChains = useMemo(\n () => [\n ...(isReceivingDepositAddress\n ? []\n : [{ id: undefined, name: 'All Chains' }]),\n ...chainFilterOptions\n ],\n [isReceivingDepositAddress, chainFilterOptions]\n )\n\n const useDefaultTokenList = debouncedTokenSearchValue === ''\n\n const {\n balanceMap: tokenBalances,\n data: walletTokens,\n isLoading: isLoadingBalances\n } = useMultiWalletBalances(linkedWallets, address)\n\n const filteredTokenBalances = useMemo(() => {\n return walletTokens?.balances\n }, [walletTokens?.balances])\n\n const userTokensQuery = useMemo(() => {\n if (filteredTokenBalances && filteredTokenBalances.length > 0) {\n const sortedBalances = [...filteredTokenBalances]\n .sort((a, b) => {\n const aValue = a.value_usd || 0\n const bValue = b.value_usd || 0\n return bValue - aValue\n })\n .slice(0, 50)\n\n return sortedBalances.map(\n (balance) => `${balance.chain_id}:${balance.address}`\n )\n }\n return undefined\n }, [filteredTokenBalances])\n\n const { data: userTokens, isLoading: isLoadingUserTokens } = useTokenList(\n relayClient?.baseApiUrl,\n userTokensQuery\n ? {\n tokens: userTokensQuery,\n limit: 100,\n depositAddressOnly,\n referrer: relayClient?.source\n }\n : undefined,\n {\n enabled: !!filteredTokenBalances\n }\n )\n\n const isSearchTermValidAddress = isValidAddressUtil(\n chainFilter.vmType,\n debouncedTokenSearchValue,\n chainFilter.id\n )\n\n const { data: trendingTokens, isLoading: isLoadingTrendingTokens } =\n useTrendingCurrencies(\n relayClient?.baseApiUrl,\n {\n referrer: relayClient?.source\n },\n {\n enabled: context === 'to'\n }\n )\n\n // Get main token list\n const { data: tokenList, isLoading: isLoadingTokenList } = useTokenList(\n relayClient?.baseApiUrl,\n {\n chainIds: chainFilter.id\n ? [chainFilter.id]\n : configuredChains.map((c) => c.id),\n address: isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n term: !isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n defaultList: useDefaultTokenList && !depositAddressOnly,\n limit: 12,\n depositAddressOnly,\n referrer: relayClient?.source\n }\n )\n\n const { data: externalTokenList, isLoading: isLoadingExternalList } =\n useTokenList(\n relayClient?.baseApiUrl,\n {\n chainIds: chainFilter.id\n ? [chainFilter.id]\n : configuredChains.map((c) => c.id),\n address: isSearchTermValidAddress\n ? debouncedTokenSearchValue\n : undefined,\n term: !isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n defaultList: false,\n limit: 12,\n useExternalSearch: true,\n referrer: relayClient?.source\n },\n {\n enabled: !!debouncedTokenSearchValue && !depositAddressOnly\n }\n )\n\n // Merge token lists when searching\n const combinedTokenList = useMemo(() => {\n if (!debouncedTokenSearchValue) return tokenList\n return mergeTokenLists([tokenList, externalTokenList])\n }, [tokenList, externalTokenList, debouncedTokenSearchValue])\n\n const sortedUserTokens = useEnhancedTokensList(\n userTokens,\n tokenBalances,\n context,\n multiWalletSupportEnabled,\n chainFilter.id,\n true\n )\n\n const sortedTrendingTokens = useEnhancedTokensList(\n trendingTokens,\n tokenBalances,\n 'to',\n multiWalletSupportEnabled,\n undefined,\n false\n )\n const sortedCombinedTokens = useEnhancedTokensList(\n combinedTokenList,\n tokenBalances,\n context,\n multiWalletSupportEnabled,\n chainFilter.id,\n false\n )\n\n const [chainSearchInputElement, setChainSearchInputElement] =\n useState<HTMLInputElement | null>(null)\n const [tokenSearchInputElement, setTokenSearchInputElement] =\n useState<HTMLInputElement | null>(null)\n\n const inputElement = hasMultipleConfiguredChainIds\n ? chainSearchInputElement\n : tokenSearchInputElement\n\n const handleChainStarToggle = useCallback(() => {\n setStarredChainIds(getStarredChainIds())\n }, [])\n\n useEffect(() => {\n if (open) {\n setStarredChainIds(getStarredChainIds())\n }\n }, [open])\n\n const resetState = useCallback(() => {\n setTokenSearchInput('')\n setChainSearchInputElement(null)\n setTokenSearchInputElement(null)\n }, [])\n\n const onOpenChange = useCallback(\n (openChange: boolean) => {\n let tokenCount = undefined\n let usdcCount = 0\n let usdtCount = 0\n let ethCount = 0\n\n try {\n if (!isLoadingBalances && tokenBalances) {\n tokenCount = Object.keys(tokenBalances).length\n Object.values(tokenBalances).forEach((token) => {\n const tokenSymbol = token.symbol\n ? token.symbol.toLowerCase()\n : token.symbol\n if (tokenSymbol === 'usdc') {\n usdcCount += 1\n } else if (tokenSymbol === 'usdt') {\n usdtCount += 1\n } else if (tokenSymbol === 'eth') {\n ethCount += 1\n }\n })\n }\n onAnalyticEvent?.(\n openChange\n ? EventNames.SWAP_START_TOKEN_SELECT\n : EventNames.SWAP_EXIT_TOKEN_SELECT,\n {\n direction: context === 'from' ? 'input' : 'output',\n ...(!openChange && {\n balanceData: {\n tokenCount,\n usdcCount,\n usdtCount,\n ethCount,\n balanceAddress: address\n }\n })\n }\n )\n } catch (error) {\n console.error(error)\n }\n\n if (openChange) {\n const chainFilter = getInitialChainFilter(\n chainFilterOptions,\n context,\n depositAddressOnly,\n token,\n true\n )\n setChainFilter(chainFilter)\n }\n\n setOpen(openChange)\n onPaymentMethodOpenChange?.(openChange)\n },\n [\n tokenBalances,\n isLoadingBalances,\n context,\n address,\n onAnalyticEvent,\n setOpen,\n chainFilterOptions,\n depositAddressOnly,\n token,\n onPaymentMethodOpenChange\n ]\n )\n\n const handleTokenSelection = useCallback(\n (selectedToken: Token) => {\n haptic('light')\n const isVerified = selectedToken.verified\n const direction = context === 'from' ? 'input' : 'output'\n let position = undefined\n\n // Track position for search results\n if (debouncedTokenSearchValue.length > 0) {\n position = sortedCombinedTokens.findIndex(\n (token) =>\n token.chainId === selectedToken.chainId &&\n token.address?.toLowerCase() ===\n selectedToken.address?.toLowerCase()\n )\n }\n\n if (!isVerified) {\n const relayUiKitData = getRelayUiKitData()\n const tokenKey = `${selectedToken.chainId}:${selectedToken.address}`\n const isAlreadyAccepted =\n relayUiKitData.acceptedUnverifiedTokens.includes(tokenKey)\n\n if (isAlreadyAccepted) {\n onAnalyticEvent?.(EventNames.SWAP_TOKEN_SELECT, {\n direction,\n token_symbol: selectedToken.symbol,\n chain_id: selectedToken.chainId,\n token_address: selectedToken.address,\n search_term: debouncedTokenSearchValue,\n position\n })\n setToken(selectedToken)\n } else {\n setUnverifiedToken(selectedToken)\n setUnverifiedTokenModalOpen(true)\n return\n }\n } else {\n onAnalyticEvent?.(EventNames.SWAP_TOKEN_SELECT, {\n direction,\n token_symbol: selectedToken.symbol,\n chain_id: selectedToken.chainId,\n token_address: selectedToken.address,\n search_term: debouncedTokenSearchValue,\n position\n })\n setToken(selectedToken)\n }\n\n onOpenChange(false)\n },\n [\n haptic,\n setToken,\n onOpenChange,\n resetState,\n context,\n onAnalyticEvent,\n debouncedTokenSearchValue,\n sortedCombinedTokens\n ]\n )\n\n useEffect(() => {\n if (!open) {\n resetState()\n }\n }, [open])\n\n // Focus input element when modal opens\n useEffect(() => {\n if (open && inputElement && isDesktop) {\n inputElement.focus()\n }\n }, [open, inputElement])\n\n const paymentMethodContent = (\n <Flex\n direction=\"column\"\n className=\"relay:w-full relay:h-full relay:gap-3 relay:overflow-y-hidden relay:min-w-0 relay:max-w-full\"\n >\n {/* Header with back button */}\n <Flex align=\"center\" className=\"relay:gap-1\">\n <Button\n color=\"ghost\"\n size=\"none\"\n onClick={() => onOpenChange(false)}\n className=\"relay:py-1 relay:px-0 relay:min-w-[auto] relay:text-[color:var(--relay-colors-gray9)] relay:cursor-pointer relay:rounded-[8px] relay:flex relay:items-center relay:gap-1 relay:focus-visible:shadow-[inset_0_0_0_2px_var(--relay-colors-focus-color)] relay:min-[660px]:p-0\"\n >\n <FontAwesomeIcon icon={faChevronLeft} width={20} height={20} />\n <Text\n style=\"subtitle1\"\n className=\"relay:text-[color:var(--relay-colors-text-subtle)] relay:min-[660px]:text-[14px] relay:min-[660px]:text-[color:var(--relay-colors-text-default)] relay:min-[660px]:leading-[20px]\"\n >\n {context === 'from' ? 'Pay with' : 'Sell to'}\n </Text>\n </Button>\n </Flex>\n\n <Flex className=\"relay:flex-1 relay:gap-3 relay:overflow-hidden relay:min-w-0 relay:max-w-full\">\n {/* Main Token Content */}\n <AccessibleList\n onSelect={(value) => {\n if (value === 'input') return\n const [chainId, ...addressParts] = value.split(':')\n const address = addressParts.join(':')\n const allTokens = [\n ...sortedUserTokens,\n ...sortedCombinedTokens,\n ...sortedTrendingTokens\n ]\n\n const selectedToken = allTokens.find(\n (token) =>\n token.chainId === Number(chainId) &&\n token.address?.toLowerCase() === address?.toLowerCase()\n )\n if (selectedToken) {\n handleTokenSelection(selectedToken)\n }\n }}\n className=\"relay:flex relay:flex-col relay:w-full relay:min-w-0 relay:max-w-full relay:h-full\"\n >\n {/* Search Input Section - Fixed */}\n <Flex\n direction=\"column\"\n align=\"start\"\n className=\"relay:w-full relay:gap-2 relay:bg-[var(--relay-colors-modal-background)] relay:min-w-0 relay:max-w-full\"\n >\n {/* Search input and Chain Filter Button Row */}\n <Flex\n align=\"center\"\n className=\"relay:w-full relay:gap-2 relay:min-w-0 relay:items-center relay:h-[40px]\"\n >\n <AccessibleListItem\n value=\"input\"\n asChild\n className=\"relay:flex-1 relay:min-w-0 relay:flex relay:items-center\"\n >\n <Input\n ref={setTokenSearchInputElement}\n placeholder=\"Search for a token\"\n icon={\n <Box className=\"relay:flex relay:text-[color:var(--relay-colors-gray9)]\">\n <FontAwesomeIcon\n icon={faMagnifyingGlass}\n width={16}\n height={16}\n />\n </Box>\n }\n containerClassName=\"relay:w-full relay:h-[40px]\"\n className=\"relay:w-full relay:[&::placeholder]:text-ellipsis\"\n onChange={(e) => {\n const value = (e.target as HTMLInputElement).value\n\n setTokenSearchInput(value)\n\n if (isValidAddressUtil(chainFilter.vmType, value)) {\n onAnalyticEvent?.(\n EventNames.TOKEN_SELECTOR_CONTRACT_SEARCH,\n {\n search_term: value,\n chain_filter: chainFilter.id\n }\n )\n }\n }}\n />\n </AccessibleListItem>\n\n {/* Chain Filter - Compact button with dropdown */}\n {(!configuredChainIds || hasMultipleConfiguredChainIds) && (\n <CompactChainFilter\n options={allChains}\n value={chainFilter}\n onSelect={setChainFilter}\n popularChainIds={popularChainIds}\n onChainStarToggle={handleChainStarToggle}\n starredChainIds={starredChainIds}\n onAnalyticEvent={onAnalyticEvent}\n />\n )}\n </Flex>\n </Flex>\n\n {/* Token Lists Section */}\n <Flex\n key={chainFilter.id ?? 'all'}\n direction=\"column\"\n className=\"relay:flex-1 relay:overflow-y-auto relay:gap-3 relay:pt-2 relay:min-w-0 relay:max-w-full\"\n style={{ scrollbarColor: 'var(--relay-colors-gray5) transparent' }}\n >\n {/* Suggested Tokens */}\n {chainFilter.id &&\n tokenSearchInput.length === 0 &&\n !depositAddressOnly ? (\n <SuggestedTokens\n chainId={chainFilter.id}\n depositAddressOnly={depositAddressOnly}\n onSelect={(token) => {\n handleTokenSelection(token)\n }}\n />\n ) : null}\n\n {/* Token Lists */}\n {tokenSearchInput.length > 0 ? (\n <TokenList\n title=\"Results\"\n tokens={sortedCombinedTokens}\n isLoading={\n isLoadingTokenList ||\n tokenSearchInput !== debouncedTokenSearchValue\n }\n isLoadingBalances={isLoadingBalances}\n chainFilterId={chainFilter.id}\n />\n ) : chainFilter.id ? (\n <TokenList\n title=\"Tokens\"\n tokens={sortedCombinedTokens}\n isLoading={isLoadingTokenList}\n isLoadingBalances={isLoadingBalances}\n chainFilterId={chainFilter.id}\n />\n ) : (\n <Flex direction=\"column\" className=\"relay:gap-3\">\n {(() => {\n const hasLoadedBalanceData = Boolean(walletTokens)\n const userTokensReady = !isLoadingUserTokens\n const isWaitingForBalanceData =\n address &&\n (isLoadingBalances || isLoadingUserTokens) &&\n (!hasLoadedBalanceData || !userTokensReady)\n\n if (isWaitingForBalanceData) {\n return (\n <PaymentTokenList\n title=\"Recommended\"\n tokens={[]}\n isLoading={true}\n isLoadingBalances={false}\n chainFilterId={chainFilter.id}\n limit={10}\n />\n )\n }\n\n const tokensWithValue =\n address && hasLoadedBalanceData && userTokensReady\n ? sortedUserTokens.filter(\n (token) =>\n token.balance?.value_usd &&\n token.balance.value_usd > 0\n )\n : []\n\n const fallbackTokens =\n context === 'to' && sortedTrendingTokens.length > 0\n ? sortedTrendingTokens\n : sortedCombinedTokens\n\n const isTrendingTokens =\n context === 'to' && sortedTrendingTokens.length > 0\n const shouldShowBalanceLoading =\n isLoadingBalances && Boolean(address)\n\n return (\n <>\n {tokensWithValue.length > 0 ? (\n <PaymentTokenList\n title=\"Recommended\"\n tokens={tokensWithValue}\n isLoading={false}\n isLoadingBalances={shouldShowBalanceLoading}\n chainFilterId={chainFilter.id}\n limit={tokensWithValue.length}\n />\n ) : null}\n <PaymentTokenList\n title={isTrendingTokens ? 'Global 24h' : 'Other Tokens'}\n tokens={fallbackTokens.slice(0, 10)}\n isLoading={\n context === 'to'\n ? isLoadingTrendingTokens\n : isLoadingTokenList\n }\n isLoadingBalances={shouldShowBalanceLoading}\n chainFilterId={chainFilter.id}\n limit={10}\n />\n </>\n )\n })()}\n </Flex>\n )}\n\n {/* Empty State */}\n {!isLoadingTokenList &&\n !isLoadingExternalList &&\n tokenList?.length === 0 &&\n externalTokenList?.length === 0 ? (\n <Flex\n direction=\"column\"\n align=\"center\"\n className=\"relay:py-5 relay:max-w-[312px] relay:self-center\"\n >\n {!chainFilter?.id && isSearchTermValidAddress && (\n <Box className=\"relay:text-[color:var(--relay-colors-gray8)] relay:mb-2\">\n <FontAwesomeIcon\n icon={faFolderOpen}\n size=\"xl\"\n width={27}\n height={24}\n />\n </Box>\n )}\n <Text\n color=\"subtle\"\n style=\"body2\"\n className=\"relay:text-center\"\n >\n {!chainFilter?.id && isSearchTermValidAddress\n ? 'No results. Switch to the desired chain to search by contract.'\n : 'No results.'}\n </Text>\n </Flex>\n ) : null}\n </Flex>\n </AccessibleList>\n </Flex>\n </Flex>\n )\n\n return (\n <>\n {/* Mobile: Overlay */}\n {!isDesktop && (\n <>\n <div onClick={() => onOpenChange(true)}>{trigger}</div>\n {open && (\n <Box className=\"relay:absolute relay:top-0 relay:left-0 relay:right-0 relay:bottom-0 relay:z-[100] relay:bg-[var(--relay-colors-widget-background)] relay:flex relay:flex-col relay:overflow-hidden\">\n {paymentMethodContent}\n </Box>\n )}\n </>\n )}\n\n {/* Desktop: Modal */}\n {isDesktop && (\n <Modal\n open={open}\n onOpenChange={onOpenChange}\n showCloseButton={false}\n trigger={trigger}\n className=\"relay:p-4 relay:flex relay:flex-col relay:min-w-0 relay:box-border\"\n contentStyle={{\n height: 'min(85vh, 540px)',\n width: 'min(400px, 100vw)',\n maxWidth: 'min(400px, 100vw)'\n }}\n >\n {paymentMethodContent}\n </Modal>\n )}\n\n {unverifiedTokenModalOpen && (\n <UnverifiedTokenModal\n open={unverifiedTokenModalOpen}\n onOpenChange={setUnverifiedTokenModalOpen}\n data={unverifiedToken ? { token: unverifiedToken } : undefined}\n onAcceptToken={(token) => {\n if (token) {\n handleTokenSelection(token)\n }\n setUnverifiedTokenModalOpen(false)\n }}\n />\n )}\n </>\n )\n}\n\nexport default PaymentMethod\n"]}
|
|
@@ -112,31 +112,31 @@ const TokenSelector = ({ token, trigger, chainIdsFilter, lockedChainIds, sameCha
|
|
|
112
112
|
...chainFilterOptions
|
|
113
113
|
], [isReceivingDepositAddress, chainFilterOptions, starredChainIds]);
|
|
114
114
|
const useDefaultTokenList = debouncedTokenSearchValue === '';
|
|
115
|
-
const { data:
|
|
115
|
+
const { data: walletTokens, balanceMap: tokenBalances, isLoading: isLoadingBalances } = (0, index_js_2.useCodexBalances)(address &&
|
|
116
116
|
address !== relay_sdk_1.evmDeadAddress &&
|
|
117
117
|
address !== relay_sdk_1.solDeadAddress &&
|
|
118
118
|
address !== relay_sdk_1.bitcoinDeadAddress &&
|
|
119
119
|
isValidAddress
|
|
120
120
|
? address
|
|
121
|
-
: undefined,
|
|
121
|
+
: undefined, {
|
|
122
122
|
staleTime: 60000,
|
|
123
123
|
gcTime: 60000
|
|
124
124
|
});
|
|
125
|
-
const
|
|
126
|
-
return
|
|
127
|
-
}, [
|
|
125
|
+
const filteredTokenBalances = (0, react_1.useMemo)(() => {
|
|
126
|
+
return walletTokens?.balances?.filter((balance) => configuredChainIds.includes(balance.chain_id));
|
|
127
|
+
}, [walletTokens?.balances, configuredChainIds]);
|
|
128
128
|
const userTokensQuery = (0, react_1.useMemo)(() => {
|
|
129
129
|
if (depositAddressOnly) {
|
|
130
130
|
return undefined;
|
|
131
131
|
}
|
|
132
|
-
if (
|
|
133
|
-
const sortedBalances = [...
|
|
132
|
+
if (filteredTokenBalances && filteredTokenBalances.length > 0) {
|
|
133
|
+
const sortedBalances = [...filteredTokenBalances]
|
|
134
134
|
.sort((a, b) => (b.value_usd ?? 0) - (a.value_usd ?? 0))
|
|
135
135
|
.slice(0, 100);
|
|
136
136
|
return sortedBalances.map((balance) => `${balance.chain_id}:${balance.address}`);
|
|
137
137
|
}
|
|
138
138
|
return undefined;
|
|
139
|
-
}, [
|
|
139
|
+
}, [filteredTokenBalances, depositAddressOnly]);
|
|
140
140
|
const solverUserTokens = (0, react_1.useMemo)(() => {
|
|
141
141
|
if (!depositAddressOnly) {
|
|
142
142
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenSelector.js","sourceRoot":"","sources":["../../../../../src/components/common/TokenSelector/TokenSelector.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n type FC,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react'\nimport { Flex, Text, Input, Box, Button } from '../../primitives/index.js'\nimport { Modal } from '../Modal.js'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faMagnifyingGlass } from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass'\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons/faXmark'\nimport type { Token } from '../../../types/index.js'\nimport { type ChainFilterValue } from './ChainFilter.js'\nimport useRelayClient from '../../../hooks/useRelayClient.js'\nimport { type Address } from 'viem'\nimport { useDebounceState, useDuneBalances } from '../../../hooks/index.js'\nimport { useMediaQuery } from 'usehooks-ts'\nimport {\n type Currency,\n useTokenList,\n useTrendingCurrencies\n} from '@relayprotocol/relay-kit-hooks'\nimport { EventNames } from '../../../constants/events.js'\nimport { useHapticEvent } from '../../../providers/RelayKitProvider.js'\nimport { UnverifiedTokenModal } from '../UnverifiedTokenModal.js'\nimport { useEnhancedTokensList } from '../../../hooks/useEnhancedTokensList.js'\nimport { TokenList } from './TokenList.js'\nimport { UnsupportedDepositAddressChainIds } from '../../../constants/depositAddresses.js'\nimport {\n getRelayUiKitData,\n getStarredChainIds\n} from '../../../utils/localStorage.js'\nimport { isValidAddress as isValidAddressUtil } from '../../../utils/address.js'\nimport {\n AccessibleList,\n AccessibleListItem\n} from '../../primitives/AccessibleList.js'\nimport { eclipse, solana } from '../../../utils/solana.js'\nimport { bitcoin } from '../../../utils/bitcoin.js'\nimport { ChainFilterSidebar } from './ChainFilterSidebar.js'\nimport { SuggestedTokens } from './SuggestedTokens.js'\nimport { MobileChainSelector } from './MobileChainSelector.js'\nimport { ChainShortcuts } from './ChainShortcuts.js'\nimport { mergeTokenLists } from '../../../utils/tokens.js'\nimport {\n bitcoinDeadAddress,\n evmDeadAddress,\n solDeadAddress,\n ASSETS_RELAY_API,\n type ChainVM\n} from '@relayprotocol/relay-sdk'\nimport {\n getInitialChainFilter,\n sortChains\n} from '../../../utils/tokenSelector.js'\nimport { useInternalRelayChains } from '../../../hooks/index.js'\n\nexport type TokenSelectorProps = {\n token?: Token\n trigger: ReactNode\n chainIdsFilter?: number[]\n lockedChainIds?: number[]\n sameChainId?: number\n context: 'from' | 'to'\n address?: Address | string\n isValidAddress?: boolean\n multiWalletSupportEnabled?: boolean\n fromChainWalletVMSupported?: boolean\n supportedWalletVMs?: Omit<ChainVM, 'hypevm' | 'lvm'>[]\n popularChainIds?: number[]\n setToken: (token: Token) => void\n onAnalyticEvent?: (eventName: string, data?: any) => void\n}\n\nconst TokenSelector: FC<TokenSelectorProps> = ({\n token,\n trigger,\n chainIdsFilter,\n lockedChainIds,\n sameChainId,\n context,\n address,\n isValidAddress,\n multiWalletSupportEnabled = false,\n fromChainWalletVMSupported,\n supportedWalletVMs,\n popularChainIds,\n setToken,\n onAnalyticEvent\n}) => {\n const haptic = useHapticEvent()\n const relayClient = useRelayClient()\n const { chains: allRelayChains } = useInternalRelayChains()\n\n const isDesktop = useMediaQuery('(min-width: 660px)')\n\n const [open, setOpen] = useState(false)\n const [mobileView, setMobileView] = useState<'tokens' | 'chains'>('tokens')\n\n const [unverifiedTokenModalOpen, setUnverifiedTokenModalOpen] =\n useState(false)\n const [unverifiedToken, setUnverifiedToken] = useState<Token | undefined>()\n\n const [chainFilter, setChainFilter] = useState<ChainFilterValue>({\n id: undefined,\n name: 'All Chains'\n })\n const [starredChainIds, setStarredChainIds] = useState<number[] | undefined>(\n () => getStarredChainIds()\n )\n\n const {\n value: tokenSearchInput,\n debouncedValue: debouncedTokenSearchValue,\n setValue: setTokenSearchInput\n } = useDebounceState<string>('', 500)\n\n const depositAddressOnly =\n context === 'from'\n ? chainFilter?.vmType\n ? !supportedWalletVMs?.includes(chainFilter.vmType)\n : !chainFilter.id\n ? false\n : !fromChainWalletVMSupported && chainFilter.id === token?.chainId\n : !fromChainWalletVMSupported\n\n const isReceivingDepositAddress = depositAddressOnly && context === 'to'\n\n // Configure chains\n const configuredChains = useMemo(() => {\n let chains =\n allRelayChains?.filter((chain) =>\n relayClient?.chains?.find((relayChain) => relayChain.id === chain.id)\n ) ?? []\n\n if (!multiWalletSupportEnabled && context === 'from') {\n chains = chains.filter((chain) => chain.vmType === 'evm')\n }\n // Hide chains without deposit-address support from the origin selector,\n // unless we have wallet support for their VM.\n if (context === 'from') {\n chains = chains.filter(\n (chain) =>\n !UnsupportedDepositAddressChainIds.includes(chain.id) ||\n (supportedWalletVMs?.some((vm) => vm === chain.vmType) ?? false)\n )\n }\n if (isReceivingDepositAddress) {\n chains = chains.filter(\n ({ id }) => !UnsupportedDepositAddressChainIds.includes(id)\n )\n }\n\n return sortChains(chains)\n }, [\n allRelayChains,\n relayClient?.chains,\n multiWalletSupportEnabled,\n context,\n depositAddressOnly,\n supportedWalletVMs\n ])\n\n const configuredChainIds = useMemo(() => {\n if (lockedChainIds) {\n return lockedChainIds\n }\n\n let _chainIds = configuredChains.map((chain) => chain.id)\n if (chainIdsFilter) {\n _chainIds = _chainIds.filter((id) => !chainIdsFilter.includes(id))\n }\n return _chainIds\n }, [configuredChains, lockedChainIds, chainIdsFilter, depositAddressOnly])\n\n const hasMultipleConfiguredChainIds = configuredChainIds.length > 1\n\n const chainFilterOptions =\n context === 'from'\n ? configuredChains?.filter(\n (chain) =>\n (chain.vmType === 'evm' ||\n chain.vmType === 'tvm' ||\n chain.vmType === 'tonvm' ||\n chain.vmType === 'hypevm' ||\n chain.id === solana.id ||\n chain.id === eclipse.id ||\n chain.id === bitcoin.id) &&\n configuredChainIds.includes(chain.id)\n )\n : configuredChains?.filter((chain) =>\n configuredChainIds.includes(chain.id)\n )\n\n const sameChainOption = useMemo(() => {\n if (\n context !== 'to' ||\n sameChainId === undefined ||\n isReceivingDepositAddress\n ) {\n return undefined\n }\n\n return chainFilterOptions?.find((chain) => chain.id === sameChainId)\n }, [context, sameChainId, isReceivingDepositAddress, chainFilterOptions])\n\n const allChains = useMemo(\n () => [\n ...(isReceivingDepositAddress\n ? []\n : [{ id: undefined, name: 'All Chains' }]),\n ...chainFilterOptions\n ],\n [isReceivingDepositAddress, chainFilterOptions, starredChainIds]\n )\n\n const useDefaultTokenList = debouncedTokenSearchValue === ''\n\n // Get user's token balances\n const {\n data: duneTokens,\n balanceMap: tokenBalances,\n isLoading: isLoadingBalances\n } = useDuneBalances(\n address &&\n address !== evmDeadAddress &&\n address !== solDeadAddress &&\n address !== bitcoinDeadAddress &&\n isValidAddress\n ? address\n : undefined,\n relayClient?.baseApiUrl?.includes('testnet') ? 'testnet' : 'mainnet',\n {\n staleTime: 60000,\n gcTime: 60000\n }\n )\n\n // Filter dune token balances based on configured chains\n const filteredDuneTokenBalances = useMemo(() => {\n return duneTokens?.balances?.filter((balance) =>\n configuredChainIds.includes(balance.chain_id)\n )\n }, [duneTokens?.balances, configuredChainIds])\n\n const userTokensQuery = useMemo(() => {\n if (depositAddressOnly) {\n return undefined\n }\n\n if (filteredDuneTokenBalances && filteredDuneTokenBalances.length > 0) {\n const sortedBalances = [...filteredDuneTokenBalances]\n .sort((a, b) => (b.value_usd ?? 0) - (a.value_usd ?? 0))\n .slice(0, 100)\n\n return sortedBalances.map(\n (balance) => `${balance.chain_id}:${balance.address}`\n )\n }\n return undefined\n }, [filteredDuneTokenBalances, depositAddressOnly])\n\n const solverUserTokens = useMemo<Currency[] | undefined>(() => {\n if (!depositAddressOnly) {\n return undefined\n }\n\n const tokenMap = new Map<string, Currency>()\n\n configuredChains.forEach((chain) => {\n chain.solverCurrencies?.forEach((currency) => {\n if (!currency.address || !currency.symbol || !currency.name) return\n const tokenKey = `${chain.id}:${currency.address.toLowerCase()}`\n const logoId = currency.id ?? currency.symbol.toLowerCase()\n\n tokenMap.set(tokenKey, {\n chainId: chain.id,\n address: currency.address,\n symbol: currency.symbol,\n name: currency.name,\n decimals: currency.decimals ?? 18,\n vmType: chain.vmType,\n metadata: {\n verified: true,\n logoURI: `${ASSETS_RELAY_API}/icons/currencies/${logoId}.png`\n }\n })\n })\n })\n\n return Array.from(tokenMap.values())\n }, [depositAddressOnly, configuredChains])\n\n // Get user's tokens from currencies api\n const { data: userTokens, isLoading: isLoadingUserTokens } = useTokenList(\n relayClient?.baseApiUrl,\n userTokensQuery\n ? {\n tokens: userTokensQuery,\n limit: 100,\n depositAddressOnly: false,\n referrer: relayClient?.source\n }\n : undefined,\n {\n enabled: !depositAddressOnly && !!userTokensQuery\n }\n )\n\n const resolvedUserTokens = depositAddressOnly ? solverUserTokens : userTokens\n const isLoadingResolvedUserTokens = depositAddressOnly\n ? !allRelayChains\n : isLoadingUserTokens\n\n const isSearchTermValidAddress = isValidAddressUtil(\n chainFilter.vmType,\n debouncedTokenSearchValue,\n chainFilter.id\n )\n\n const { data: trendingTokens, isLoading: isLoadingTrendingTokens } =\n useTrendingCurrencies(\n relayClient?.baseApiUrl,\n {\n referrer: relayClient?.source\n },\n {\n enabled: context === 'to'\n }\n )\n\n // Get main token list\n const { data: tokenList, isLoading: isLoadingTokenList } = useTokenList(\n relayClient?.baseApiUrl,\n {\n chainIds: chainFilter.id\n ? [chainFilter.id]\n : configuredChains.map((c) => c.id),\n address: isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n term: !isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n defaultList: useDefaultTokenList && !depositAddressOnly,\n limit: 12,\n depositAddressOnly,\n referrer: relayClient?.source\n }\n )\n\n // Get external token list for search\n const { data: externalTokenList, isLoading: isLoadingExternalList } =\n useTokenList(\n relayClient?.baseApiUrl,\n {\n chainIds: chainFilter.id\n ? [chainFilter.id]\n : configuredChains.map((c) => c.id),\n address: isSearchTermValidAddress\n ? debouncedTokenSearchValue\n : undefined,\n term: !isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n defaultList: false,\n limit: 12,\n useExternalSearch: true,\n referrer: relayClient?.source\n },\n {\n enabled: !!debouncedTokenSearchValue && !depositAddressOnly\n }\n )\n\n // Merge token lists when searching\n const combinedTokenList = useMemo(() => {\n if (!debouncedTokenSearchValue) return tokenList\n return mergeTokenLists([tokenList, externalTokenList])\n }, [tokenList, externalTokenList, debouncedTokenSearchValue])\n\n const sortedUserTokens = useEnhancedTokensList(\n resolvedUserTokens,\n tokenBalances,\n context,\n multiWalletSupportEnabled,\n chainFilter.id,\n true\n )\n\n const sortedTrendingTokens = useEnhancedTokensList(\n trendingTokens,\n tokenBalances,\n 'to',\n multiWalletSupportEnabled,\n undefined,\n false\n )\n const sortedCombinedTokens = useEnhancedTokensList(\n combinedTokenList,\n tokenBalances,\n context,\n multiWalletSupportEnabled,\n chainFilter.id,\n false\n )\n\n const [chainSearchInputElement, setChainSearchInputElement] =\n useState<HTMLInputElement | null>(null)\n const [tokenSearchInputElement, setTokenSearchInputElement] =\n useState<HTMLInputElement | null>(null)\n\n const inputElement = hasMultipleConfiguredChainIds\n ? chainSearchInputElement\n : tokenSearchInputElement\n\n const handleChainStarToggle = useCallback(() => {\n setStarredChainIds(getStarredChainIds())\n }, [])\n\n // Update starred chains when the modal opens to sync with other instances\n useEffect(() => {\n if (open) {\n setStarredChainIds(getStarredChainIds())\n }\n }, [open])\n\n const resetState = useCallback(() => {\n setTokenSearchInput('')\n setChainSearchInputElement(null)\n setTokenSearchInputElement(null)\n setMobileView('tokens')\n }, [])\n\n const onOpenChange = useCallback(\n (openChange: boolean) => {\n let tokenCount = undefined\n let usdcCount = 0\n let usdtCount = 0\n let ethCount = 0\n\n try {\n if (!isLoadingBalances && tokenBalances) {\n tokenCount = Object.keys(tokenBalances).length\n Object.values(tokenBalances).forEach((token) => {\n const tokenSymbol = token.symbol\n ? token.symbol.toLowerCase()\n : token.symbol\n if (tokenSymbol === 'usdc') {\n usdcCount += 1\n } else if (tokenSymbol === 'usdt') {\n usdtCount += 1\n } else if (tokenSymbol === 'eth') {\n ethCount += 1\n }\n })\n }\n onAnalyticEvent?.(\n openChange\n ? EventNames.SWAP_START_TOKEN_SELECT\n : EventNames.SWAP_EXIT_TOKEN_SELECT,\n {\n direction: context === 'from' ? 'input' : 'output',\n ...(!openChange && {\n balanceData: {\n tokenCount,\n usdcCount,\n usdtCount,\n ethCount,\n balanceAddress: address\n }\n })\n }\n )\n } catch (error) {\n console.error(error)\n }\n\n if (openChange) {\n // Set the initial chain filter before opening the modal\n const chainFilter = getInitialChainFilter(\n chainFilterOptions,\n context,\n depositAddressOnly,\n token\n )\n setChainFilter(chainFilter)\n }\n\n setOpen(openChange)\n },\n [\n tokenBalances,\n isLoadingBalances,\n context,\n address,\n onAnalyticEvent,\n setOpen,\n chainFilterOptions,\n depositAddressOnly,\n token\n ]\n )\n\n const handleTokenSelection = useCallback(\n (selectedToken: Token) => {\n haptic('light')\n const isVerified = selectedToken.verified\n const direction = context === 'from' ? 'input' : 'output'\n let position = undefined\n\n // Track position for search results\n if (debouncedTokenSearchValue.length > 0) {\n position = sortedCombinedTokens.findIndex(\n (token) =>\n token.chainId === selectedToken.chainId &&\n token.address?.toLowerCase() ===\n selectedToken.address?.toLowerCase()\n )\n }\n\n if (!isVerified) {\n const relayUiKitData = getRelayUiKitData()\n const tokenKey = `${selectedToken.chainId}:${selectedToken.address}`\n const isAlreadyAccepted =\n relayUiKitData.acceptedUnverifiedTokens.includes(tokenKey)\n\n if (isAlreadyAccepted) {\n onAnalyticEvent?.(EventNames.SWAP_TOKEN_SELECT, {\n direction,\n token_symbol: selectedToken.symbol,\n chain_id: selectedToken.chainId,\n token_address: selectedToken.address,\n search_term: debouncedTokenSearchValue,\n position\n })\n setToken(selectedToken)\n } else {\n setUnverifiedToken(selectedToken)\n setUnverifiedTokenModalOpen(true)\n return\n }\n } else {\n onAnalyticEvent?.(EventNames.SWAP_TOKEN_SELECT, {\n direction,\n token_symbol: selectedToken.symbol,\n chain_id: selectedToken.chainId,\n token_address: selectedToken.address,\n search_term: debouncedTokenSearchValue,\n position\n })\n setToken(selectedToken)\n }\n\n onOpenChange(false)\n },\n [\n haptic,\n setToken,\n onOpenChange,\n resetState,\n context,\n onAnalyticEvent,\n debouncedTokenSearchValue,\n sortedCombinedTokens\n ]\n )\n\n useEffect(() => {\n if (!open) {\n resetState()\n }\n }, [open])\n\n // Focus input element when modal opens\n useEffect(() => {\n if (open && inputElement && isDesktop) {\n inputElement.focus()\n }\n }, [open, inputElement])\n\n return (\n <>\n <div style={{ position: 'relative' }}>\n <Modal\n open={open}\n onOpenChange={onOpenChange}\n showCloseButton={isDesktop}\n disableAnimation={!isDesktop}\n onOpenAutoFocus={(e) => {\n if (!isDesktop) {\n e.preventDefault()\n }\n }}\n trigger={trigger}\n className=\"relay:p-4 relay:flex relay:flex-col relay:w-full relay:max-w-full relay:sm:max-w-full\"\n contentStyle={{\n height: isDesktop ? 'min(85vh, 600px)' : '100%',\n maxHeight: isDesktop ? 'min(85vh, 600px)' : '100%',\n borderRadius: isDesktop\n ? 'var(--relay-radii-modal-border-radius)'\n : '0px',\n minWidth: isDesktop\n ? hasMultipleConfiguredChainIds\n ? 660\n : 408\n : undefined,\n maxWidth: isDesktop\n ? hasMultipleConfiguredChainIds\n ? 660\n : 408\n : undefined\n }}\n >\n {!isDesktop && mobileView === 'chains' ? (\n <MobileChainSelector\n options={allChains}\n value={chainFilter}\n sameChainOption={sameChainOption}\n onSelect={(chain) => {\n setChainFilter(chain)\n setMobileView('tokens')\n }}\n onBack={() => setMobileView('tokens')}\n onClose={() => onOpenChange(false)}\n onAnalyticEvent={onAnalyticEvent}\n popularChainIds={popularChainIds}\n context={context}\n onChainStarToggle={handleChainStarToggle}\n starredChainIds={starredChainIds}\n />\n ) : (\n <Flex\n direction=\"column\"\n className=\"relay:w-full relay:h-full relay:gap-3 relay:overflow-y-hidden\"\n >\n {isDesktop && <Text style=\"h6\">Select Token</Text>}\n\n <Flex className=\"relay:flex-1 relay:gap-3 relay:overflow-hidden\">\n {/* Desktop Chain Filter Sidebar */}\n {isDesktop &&\n (!configuredChainIds || hasMultipleConfiguredChainIds) ? (\n <ChainFilterSidebar\n options={allChains}\n value={chainFilter}\n isOpen={open}\n onSelect={setChainFilter}\n sameChainOption={sameChainOption}\n onAnalyticEvent={onAnalyticEvent}\n onInputRef={setChainSearchInputElement}\n tokenSearchInputRef={tokenSearchInputElement}\n popularChainIds={popularChainIds}\n context={context}\n onChainStarToggle={handleChainStarToggle}\n starredChainIds={starredChainIds}\n />\n ) : null}\n\n {/* Main Token Content */}\n <AccessibleList\n onSelect={(value) => {\n if (value === 'input') return\n const [chainId, ...addressParts] = value.split(':')\n const address = addressParts.join(':')\n const allTokens = [\n ...sortedUserTokens,\n ...sortedCombinedTokens,\n ...sortedTrendingTokens\n ]\n\n const selectedToken = allTokens.find(\n (token) =>\n token.chainId === Number(chainId) &&\n token.address?.toLowerCase() === address?.toLowerCase()\n )\n if (selectedToken) {\n handleTokenSelection(selectedToken)\n }\n }}\n className=\"relay:flex relay:flex-col relay:w-full relay:min-w-0 relay:h-full\"\n >\n {/* Search Input Section - Fixed */}\n <Flex\n direction=\"column\"\n align=\"start\"\n className=\"relay:w-full relay:gap-2 relay:bg-[var(--relay-colors-modal-background)]\"\n >\n <Flex align=\"center\" className=\"relay:w-full relay:gap-2\">\n <AccessibleListItem value=\"input\" asChild>\n <Input\n ref={setTokenSearchInputElement}\n placeholder=\"Search for a token or paste address\"\n icon={\n <Box className=\"relay:flex relay:text-[color:var(--relay-colors-gray9)]\">\n <FontAwesomeIcon\n icon={faMagnifyingGlass}\n width={16}\n height={16}\n />\n </Box>\n }\n containerClassName={`relay:w-full relay:h-[40px] ${isDesktop ? 'relay:mb-1' : 'relay:mb-0'}`}\n className=\"relay:w-full relay:cursor-text relay:[&::placeholder]:text-ellipsis\"\n value={tokenSearchInput}\n onChange={(e) => {\n const value = (e.target as HTMLInputElement).value\n\n setTokenSearchInput(value)\n\n if (isValidAddressUtil(chainFilter.vmType, value)) {\n onAnalyticEvent?.(\n EventNames.TOKEN_SELECTOR_CONTRACT_SEARCH,\n {\n search_term: value,\n chain_filter: chainFilter.id\n }\n )\n }\n }}\n />\n </AccessibleListItem>\n\n {!isDesktop && (\n <Button\n color=\"ghost\"\n size=\"none\"\n onClick={() => onOpenChange(false)}\n className=\"relay:p-2 relay:rounded-[8px] relay:flex relay:items-center relay:justify-center relay:min-w-[40px] relay:h-[40px] relay:text-[color:var(--relay-colors-gray9)]\"\n >\n <FontAwesomeIcon\n icon={faXmark}\n width={16}\n height={16}\n />\n </Button>\n )}\n </Flex>\n {!isDesktop &&\n (!configuredChainIds || hasMultipleConfiguredChainIds) ? (\n <ChainShortcuts\n options={allChains}\n value={chainFilter}\n onSelect={setChainFilter}\n onMoreClick={() => setMobileView('chains')}\n popularChainIds={popularChainIds}\n starredChainIds={starredChainIds}\n onAnalyticEvent={onAnalyticEvent}\n context={context}\n />\n ) : null}\n\n {/* Selected Chain Header - Only show on mobile when specific chain is selected */}\n {!isDesktop && chainFilter.id !== undefined ? (\n <Flex\n align=\"center\"\n className=\"relay:gap-2 relay:pb-1 relay:w-full\"\n >\n <Text style=\"subtitle2\" color=\"subtle\">\n Tokens on{' '}\n {('displayName' in chainFilter &&\n chainFilter.displayName) ||\n chainFilter.name}\n </Text>\n </Flex>\n ) : null}\n </Flex>\n\n {/* Token Lists Section */}\n <Flex\n key={chainFilter.id ?? 'all'}\n direction=\"column\"\n className={`relay:flex-1 relay:overflow-y-auto relay:gap-3 ${!isDesktop && chainFilter.id !== undefined ? 'relay:pt-0' : 'relay:pt-2'}`}\n style={{\n scrollbarColor: 'var(--relay-colors-gray5) transparent'\n }}\n >\n {/* Suggested Tokens */}\n {chainFilter.id &&\n tokenSearchInput.length === 0 &&\n !depositAddressOnly ? (\n <SuggestedTokens\n chainId={chainFilter.id}\n depositAddressOnly={depositAddressOnly}\n onSelect={(token) => {\n handleTokenSelection(token)\n }}\n />\n ) : null}\n\n {/* Token Lists */}\n {tokenSearchInput.length > 0 ? (\n <TokenList\n title=\"Results\"\n tokens={sortedCombinedTokens}\n isLoading={\n isLoadingTokenList ||\n tokenSearchInput !== debouncedTokenSearchValue\n }\n isLoadingBalances={isLoadingBalances}\n chainFilterId={chainFilter.id}\n />\n ) : (\n <Flex direction=\"column\" className=\"relay:gap-3\">\n {[\n {\n title: 'Your Tokens',\n tokens: sortedUserTokens,\n isLoading: isLoadingResolvedUserTokens,\n show: sortedUserTokens.length > 0\n },\n {\n title: 'Global 24H Volume',\n tokens: sortedCombinedTokens,\n isLoading: isLoadingTokenList,\n show: true\n },\n {\n title: 'Relay 24H Volume',\n tokens: sortedTrendingTokens,\n isLoading: isLoadingTrendingTokens,\n show:\n context === 'to' && chainFilter.id === undefined,\n showMoreButton: true\n }\n ]\n .sort((a, b) => (context === 'to' ? -1 : 1)) // Reverse order depending on context\n .map(\n ({\n title,\n tokens,\n isLoading,\n show,\n showMoreButton\n }) =>\n show && (\n <TokenList\n key={title}\n title={title}\n tokens={tokens}\n isLoading={isLoading}\n isLoadingBalances={isLoadingBalances}\n chainFilterId={chainFilter.id}\n showMoreButton={showMoreButton}\n />\n )\n )}\n </Flex>\n )}\n\n {/* Empty State */}\n {!isLoadingTokenList &&\n !isLoadingExternalList &&\n tokenList?.length === 0 &&\n externalTokenList?.length === 0 ? (\n <Flex\n direction=\"column\"\n align=\"center\"\n className=\"relay:py-5 relay:max-w-[312px] relay:self-center\"\n >\n {!chainFilter?.id && isSearchTermValidAddress && (\n <Box className=\"relay:text-[color:var(--relay-colors-gray8)] relay:mb-2\">\n <FontAwesomeIcon\n icon={faFolderOpen}\n size=\"xl\"\n width={27}\n height={24}\n />\n </Box>\n )}\n <Text\n color=\"subtle\"\n style=\"body2\"\n className=\"relay:text-center\"\n >\n {!chainFilter?.id && isSearchTermValidAddress\n ? 'No results. Switch to the desired chain to search by contract.'\n : 'No results.'}\n </Text>\n </Flex>\n ) : null}\n </Flex>\n </AccessibleList>\n </Flex>\n </Flex>\n )}\n </Modal>\n </div>\n\n {unverifiedTokenModalOpen && (\n <UnverifiedTokenModal\n open={unverifiedTokenModalOpen}\n onOpenChange={setUnverifiedTokenModalOpen}\n data={unverifiedToken ? { token: unverifiedToken } : undefined}\n onAcceptToken={(token) => {\n if (token) {\n handleTokenSelection(token)\n }\n setUnverifiedTokenModalOpen(false)\n }}\n />\n )}\n </>\n )\n}\n\nexport default TokenSelector\n"]}
|
|
1
|
+
{"version":3,"file":"TokenSelector.js","sourceRoot":"","sources":["../../../../../src/components/common/TokenSelector/TokenSelector.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n type FC,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react'\nimport { Flex, Text, Input, Box, Button } from '../../primitives/index.js'\nimport { Modal } from '../Modal.js'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faMagnifyingGlass } from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass'\nimport { faFolderOpen } from '@fortawesome/free-solid-svg-icons/faFolderOpen'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons/faXmark'\nimport type { Token } from '../../../types/index.js'\nimport { type ChainFilterValue } from './ChainFilter.js'\nimport useRelayClient from '../../../hooks/useRelayClient.js'\nimport { type Address } from 'viem'\nimport { useDebounceState, useCodexBalances } from '../../../hooks/index.js'\nimport { useMediaQuery } from 'usehooks-ts'\nimport {\n type Currency,\n useTokenList,\n useTrendingCurrencies\n} from '@relayprotocol/relay-kit-hooks'\nimport { EventNames } from '../../../constants/events.js'\nimport { useHapticEvent } from '../../../providers/RelayKitProvider.js'\nimport { UnverifiedTokenModal } from '../UnverifiedTokenModal.js'\nimport { useEnhancedTokensList } from '../../../hooks/useEnhancedTokensList.js'\nimport { TokenList } from './TokenList.js'\nimport { UnsupportedDepositAddressChainIds } from '../../../constants/depositAddresses.js'\nimport {\n getRelayUiKitData,\n getStarredChainIds\n} from '../../../utils/localStorage.js'\nimport { isValidAddress as isValidAddressUtil } from '../../../utils/address.js'\nimport {\n AccessibleList,\n AccessibleListItem\n} from '../../primitives/AccessibleList.js'\nimport { eclipse, solana } from '../../../utils/solana.js'\nimport { bitcoin } from '../../../utils/bitcoin.js'\nimport { ChainFilterSidebar } from './ChainFilterSidebar.js'\nimport { SuggestedTokens } from './SuggestedTokens.js'\nimport { MobileChainSelector } from './MobileChainSelector.js'\nimport { ChainShortcuts } from './ChainShortcuts.js'\nimport { mergeTokenLists } from '../../../utils/tokens.js'\nimport {\n bitcoinDeadAddress,\n evmDeadAddress,\n solDeadAddress,\n ASSETS_RELAY_API,\n type ChainVM\n} from '@relayprotocol/relay-sdk'\nimport {\n getInitialChainFilter,\n sortChains\n} from '../../../utils/tokenSelector.js'\nimport { useInternalRelayChains } from '../../../hooks/index.js'\n\nexport type TokenSelectorProps = {\n token?: Token\n trigger: ReactNode\n chainIdsFilter?: number[]\n lockedChainIds?: number[]\n sameChainId?: number\n context: 'from' | 'to'\n address?: Address | string\n isValidAddress?: boolean\n multiWalletSupportEnabled?: boolean\n fromChainWalletVMSupported?: boolean\n supportedWalletVMs?: Omit<ChainVM, 'hypevm' | 'lvm'>[]\n popularChainIds?: number[]\n setToken: (token: Token) => void\n onAnalyticEvent?: (eventName: string, data?: any) => void\n}\n\nconst TokenSelector: FC<TokenSelectorProps> = ({\n token,\n trigger,\n chainIdsFilter,\n lockedChainIds,\n sameChainId,\n context,\n address,\n isValidAddress,\n multiWalletSupportEnabled = false,\n fromChainWalletVMSupported,\n supportedWalletVMs,\n popularChainIds,\n setToken,\n onAnalyticEvent\n}) => {\n const haptic = useHapticEvent()\n const relayClient = useRelayClient()\n const { chains: allRelayChains } = useInternalRelayChains()\n\n const isDesktop = useMediaQuery('(min-width: 660px)')\n\n const [open, setOpen] = useState(false)\n const [mobileView, setMobileView] = useState<'tokens' | 'chains'>('tokens')\n\n const [unverifiedTokenModalOpen, setUnverifiedTokenModalOpen] =\n useState(false)\n const [unverifiedToken, setUnverifiedToken] = useState<Token | undefined>()\n\n const [chainFilter, setChainFilter] = useState<ChainFilterValue>({\n id: undefined,\n name: 'All Chains'\n })\n const [starredChainIds, setStarredChainIds] = useState<number[] | undefined>(\n () => getStarredChainIds()\n )\n\n const {\n value: tokenSearchInput,\n debouncedValue: debouncedTokenSearchValue,\n setValue: setTokenSearchInput\n } = useDebounceState<string>('', 500)\n\n const depositAddressOnly =\n context === 'from'\n ? chainFilter?.vmType\n ? !supportedWalletVMs?.includes(chainFilter.vmType)\n : !chainFilter.id\n ? false\n : !fromChainWalletVMSupported && chainFilter.id === token?.chainId\n : !fromChainWalletVMSupported\n\n const isReceivingDepositAddress = depositAddressOnly && context === 'to'\n\n // Configure chains\n const configuredChains = useMemo(() => {\n let chains =\n allRelayChains?.filter((chain) =>\n relayClient?.chains?.find((relayChain) => relayChain.id === chain.id)\n ) ?? []\n\n if (!multiWalletSupportEnabled && context === 'from') {\n chains = chains.filter((chain) => chain.vmType === 'evm')\n }\n // Hide chains without deposit-address support from the origin selector,\n // unless we have wallet support for their VM.\n if (context === 'from') {\n chains = chains.filter(\n (chain) =>\n !UnsupportedDepositAddressChainIds.includes(chain.id) ||\n (supportedWalletVMs?.some((vm) => vm === chain.vmType) ?? false)\n )\n }\n if (isReceivingDepositAddress) {\n chains = chains.filter(\n ({ id }) => !UnsupportedDepositAddressChainIds.includes(id)\n )\n }\n\n return sortChains(chains)\n }, [\n allRelayChains,\n relayClient?.chains,\n multiWalletSupportEnabled,\n context,\n depositAddressOnly,\n supportedWalletVMs\n ])\n\n const configuredChainIds = useMemo(() => {\n if (lockedChainIds) {\n return lockedChainIds\n }\n\n let _chainIds = configuredChains.map((chain) => chain.id)\n if (chainIdsFilter) {\n _chainIds = _chainIds.filter((id) => !chainIdsFilter.includes(id))\n }\n return _chainIds\n }, [configuredChains, lockedChainIds, chainIdsFilter, depositAddressOnly])\n\n const hasMultipleConfiguredChainIds = configuredChainIds.length > 1\n\n const chainFilterOptions =\n context === 'from'\n ? configuredChains?.filter(\n (chain) =>\n (chain.vmType === 'evm' ||\n chain.vmType === 'tvm' ||\n chain.vmType === 'tonvm' ||\n chain.vmType === 'hypevm' ||\n chain.id === solana.id ||\n chain.id === eclipse.id ||\n chain.id === bitcoin.id) &&\n configuredChainIds.includes(chain.id)\n )\n : configuredChains?.filter((chain) =>\n configuredChainIds.includes(chain.id)\n )\n\n const sameChainOption = useMemo(() => {\n if (\n context !== 'to' ||\n sameChainId === undefined ||\n isReceivingDepositAddress\n ) {\n return undefined\n }\n\n return chainFilterOptions?.find((chain) => chain.id === sameChainId)\n }, [context, sameChainId, isReceivingDepositAddress, chainFilterOptions])\n\n const allChains = useMemo(\n () => [\n ...(isReceivingDepositAddress\n ? []\n : [{ id: undefined, name: 'All Chains' }]),\n ...chainFilterOptions\n ],\n [isReceivingDepositAddress, chainFilterOptions, starredChainIds]\n )\n\n const useDefaultTokenList = debouncedTokenSearchValue === ''\n\n // Get user's token balances\n const {\n data: walletTokens,\n balanceMap: tokenBalances,\n isLoading: isLoadingBalances\n } = useCodexBalances(\n address &&\n address !== evmDeadAddress &&\n address !== solDeadAddress &&\n address !== bitcoinDeadAddress &&\n isValidAddress\n ? address\n : undefined,\n {\n staleTime: 60000,\n gcTime: 60000\n }\n )\n\n // Filter wallet token balances based on configured chains\n const filteredTokenBalances = useMemo(() => {\n return walletTokens?.balances?.filter((balance) =>\n configuredChainIds.includes(balance.chain_id)\n )\n }, [walletTokens?.balances, configuredChainIds])\n\n const userTokensQuery = useMemo(() => {\n if (depositAddressOnly) {\n return undefined\n }\n\n if (filteredTokenBalances && filteredTokenBalances.length > 0) {\n const sortedBalances = [...filteredTokenBalances]\n .sort((a, b) => (b.value_usd ?? 0) - (a.value_usd ?? 0))\n .slice(0, 100)\n\n return sortedBalances.map(\n (balance) => `${balance.chain_id}:${balance.address}`\n )\n }\n return undefined\n }, [filteredTokenBalances, depositAddressOnly])\n\n const solverUserTokens = useMemo<Currency[] | undefined>(() => {\n if (!depositAddressOnly) {\n return undefined\n }\n\n const tokenMap = new Map<string, Currency>()\n\n configuredChains.forEach((chain) => {\n chain.solverCurrencies?.forEach((currency) => {\n if (!currency.address || !currency.symbol || !currency.name) return\n const tokenKey = `${chain.id}:${currency.address.toLowerCase()}`\n const logoId = currency.id ?? currency.symbol.toLowerCase()\n\n tokenMap.set(tokenKey, {\n chainId: chain.id,\n address: currency.address,\n symbol: currency.symbol,\n name: currency.name,\n decimals: currency.decimals ?? 18,\n vmType: chain.vmType,\n metadata: {\n verified: true,\n logoURI: `${ASSETS_RELAY_API}/icons/currencies/${logoId}.png`\n }\n })\n })\n })\n\n return Array.from(tokenMap.values())\n }, [depositAddressOnly, configuredChains])\n\n // Get user's tokens from currencies api\n const { data: userTokens, isLoading: isLoadingUserTokens } = useTokenList(\n relayClient?.baseApiUrl,\n userTokensQuery\n ? {\n tokens: userTokensQuery,\n limit: 100,\n depositAddressOnly: false,\n referrer: relayClient?.source\n }\n : undefined,\n {\n enabled: !depositAddressOnly && !!userTokensQuery\n }\n )\n\n const resolvedUserTokens = depositAddressOnly ? solverUserTokens : userTokens\n const isLoadingResolvedUserTokens = depositAddressOnly\n ? !allRelayChains\n : isLoadingUserTokens\n\n const isSearchTermValidAddress = isValidAddressUtil(\n chainFilter.vmType,\n debouncedTokenSearchValue,\n chainFilter.id\n )\n\n const { data: trendingTokens, isLoading: isLoadingTrendingTokens } =\n useTrendingCurrencies(\n relayClient?.baseApiUrl,\n {\n referrer: relayClient?.source\n },\n {\n enabled: context === 'to'\n }\n )\n\n // Get main token list\n const { data: tokenList, isLoading: isLoadingTokenList } = useTokenList(\n relayClient?.baseApiUrl,\n {\n chainIds: chainFilter.id\n ? [chainFilter.id]\n : configuredChains.map((c) => c.id),\n address: isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n term: !isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n defaultList: useDefaultTokenList && !depositAddressOnly,\n limit: 12,\n depositAddressOnly,\n referrer: relayClient?.source\n }\n )\n\n // Get external token list for search\n const { data: externalTokenList, isLoading: isLoadingExternalList } =\n useTokenList(\n relayClient?.baseApiUrl,\n {\n chainIds: chainFilter.id\n ? [chainFilter.id]\n : configuredChains.map((c) => c.id),\n address: isSearchTermValidAddress\n ? debouncedTokenSearchValue\n : undefined,\n term: !isSearchTermValidAddress ? debouncedTokenSearchValue : undefined,\n defaultList: false,\n limit: 12,\n useExternalSearch: true,\n referrer: relayClient?.source\n },\n {\n enabled: !!debouncedTokenSearchValue && !depositAddressOnly\n }\n )\n\n // Merge token lists when searching\n const combinedTokenList = useMemo(() => {\n if (!debouncedTokenSearchValue) return tokenList\n return mergeTokenLists([tokenList, externalTokenList])\n }, [tokenList, externalTokenList, debouncedTokenSearchValue])\n\n const sortedUserTokens = useEnhancedTokensList(\n resolvedUserTokens,\n tokenBalances,\n context,\n multiWalletSupportEnabled,\n chainFilter.id,\n true\n )\n\n const sortedTrendingTokens = useEnhancedTokensList(\n trendingTokens,\n tokenBalances,\n 'to',\n multiWalletSupportEnabled,\n undefined,\n false\n )\n const sortedCombinedTokens = useEnhancedTokensList(\n combinedTokenList,\n tokenBalances,\n context,\n multiWalletSupportEnabled,\n chainFilter.id,\n false\n )\n\n const [chainSearchInputElement, setChainSearchInputElement] =\n useState<HTMLInputElement | null>(null)\n const [tokenSearchInputElement, setTokenSearchInputElement] =\n useState<HTMLInputElement | null>(null)\n\n const inputElement = hasMultipleConfiguredChainIds\n ? chainSearchInputElement\n : tokenSearchInputElement\n\n const handleChainStarToggle = useCallback(() => {\n setStarredChainIds(getStarredChainIds())\n }, [])\n\n // Update starred chains when the modal opens to sync with other instances\n useEffect(() => {\n if (open) {\n setStarredChainIds(getStarredChainIds())\n }\n }, [open])\n\n const resetState = useCallback(() => {\n setTokenSearchInput('')\n setChainSearchInputElement(null)\n setTokenSearchInputElement(null)\n setMobileView('tokens')\n }, [])\n\n const onOpenChange = useCallback(\n (openChange: boolean) => {\n let tokenCount = undefined\n let usdcCount = 0\n let usdtCount = 0\n let ethCount = 0\n\n try {\n if (!isLoadingBalances && tokenBalances) {\n tokenCount = Object.keys(tokenBalances).length\n Object.values(tokenBalances).forEach((token) => {\n const tokenSymbol = token.symbol\n ? token.symbol.toLowerCase()\n : token.symbol\n if (tokenSymbol === 'usdc') {\n usdcCount += 1\n } else if (tokenSymbol === 'usdt') {\n usdtCount += 1\n } else if (tokenSymbol === 'eth') {\n ethCount += 1\n }\n })\n }\n onAnalyticEvent?.(\n openChange\n ? EventNames.SWAP_START_TOKEN_SELECT\n : EventNames.SWAP_EXIT_TOKEN_SELECT,\n {\n direction: context === 'from' ? 'input' : 'output',\n ...(!openChange && {\n balanceData: {\n tokenCount,\n usdcCount,\n usdtCount,\n ethCount,\n balanceAddress: address\n }\n })\n }\n )\n } catch (error) {\n console.error(error)\n }\n\n if (openChange) {\n // Set the initial chain filter before opening the modal\n const chainFilter = getInitialChainFilter(\n chainFilterOptions,\n context,\n depositAddressOnly,\n token\n )\n setChainFilter(chainFilter)\n }\n\n setOpen(openChange)\n },\n [\n tokenBalances,\n isLoadingBalances,\n context,\n address,\n onAnalyticEvent,\n setOpen,\n chainFilterOptions,\n depositAddressOnly,\n token\n ]\n )\n\n const handleTokenSelection = useCallback(\n (selectedToken: Token) => {\n haptic('light')\n const isVerified = selectedToken.verified\n const direction = context === 'from' ? 'input' : 'output'\n let position = undefined\n\n // Track position for search results\n if (debouncedTokenSearchValue.length > 0) {\n position = sortedCombinedTokens.findIndex(\n (token) =>\n token.chainId === selectedToken.chainId &&\n token.address?.toLowerCase() ===\n selectedToken.address?.toLowerCase()\n )\n }\n\n if (!isVerified) {\n const relayUiKitData = getRelayUiKitData()\n const tokenKey = `${selectedToken.chainId}:${selectedToken.address}`\n const isAlreadyAccepted =\n relayUiKitData.acceptedUnverifiedTokens.includes(tokenKey)\n\n if (isAlreadyAccepted) {\n onAnalyticEvent?.(EventNames.SWAP_TOKEN_SELECT, {\n direction,\n token_symbol: selectedToken.symbol,\n chain_id: selectedToken.chainId,\n token_address: selectedToken.address,\n search_term: debouncedTokenSearchValue,\n position\n })\n setToken(selectedToken)\n } else {\n setUnverifiedToken(selectedToken)\n setUnverifiedTokenModalOpen(true)\n return\n }\n } else {\n onAnalyticEvent?.(EventNames.SWAP_TOKEN_SELECT, {\n direction,\n token_symbol: selectedToken.symbol,\n chain_id: selectedToken.chainId,\n token_address: selectedToken.address,\n search_term: debouncedTokenSearchValue,\n position\n })\n setToken(selectedToken)\n }\n\n onOpenChange(false)\n },\n [\n haptic,\n setToken,\n onOpenChange,\n resetState,\n context,\n onAnalyticEvent,\n debouncedTokenSearchValue,\n sortedCombinedTokens\n ]\n )\n\n useEffect(() => {\n if (!open) {\n resetState()\n }\n }, [open])\n\n // Focus input element when modal opens\n useEffect(() => {\n if (open && inputElement && isDesktop) {\n inputElement.focus()\n }\n }, [open, inputElement])\n\n return (\n <>\n <div style={{ position: 'relative' }}>\n <Modal\n open={open}\n onOpenChange={onOpenChange}\n showCloseButton={isDesktop}\n disableAnimation={!isDesktop}\n onOpenAutoFocus={(e) => {\n if (!isDesktop) {\n e.preventDefault()\n }\n }}\n trigger={trigger}\n className=\"relay:p-4 relay:flex relay:flex-col relay:w-full relay:max-w-full relay:sm:max-w-full\"\n contentStyle={{\n height: isDesktop ? 'min(85vh, 600px)' : '100%',\n maxHeight: isDesktop ? 'min(85vh, 600px)' : '100%',\n borderRadius: isDesktop\n ? 'var(--relay-radii-modal-border-radius)'\n : '0px',\n minWidth: isDesktop\n ? hasMultipleConfiguredChainIds\n ? 660\n : 408\n : undefined,\n maxWidth: isDesktop\n ? hasMultipleConfiguredChainIds\n ? 660\n : 408\n : undefined\n }}\n >\n {!isDesktop && mobileView === 'chains' ? (\n <MobileChainSelector\n options={allChains}\n value={chainFilter}\n sameChainOption={sameChainOption}\n onSelect={(chain) => {\n setChainFilter(chain)\n setMobileView('tokens')\n }}\n onBack={() => setMobileView('tokens')}\n onClose={() => onOpenChange(false)}\n onAnalyticEvent={onAnalyticEvent}\n popularChainIds={popularChainIds}\n context={context}\n onChainStarToggle={handleChainStarToggle}\n starredChainIds={starredChainIds}\n />\n ) : (\n <Flex\n direction=\"column\"\n className=\"relay:w-full relay:h-full relay:gap-3 relay:overflow-y-hidden\"\n >\n {isDesktop && <Text style=\"h6\">Select Token</Text>}\n\n <Flex className=\"relay:flex-1 relay:gap-3 relay:overflow-hidden\">\n {/* Desktop Chain Filter Sidebar */}\n {isDesktop &&\n (!configuredChainIds || hasMultipleConfiguredChainIds) ? (\n <ChainFilterSidebar\n options={allChains}\n value={chainFilter}\n isOpen={open}\n onSelect={setChainFilter}\n sameChainOption={sameChainOption}\n onAnalyticEvent={onAnalyticEvent}\n onInputRef={setChainSearchInputElement}\n tokenSearchInputRef={tokenSearchInputElement}\n popularChainIds={popularChainIds}\n context={context}\n onChainStarToggle={handleChainStarToggle}\n starredChainIds={starredChainIds}\n />\n ) : null}\n\n {/* Main Token Content */}\n <AccessibleList\n onSelect={(value) => {\n if (value === 'input') return\n const [chainId, ...addressParts] = value.split(':')\n const address = addressParts.join(':')\n const allTokens = [\n ...sortedUserTokens,\n ...sortedCombinedTokens,\n ...sortedTrendingTokens\n ]\n\n const selectedToken = allTokens.find(\n (token) =>\n token.chainId === Number(chainId) &&\n token.address?.toLowerCase() === address?.toLowerCase()\n )\n if (selectedToken) {\n handleTokenSelection(selectedToken)\n }\n }}\n className=\"relay:flex relay:flex-col relay:w-full relay:min-w-0 relay:h-full\"\n >\n {/* Search Input Section - Fixed */}\n <Flex\n direction=\"column\"\n align=\"start\"\n className=\"relay:w-full relay:gap-2 relay:bg-[var(--relay-colors-modal-background)]\"\n >\n <Flex align=\"center\" className=\"relay:w-full relay:gap-2\">\n <AccessibleListItem value=\"input\" asChild>\n <Input\n ref={setTokenSearchInputElement}\n placeholder=\"Search for a token or paste address\"\n icon={\n <Box className=\"relay:flex relay:text-[color:var(--relay-colors-gray9)]\">\n <FontAwesomeIcon\n icon={faMagnifyingGlass}\n width={16}\n height={16}\n />\n </Box>\n }\n containerClassName={`relay:w-full relay:h-[40px] ${isDesktop ? 'relay:mb-1' : 'relay:mb-0'}`}\n className=\"relay:w-full relay:cursor-text relay:[&::placeholder]:text-ellipsis\"\n value={tokenSearchInput}\n onChange={(e) => {\n const value = (e.target as HTMLInputElement).value\n\n setTokenSearchInput(value)\n\n if (isValidAddressUtil(chainFilter.vmType, value)) {\n onAnalyticEvent?.(\n EventNames.TOKEN_SELECTOR_CONTRACT_SEARCH,\n {\n search_term: value,\n chain_filter: chainFilter.id\n }\n )\n }\n }}\n />\n </AccessibleListItem>\n\n {!isDesktop && (\n <Button\n color=\"ghost\"\n size=\"none\"\n onClick={() => onOpenChange(false)}\n className=\"relay:p-2 relay:rounded-[8px] relay:flex relay:items-center relay:justify-center relay:min-w-[40px] relay:h-[40px] relay:text-[color:var(--relay-colors-gray9)]\"\n >\n <FontAwesomeIcon\n icon={faXmark}\n width={16}\n height={16}\n />\n </Button>\n )}\n </Flex>\n {!isDesktop &&\n (!configuredChainIds || hasMultipleConfiguredChainIds) ? (\n <ChainShortcuts\n options={allChains}\n value={chainFilter}\n onSelect={setChainFilter}\n onMoreClick={() => setMobileView('chains')}\n popularChainIds={popularChainIds}\n starredChainIds={starredChainIds}\n onAnalyticEvent={onAnalyticEvent}\n context={context}\n />\n ) : null}\n\n {/* Selected Chain Header - Only show on mobile when specific chain is selected */}\n {!isDesktop && chainFilter.id !== undefined ? (\n <Flex\n align=\"center\"\n className=\"relay:gap-2 relay:pb-1 relay:w-full\"\n >\n <Text style=\"subtitle2\" color=\"subtle\">\n Tokens on{' '}\n {('displayName' in chainFilter &&\n chainFilter.displayName) ||\n chainFilter.name}\n </Text>\n </Flex>\n ) : null}\n </Flex>\n\n {/* Token Lists Section */}\n <Flex\n key={chainFilter.id ?? 'all'}\n direction=\"column\"\n className={`relay:flex-1 relay:overflow-y-auto relay:gap-3 ${!isDesktop && chainFilter.id !== undefined ? 'relay:pt-0' : 'relay:pt-2'}`}\n style={{\n scrollbarColor: 'var(--relay-colors-gray5) transparent'\n }}\n >\n {/* Suggested Tokens */}\n {chainFilter.id &&\n tokenSearchInput.length === 0 &&\n !depositAddressOnly ? (\n <SuggestedTokens\n chainId={chainFilter.id}\n depositAddressOnly={depositAddressOnly}\n onSelect={(token) => {\n handleTokenSelection(token)\n }}\n />\n ) : null}\n\n {/* Token Lists */}\n {tokenSearchInput.length > 0 ? (\n <TokenList\n title=\"Results\"\n tokens={sortedCombinedTokens}\n isLoading={\n isLoadingTokenList ||\n tokenSearchInput !== debouncedTokenSearchValue\n }\n isLoadingBalances={isLoadingBalances}\n chainFilterId={chainFilter.id}\n />\n ) : (\n <Flex direction=\"column\" className=\"relay:gap-3\">\n {[\n {\n title: 'Your Tokens',\n tokens: sortedUserTokens,\n isLoading: isLoadingResolvedUserTokens,\n show: sortedUserTokens.length > 0\n },\n {\n title: 'Global 24H Volume',\n tokens: sortedCombinedTokens,\n isLoading: isLoadingTokenList,\n show: true\n },\n {\n title: 'Relay 24H Volume',\n tokens: sortedTrendingTokens,\n isLoading: isLoadingTrendingTokens,\n show:\n context === 'to' && chainFilter.id === undefined,\n showMoreButton: true\n }\n ]\n .sort((a, b) => (context === 'to' ? -1 : 1)) // Reverse order depending on context\n .map(\n ({\n title,\n tokens,\n isLoading,\n show,\n showMoreButton\n }) =>\n show && (\n <TokenList\n key={title}\n title={title}\n tokens={tokens}\n isLoading={isLoading}\n isLoadingBalances={isLoadingBalances}\n chainFilterId={chainFilter.id}\n showMoreButton={showMoreButton}\n />\n )\n )}\n </Flex>\n )}\n\n {/* Empty State */}\n {!isLoadingTokenList &&\n !isLoadingExternalList &&\n tokenList?.length === 0 &&\n externalTokenList?.length === 0 ? (\n <Flex\n direction=\"column\"\n align=\"center\"\n className=\"relay:py-5 relay:max-w-[312px] relay:self-center\"\n >\n {!chainFilter?.id && isSearchTermValidAddress && (\n <Box className=\"relay:text-[color:var(--relay-colors-gray8)] relay:mb-2\">\n <FontAwesomeIcon\n icon={faFolderOpen}\n size=\"xl\"\n width={27}\n height={24}\n />\n </Box>\n )}\n <Text\n color=\"subtle\"\n style=\"body2\"\n className=\"relay:text-center\"\n >\n {!chainFilter?.id && isSearchTermValidAddress\n ? 'No results. Switch to the desired chain to search by contract.'\n : 'No results.'}\n </Text>\n </Flex>\n ) : null}\n </Flex>\n </AccessibleList>\n </Flex>\n </Flex>\n )}\n </Modal>\n </div>\n\n {unverifiedTokenModalOpen && (\n <UnverifiedTokenModal\n open={unverifiedTokenModalOpen}\n onOpenChange={setUnverifiedTokenModalOpen}\n data={unverifiedToken ? { token: unverifiedToken } : undefined}\n onAcceptToken={(token) => {\n if (token) {\n handleTokenSelection(token)\n }\n setUnverifiedTokenModalOpen(false)\n }}\n />\n )}\n </>\n )\n}\n\nexport default TokenSelector\n"]}
|