diff options
Diffstat (limited to 'apps/web/lib/hooks/use-prefetch-entry-details.ts')
| -rw-r--r-- | apps/web/lib/hooks/use-prefetch-entry-details.ts | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/apps/web/lib/hooks/use-prefetch-entry-details.ts b/apps/web/lib/hooks/use-prefetch-entry-details.ts new file mode 100644 index 0000000..8b88bb8 --- /dev/null +++ b/apps/web/lib/hooks/use-prefetch-entry-details.ts @@ -0,0 +1,45 @@ +"use client" + +import { useEffect } from "react" +import { useQueryClient } from "@tanstack/react-query" +import { createSupabaseBrowserClient } from "@/lib/supabase/client" +import { queryKeys } from "@/lib/queries/query-keys" + +const PREFETCH_BATCH_SIZE = 10 + +export function usePrefetchEntryDetails(entryIdentifiers: string[]) { + const queryClient = useQueryClient() + + useEffect(() => { + if (entryIdentifiers.length === 0) return + + const supabaseClient = createSupabaseBrowserClient() + const identifiersToPrefetch = entryIdentifiers.slice(0, PREFETCH_BATCH_SIZE) + + for (const entryIdentifier of identifiersToPrefetch) { + const existingData = queryClient.getQueryData( + queryKeys.entryDetail.single(entryIdentifier) + ) + + if (existingData) continue + + queryClient.prefetchQuery({ + queryKey: queryKeys.entryDetail.single(entryIdentifier), + queryFn: async () => { + const { data, error } = await supabaseClient + .from("entries") + .select( + "id, title, url, author, content_html, summary, published_at, enclosure_url, feeds!inner(title)" + ) + .eq("id", entryIdentifier) + .single() + + if (error) throw error + + return data + }, + staleTime: 5 * 60 * 1000, + }) + } + }, [entryIdentifiers, queryClient]) +} |