/** * useNavContext * * Provides prev/next artwork IDs scoped to the same author via API. */ import { useCallback } from 'react'; // Module-level cache for API calls const fallbackCache = new Map(); async function fetchFallback(artworkId) { const key = String(artworkId); if (fallbackCache.has(key)) return fallbackCache.get(key); try { const res = await fetch(`/api/artworks/navigation/${artworkId}`, { headers: { Accept: 'application/json' }, }); if (!res.ok) return { prevId: null, nextId: null, prevUrl: null, nextUrl: null }; const data = await res.json(); const result = { prevId: data.prev_id ?? null, nextId: data.next_id ?? null, prevUrl: data.prev_url ?? null, nextUrl: data.next_url ?? null, }; fallbackCache.set(key, result); return result; } catch { return { prevId: null, nextId: null, prevUrl: null, nextUrl: null }; } } export function useNavContext(currentArtworkId) { /** * Always resolve via API to guarantee same-user navigation. */ const getNeighbors = useCallback(async () => { return fetchFallback(currentArtworkId); }, [currentArtworkId]); return { getNeighbors }; }