import { QueryCache, QueryClient } from "@tanstack/react-query"; /** * Global query-error notifier. AlertContext registers its `error()` toast * here on mount; until then failures fall back to console.error. */ let queryErrorNotifier: ((msg: string) => void) | null = null; export function registerQueryErrorNotifier(fn: (msg: string) => void) { queryErrorNotifier = fn; } /** Rate limit: at most one query-error toast per window (a page can have many failing queries). */ const ERROR_TOAST_WINDOW_MS = 4000; let lastErrorToastAt = 0; export const queryClient = new QueryClient({ queryCache: new QueryCache({ onError: (error, query) => { // Pages with bespoke error handling (detail pages that toast + navigate, // purely-local queries like QR generation) opt out via query meta. if (query.meta?.suppressGlobalErrorToast) return; // Background refetch failure with stale data still on screen — stay silent. if (query.state.data !== undefined) return; // 401s are handled by apiFetch/AuthContext (token refresh / logout). if (error instanceof Error && error.message === "Unauthorized") return; const now = Date.now(); if (now - lastErrorToastAt < ERROR_TOAST_WINDOW_MS) return; lastErrorToastAt = now; if (queryErrorNotifier) { queryErrorNotifier("Nepodařilo se načíst data ze serveru"); } else { console.error("Query failed before alert notifier registered:", error); } }, }), defaultOptions: { queries: { staleTime: 30_000, gcTime: 5 * 60_000, refetchOnWindowFocus: true, retry: 1, refetchOnReconnect: true, }, }, });