pussy-ts/src/services/ibc-history/useGetStatus.tsx

import { useEffect, useState } from 'react';
import { useIbcHistory } from './historyContext';
import { HistoriesItem, StatusTx } from './HistoriesItem';

function* toGenerator<R>(p: Promise<R>) {
  return (yield p) as R;
}

function useGetStatus(item: HistoriesItem) {
  const { traceHistoryStatus, updateStatusByTxHash } = useIbcHistory();

  const [status, setStatus] = useState(item.status);

  // eslint-disable-next-line react-hooks/exhaustive-deps
  function* tryUpdateHistoryStatus(item: HistoriesItem) {
    const status = yield* toGenerator(traceHistoryStatus(item));

    return status;
  }

  async function helper(
    func: Generator<Promise<StatusTx>, StatusTx, StatusTx>
  ): Promise<StatusTx> {
    const { value } = func.next();
    const output = await value;
    return output;
  }

  useEffect(() => {
    const getValue = async () => {
      const gen = await helper(tryUpdateHistoryStatus(item));

      updateStatusByTxHash(item.txHash, gen);

      setStatus(gen);

      if (gen === StatusTx.TIMEOUT) {
        getValue();
      }
    };
    getValue();
  }, [item, tryUpdateHistoryStatus, updateStatusByTxHash]);

  return status;
}

export default useGetStatus;

Synonyms

cyb/src/features/ibc-history/useGetStatus.tsx

Neighbours