Files
dydx-v4-web/src/hooks/useMarketsData.ts
T
Jared Vu 15bf8a1b34 Update Abacus v0.6.0 (#55)
* Abacus 6: New init, deprecate asset.symbol

* deprecate asset.symbol

* Update networks constants

* filesystem

* Update networks.ts

* 0.6.0 -> 0.6.3

* Remove Market filter
2023-10-03 13:10:55 -07:00

65 lines
2.0 KiB
TypeScript

import { useMemo } from 'react';
import { useSelector, shallowEqual } from 'react-redux';
import { MarketFilters, MARKET_FILTER_LABELS, type MarketData } from '@/constants/markets';
import { getAssets } from '@/state/assetsSelectors';
import { getPerpetualMarkets } from '@/state/perpetualsSelectors';
const filterFunctions = {
[MarketFilters.ALL]: (market: MarketData) => true,
[MarketFilters.LAYER_1]: (market: MarketData) => {
return market.asset.tags?.toArray().includes('Layer 1');
},
[MarketFilters.DEFI]: (market: MarketData) => {
return market.asset.tags?.toArray().includes('Defi');
},
};
export const useMarketsData = (
filter: MarketFilters = MarketFilters.ALL,
searchFilter?: string
): {
markets: MarketData[];
filteredMarkets: MarketData[];
marketFilters: string[];
} => {
const allPerpetualMarkets = useSelector(getPerpetualMarkets, shallowEqual) || {};
const allAssets = useSelector(getAssets, shallowEqual) || {};
const markets = useMemo(() => {
return Object.values(allPerpetualMarkets).map((marketData) => ({
asset: allAssets[marketData.assetId],
tickSizeDecimals: marketData.configs?.tickSizeDecimals,
...marketData,
...marketData.perpetual,
...marketData.configs,
})) as MarketData[];
}, [allPerpetualMarkets, allAssets]);
const filteredMarkets = useMemo(() => {
const filtered = markets.filter(filterFunctions[filter]);
if (searchFilter) {
return filtered.filter(
({ asset }) =>
asset?.name?.toLocaleLowerCase().includes(searchFilter.toLowerCase()) ||
asset?.id?.toLocaleLowerCase().includes(searchFilter.toLowerCase())
);
}
return filtered;
}, [markets, searchFilter, filter]);
const marketFilters = useMemo(
() => [
MarketFilters.ALL,
...Object.keys(MARKET_FILTER_LABELS).filter((marketFilter) =>
markets.some((market) => market.asset?.tags?.toArray().some((tag) => tag === marketFilter))
),
],
[markets]
);
return { marketFilters, filteredMarkets, markets };
};