antoncoding/monarch

View on GitHub
app/markets/components/utils.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { SupportedNetworks } from '@/utils/networks';
import { isWhitelisted } from '@/utils/tokens';
import { Market } from '@/utils/types';
import { SortColumn } from './constants';

export const sortProperties = {
  [SortColumn.LoanAsset]: 'loanAsset.name',
  [SortColumn.CollateralAsset]: 'collateralAsset.name',
  [SortColumn.LLTV]: 'lltv',
  [SortColumn.Reward]: (item: Market) => Number(item.rewardPer1000USD ?? '0'),
  [SortColumn.Supply]: 'state.supplyAssetsUsd',
  [SortColumn.Borrow]: 'state.borrowAssetsUsd',
  [SortColumn.SupplyAPY]: 'state.supplyApy',
};

export const getNestedProperty = (obj: Market, path: string | ((item: Market) => number)) => {
  if (typeof path === 'function') {
    return path(obj);
  }

  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/prefer-optional-chain
  return path.split('.').reduce((acc, part) => acc && acc[part], obj as any);
};

const isSelectedAsset = (
  market: Market,
  selectedAssetKeys: string[],
  type: 'collateral' | 'loan',
) => {
  return selectedAssetKeys.find((combinedKey) =>
    combinedKey
      .split('|')
      .includes(
        `${(type === 'collateral'
          ? market.collateralAsset
          : market.loanAsset
        ).address.toLowerCase()}-${market.morphoBlue.chain.id}`,
      ),
  );
};

export function applyFilterAndSort(
  markets: Market[],
  sortColumn: SortColumn,
  sortDirection: number,
  selectedNetwork: SupportedNetworks | null,
  hideDust: boolean,
  hideUnknown: boolean,
  selectedCollaterals: string[],
  selectedLoanAssets: string[],
) {
  let newData = [...markets];

  if (selectedNetwork !== null) {
    newData = newData.filter((item) => item.morphoBlue.chain.id === selectedNetwork);
  }

  if (hideDust) {
    newData = newData
      .filter((item) => Number(item.state.supplyAssetsUsd) > 1000)
      .filter((item) => Number(item.state.borrowAssetsUsd) > 100);
  }

  if (hideUnknown) {
    newData = newData
      // Filter out any items which's collateral are not in the supported tokens list
      // Filter out any items which's loan are not in the supported tokens list
      .filter((item) => isWhitelisted(item.collateralAsset.address, item.morphoBlue.chain.id))
      .filter((item) => isWhitelisted(item.loanAsset.address, item.morphoBlue.chain.id));
  }

  if (selectedCollaterals.length > 0) {
    newData = newData.filter((item) => isSelectedAsset(item, selectedCollaterals, 'collateral'));
  }

  if (selectedLoanAssets.length > 0) {
    newData = newData.filter((item) => isSelectedAsset(item, selectedLoanAssets, 'loan'));
  }

  newData.sort((a, b) => {
    // eslint-disable-next-line  @typescript-eslint/no-unsafe-assignment
    const propertyA = getNestedProperty(a, sortProperties[sortColumn]);

    // eslint-disable-next-line  @typescript-eslint/no-unsafe-assignment
    const propertyB = getNestedProperty(b, sortProperties[sortColumn]);

    return propertyA > propertyB ? sortDirection : -sortDirection;
  });

  return newData;
}