import { useQuery } from "@tanstack/react-query"; import { fetchPair, fetchBasket, type PairData } from "@/lib/dexscreener"; import type { MarketMeta } from "@/lib/contracts"; async function fetchMarket(meta: MarketMeta): Promise { if (meta.dexscreenerQuery.startsWith("basket:")) { return fetchBasket(meta.dexscreenerQuery.slice("basket:".length).split(",")); } return fetchPair(meta.dexscreenerQuery); } /** Live price / volume / liquidity for one market, refreshed every 30s. */ export function useMarketData(meta: MarketMeta) { return useQuery({ queryKey: ["dexscreener", meta.dexscreenerQuery], queryFn: () => fetchMarket(meta), refetchInterval: 30_000, staleTime: 25_000, }); } export function useAllMarketData(markets: MarketMeta[]) { return useQuery({ queryKey: ["dexscreener-all", markets.map((m) => m.dexscreenerQuery).join()], queryFn: async () => { const results = await Promise.all( markets.map((m) => fetchMarket(m).catch(() => null)), ); return Object.fromEntries( markets.map((m, i) => [m.symbol, results[i]]), ) as Record; }, refetchInterval: 30_000, staleTime: 25_000, }); }