import { useQuery, type QueryKey } from "@tanstack/react-query"; // Reusable "live" polling query: a thin wrapper over react-query that refetches on an // interval and — by leaving refetchIntervalInBackground at its default false — pauses while // the tab is unfocused, so it doesn't poll a server nobody's watching. This is the shared // live-progress mechanism: the Scheduler dashboard uses it now; the notification bell and the // future yt-dlp job queue reuse it rather than each re-implementing polling. export function useLiveQuery( key: QueryKey, queryFn: () => Promise, // intervalMs may be a function of the latest data, so the poll cadence can adapt to it // (e.g. poll faster while a job is running). react-query re-evaluates it after each fetch // against fresh data — the right place for this, vs. a React state toggle that can lag or // stall the live updates. opts: { intervalMs?: number | ((data: T | undefined) => number); enabled?: boolean } = {} ) { const { intervalMs = 4000, enabled = true } = opts; return useQuery({ queryKey: key, queryFn, enabled, refetchInterval: !enabled ? false : typeof intervalMs === "function" ? (query) => intervalMs(query.state.data as T | undefined) : intervalMs, refetchIntervalInBackground: false, staleTime: 0, }); }