import _ from 'lodash' import Fuse from 'fuse.js' import { useTranslations } from 'next-intl' import { getRoutePossibilities } from '@/utils/routeMaker/generateRoutePossibilities' import { Token } from '@/utils/types' import { BridgeState } from '@/slices/bridge/reducer' import { useBridgeState } from '@/slices/bridge/hooks' import { sortByPriorityRank } from '@/utils/sortByPriorityRank' export const useToTokenListArray = (searchStr: string = '') => { const { fromChainId, toTokens, toChainId }: BridgeState = useBridgeState() const t = useTranslations('Bridge') let possibleTokens: Token[] = sortByPriorityRank(toTokens) const { toTokens: allToChainTokens } = getRoutePossibilities({ fromChainId, fromToken: null, toChainId, toToken: null, }) let remainingChainTokens = toChainId ? sortByPriorityRank(_.difference(allToChainTokens, toTokens)) : [] const { toTokens: allTokens } = getRoutePossibilities({ fromChainId: null, fromToken: null, toChainId: null, toToken: null, }) let allOtherToTokens = toChainId ? sortByPriorityRank(_.difference(allTokens, allToChainTokens)) : sortByPriorityRank(allTokens) const possibleTokenswithSource = possibleTokens.map((token) => ({ ...token, source: 'possibleTokens', })) const remainingChainTokensWithSource = remainingChainTokens.map((token) => ({ ...token, source: 'remainingChainTokens', })) const allOtherToTokensWithSource = allOtherToTokens.map((token) => ({ ...token, source: 'allOtherToTokens', })) const masterList = [ ...possibleTokenswithSource, ...remainingChainTokensWithSource, ...allOtherToTokensWithSource, ] const fuseOptions = { ignoreLocation: true, includeScore: true, threshold: 0.0, keys: [ { name: 'symbol', weight: 2, }, 'routeSymbol', `addresses.${toChainId}`, 'name', ], } const fuse = new Fuse(masterList, fuseOptions) if (searchStr?.length > 0) { const results = fuse.search(searchStr).map((i) => i.item) possibleTokens = results.filter((item) => item.source === 'possibleTokens') remainingChainTokens = results.filter( (item) => item.source === 'remainingChainTokens' ) allOtherToTokens = results.filter( (item) => item.source === 'allOtherToTokens' ) } return { [t('ReceiveWithEllipsis')]: possibleTokens, [t('All receivable tokens')]: remainingChainTokens, [t('All other tokens')]: allOtherToTokens, } }