summaryrefslogtreecommitdiff
path: root/apps/web/lib/hooks/use-prefetch-entry-details.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/lib/hooks/use-prefetch-entry-details.ts')
-rw-r--r--apps/web/lib/hooks/use-prefetch-entry-details.ts45
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])
+}