cyb/src/pages/Mining/hooks/useLatestBlock.ts

import { useQuery } from '@tanstack/react-query';
import { RPC_URL } from 'src/constants/config';

type BlockInfo = {
  blockHash: string;
  dataHash: string;
  height: number;
  timestamp: number; // unix seconds from block header
};

async function fetchLatestBlock(): Promise<BlockInfo | undefined> {
  const url = `${RPC_URL}/block`;
  const res = await fetch(url);
  const json = await res.json();
  const result = json.result ?? json;

  const blockHash: string = result.block_id?.hash ?? '';
  const dataHash: string = result.block?.header?.data_hash ?? '';
  const height: number = Number(result.block?.header?.height ?? 0);
  const timeStr: string = result.block?.header?.time ?? '';
  const timestamp = timeStr
    ? Math.floor(new Date(timeStr).getTime() / 1000)
    : 0;

  if (blockHash && height > 0 && timestamp > 0) {
    return { blockHash, dataHash, height, timestamp };
  }
  return undefined;
}

function useLatestBlock() {
  const { data, refetch } = useQuery(['latestBlock'], fetchLatestBlock, {
    staleTime: Infinity,
    keepPreviousData: true,
  });

  return { block: data, refetchBlock: refetch };
}

export default useLatestBlock;

Neighbours