UNPKG

@tanstack/react-query

Version:

Hooks for managing, caching and syncing asynchronous and remote data in React

55 lines (54 loc) 1.84 kB
"use client"; // src/HydrationBoundary.tsx import * as React from "react"; import { hydrate } from "@tanstack/query-core"; import { useQueryClient } from "./QueryClientProvider.js"; var HydrationBoundary = ({ children, options = {}, state, queryClient }) => { const client = useQueryClient(queryClient); const optionsRef = React.useRef(options); optionsRef.current = options; const hydrationQueue = React.useMemo(() => { if (state) { if (typeof state !== "object") { return; } const queryCache = client.getQueryCache(); const queries = state.queries || []; const newQueries = []; const existingQueries = []; for (const dehydratedQuery of queries) { const existingQuery = queryCache.get(dehydratedQuery.queryHash); if (!existingQuery) { newQueries.push(dehydratedQuery); } else { const hydrationIsNewer = dehydratedQuery.state.dataUpdatedAt > existingQuery.state.dataUpdatedAt || dehydratedQuery.promise && existingQuery.state.status !== "pending" && existingQuery.state.fetchStatus !== "fetching" && dehydratedQuery.dehydratedAt !== void 0 && dehydratedQuery.dehydratedAt > existingQuery.state.dataUpdatedAt; if (hydrationIsNewer) { existingQueries.push(dehydratedQuery); } } } if (newQueries.length > 0) { hydrate(client, { queries: newQueries }, optionsRef.current); } if (existingQueries.length > 0) { return existingQueries; } } return void 0; }, [client, state]); React.useEffect(() => { if (hydrationQueue) { hydrate(client, { queries: hydrationQueue }, optionsRef.current); } }, [client, hydrationQueue]); return children; }; export { HydrationBoundary }; //# sourceMappingURL=HydrationBoundary.js.map