@smartinvoicexyz/hooks
Version:
Unified source for React hooks used across the Smart Invoice protocol.
44 lines (43 loc) • 1.66 kB
JavaScript
import { NETWORK_CONFIG, SUPPORTED_CHAIN_IDS, } from '@smartinvoicexyz/constants';
import { getSubgraphStatus } from '@smartinvoicexyz/graphql';
import { publicClients } from '@smartinvoicexyz/utils';
import useSWR from 'swr';
const SUBGRAPH_STATUS_UPDATE_INTERVAL = 10000;
const getLatestBlockNumber = async (chainId) => {
const publicClient = publicClients[chainId];
if (!publicClient)
return 0;
const blockNumber = await publicClient.getBlockNumber();
return Number(blockNumber);
};
const getSubgraphHealth = async (chainId) => {
const [status, latestBlockNumber] = await Promise.all([
getSubgraphStatus(chainId),
getLatestBlockNumber(chainId),
]);
const threshold = NETWORK_CONFIG[chainId].SUBGRAPH_HEALTH_THRESHOLD;
return {
hasIndexingErrors: status.hasIndexingErrors,
hasSynced: status.syncedBlockNumber >= latestBlockNumber - threshold,
};
};
// Create a SWR fetcher
const fetchHealths = async () => {
const statuses = await Promise.all(SUPPORTED_CHAIN_IDS.map(chainId => getSubgraphHealth(chainId)));
return statuses.reduce((acc, status, index) => {
acc[SUPPORTED_CHAIN_IDS[index]] = status;
return acc;
}, {});
};
export const useSubgraphHealth = () => {
const { data, error, isValidating, isLoading } = useSWR('subgraph-status', fetchHealths, {
refreshInterval: SUBGRAPH_STATUS_UPDATE_INTERVAL,
revalidateOnFocus: false,
dedupingInterval: SUBGRAPH_STATUS_UPDATE_INTERVAL / 2,
});
return {
health: data,
isLoading: (!data && isValidating) || isLoading,
error: error ?? null,
};
};