cyb/src/hooks/useAllDenomTraces.ts

import { useQuery } from '@tanstack/react-query';
import { QueryDenomTracesResponse } from 'cosmjs-types/ibc/applications/transfer/v1/query';
import { useEffect, useState } from 'react';
import { useQueryClient } from 'src/contexts/queryClient';
import { setDenomTraces } from 'src/redux/features/ibcDenom';
import { useAppDispatch, useAppSelector } from 'src/redux/hooks';
import { Option } from 'src/types';
import { IbcDenomsArr } from 'src/types/ibc';
import { getDenomHash } from 'src/utils/utils';

const keyQuery = 'allDenomTraces';

const mapDenomTraces = (denomTraces: QueryDenomTracesResponse['denomTraces']): IbcDenomsArr =>
  denomTraces.reduce((acc, value) => {
    const { path, baseDenom } = value;
    const ibcDenomHash = getDenomHash(path, baseDenom);

    const parts = path.split('/');
    const removetr = parts.filter((itemStr) => itemStr !== 'transfer');
    const sourceChannelId = removetr.join('/');

    return {
      ...acc,
      [ibcDenomHash]: {
        sourceChannelId,
        baseDenom,
        ibcDenom: ibcDenomHash,
      },
    };
  }, {});

function useAllDenomTraces() {
  const queryClient = useQueryClient();
  const dispatch = useAppDispatch();
  const { denomTraces: denomTracesLS } = useAppSelector((state) => state.ibcDenom);

  const [dataDenom, setDataDenom] = useState<Option<IbcDenomsArr>>(denomTracesLS);

  const { data } = useQuery(
    [keyQuery],
    () => {
      return queryClient?.allDenomTraces() as Option<QueryDenomTracesResponse>;
    },
    {
      enabled: Boolean(queryClient),
    }
  );

  useEffect(() => {
    if (!data) {
      return;
    }

    const ibcData = mapDenomTraces(data.denomTraces);

    if (Object.keys(ibcData).length > 0) {
      setDataDenom(ibcData);
      dispatch(setDenomTraces(ibcData));
    }
  }, [data, dispatch]);

  return dataDenom;
}

export default useAllDenomTraces;

Neighbours