"use client"; import { useQuery } from "@tanstack/react-query"; import { api } from "@/lib/api"; import { useAuthContext } from "@/context/auth-context"; import type { MediaFilter } from "@/lib/types"; const STALE = 10 * 60 * 1000; // 10 min — library metadata rarely changes in a session /** List top-level collections (Jellyfin libraries, Plex sections, etc.) */ export function useCollections() { const { token } = useAuthContext(); return useQuery({ queryKey: ["library", "collections"], queryFn: () => api.library.collections(token!), enabled: !!token, staleTime: STALE, }); } /** * List TV series, optionally scoped to a collection. * All series are loaded upfront so the series picker can filter client-side * without a request per keystroke. */ export function useSeries(collectionId?: string) { const { token } = useAuthContext(); return useQuery({ queryKey: ["library", "series", collectionId ?? null], queryFn: () => api.library.series(token!, collectionId), enabled: !!token, staleTime: STALE, }); } /** List available genres, optionally scoped to a content type. */ export function useGenres(contentType?: string) { const { token } = useAuthContext(); return useQuery({ queryKey: ["library", "genres", contentType ?? null], queryFn: () => api.library.genres(token!, contentType), enabled: !!token, staleTime: STALE, }); } /** * Fetch items matching a filter for the block editor's "Preview results" panel. * Pass `enabled: false` until the user explicitly requests a preview. */ export function useLibraryItems( filter: Pick | null, enabled: boolean, strategy?: string, ) { const { token } = useAuthContext(); return useQuery({ queryKey: ["library", "items", filter, strategy ?? null], queryFn: () => api.library.items(token!, filter!, 30, strategy), enabled: !!token && enabled && !!filter, staleTime: 2 * 60 * 1000, }); }