@lifi/widget
Version:
LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.
53 lines • 2.44 kB
JavaScript
import { getToken, } from '@lifi/sdk';
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { useWidgetConfig } from '../providers/WidgetProvider/WidgetProvider.js';
import { getConfigItemSets, isFormItemAllowed } from '../utils/item.js';
import { getQueryKey } from '../utils/queries.js';
export const useTokenSearch = (chainId, tokenQuery, enabled, formType) => {
const queryClient = useQueryClient();
const { tokens: configTokens, keyPrefix } = useWidgetConfig();
const { data, isLoading } = useQuery({
queryKey: [getQueryKey('token-search', keyPrefix), chainId, tokenQuery],
queryFn: async ({ queryKey: [, chainId, tokenQuery], signal }) => {
const token = await getToken(chainId, tokenQuery, {
signal,
});
if (token) {
// Filter config tokens by chain before checking if token is allowed
const filteredConfigTokens = getConfigItemSets(configTokens, (tokens) => new Set(tokens
.filter((t) => t.chainId === token.chainId)
.map((t) => t.address.toLowerCase())), formType);
// Return undefined if the token is denied
if (!isFormItemAllowed(token, filteredConfigTokens, formType, (t) => t.address.toLowerCase())) {
return null;
}
// Add token to main tokens cache
queryClient.setQueriesData({ queryKey: [getQueryKey('tokens', keyPrefix)] }, (data) => {
if (!data) {
return data;
}
const chainTokens = data[chainId];
if (chainTokens?.some((t) => t.address.toLowerCase() === token.address.toLowerCase())) {
return data;
}
// Mark token from search as unverified
return {
...data,
[chainId]: [
...(chainTokens ?? []),
{ ...token, verified: false },
],
};
});
}
return token;
},
enabled: Boolean(chainId && tokenQuery && enabled),
retry: false,
});
return {
token: data || undefined,
isLoading,
};
};
//# sourceMappingURL=useTokenSearch.js.map