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

import { useCallback, useEffect, useRef, useState } from 'react';
import { LITIUM_STAKE_CONTRACT } from 'src/constants/mining';
import { useQueryClient as useCyberQueryClient } from 'src/contexts/queryClient';
import type { StakeInfoResponse } from 'src/generated/lithium/LitiumStake.types';

const POLL_INTERVAL = 15_000;

function useStakeInfo(address: string | undefined) {
  const queryClient = useCyberQueryClient();
  const [stakeInfo, setStakeInfo] = useState<StakeInfoResponse | undefined>();
  const [loading, setLoading] = useState(false);
  const [counter, setCounter] = useState(0);
  const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);

  // Store latest fetch function in a ref to avoid interval churn
  const fetchRef = useRef<() => void>(() => {});

  const fetchStakeInfo = useCallback(async () => {
    if (!queryClient || !address) {
      setStakeInfo(undefined);
      return;
    }
    setLoading(true);
    try {
      const data = await queryClient.queryContractSmart(
        LITIUM_STAKE_CONTRACT,
        { stake_info: { address } }
      );
      setStakeInfo(data as StakeInfoResponse);
    } catch {
      // contract may not have entry for this address yet
      setStakeInfo(undefined);
    } finally {
      setLoading(false);
    }
  }, [queryClient, address]);

  fetchRef.current = fetchStakeInfo;

  useEffect(() => {
    fetchStakeInfo();
  }, [fetchStakeInfo, counter]);

  // Periodic polling disabled โ€” manual refetch via refetch() callback
  void intervalRef;

  const refetch = useCallback(() => {
    setCounter((c) => c + 1);
  }, []);

  return {
    stakeInfo,
    loading,
    refetch,
  };
}

export default useStakeInfo;

Neighbours