cyb/src/features/staking/getHeroesHook.ts

import { Validator } from '@cybercongress/cyber-ts/cosmos/staking/v1beta1/staking';
import { useQueries } from '@tanstack/react-query';
import BigNumber from 'bignumber.js';
import { useCallback, useMemo } from 'react';
import { useCyberClient } from 'src/contexts/queryCyberClient';
import BondStatusKey from '../../pages/Sphere/types/bondStatus';

const sortFunc = (itemA: Validator, itemB: Validator) => {
  return new BigNumber(itemB.tokens).minus(new BigNumber(itemA.tokens)).toNumber();
};

function useGetHeroes() {
  const { rpc } = useCyberClient();

  const queries = useQueries({
    queries: Object.keys(BondStatusKey).map((status) => {
      return {
        queryKey: ['validators', status],
        queryFn: () =>
          rpc.cosmos.staking.v1beta1.validators({ status }).then((response) => {
            return response.validators.sort(sortFunc);
          }),
        enabled: Boolean(rpc),
      };
    }),
  });

  const loading = useMemo(() => queries.some((query) => query.isLoading), [queries]);
  const error = useMemo(() => queries.find((query) => !!query.error)?.error, [queries]);

  const data = useMemo(
    () =>
      queries
        .map((query) => query.data)
        .filter((data) => typeof data !== 'undefined')
        .flat(),
    [queries]
  );

  const active = useMemo(() => data.filter((item) => !item.jailed), [data]);
  const jailed = useMemo(() => data.filter((item) => item.jailed), [data]);

  const refetchAll = useCallback(() => {
    queries.forEach((result) => result.refetch());
  }, [queries]);

  return {
    validators: data,
    countHeroes: { active: active.length, jailed: jailed.length },
    loadingValidators: loading,
    error,
    refetchAll,
  };
}

export default useGetHeroes;

Neighbours