UNPKG

@smartinvoicexyz/hooks

Version:

Unified source for React hooks used across the Smart Invoice protocol.

44 lines (43 loc) 1.66 kB
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, }; };