From 08451cff132018cb4d7046716178a764f46b18be Mon Sep 17 00:00:00 2001 From: Sam Becker Date: Sat, 27 Apr 2024 12:16:23 -0500 Subject: [PATCH] Refactor infinite scroll --- src/app/grid/page.tsx | 2 +- src/components/SiteGrid.tsx | 22 +++++---- src/photo/InfinitePhotoScroll.tsx | 75 ++++++++----------------------- src/photo/PhotoGrid.tsx | 7 ++- src/photo/PhotoLarge.tsx | 21 +++++++++ src/photo/PhotoSmall.tsx | 23 ++++++++++ src/photo/PhotosLarge.tsx | 5 +++ 7 files changed, 89 insertions(+), 66 deletions(-) diff --git a/src/app/grid/page.tsx b/src/app/grid/page.tsx index b9c8258c..22b638ed 100644 --- a/src/app/grid/page.tsx +++ b/src/app/grid/page.tsx @@ -35,7 +35,7 @@ export default async function GridPage() { photos.length > 0 ? - + {photos.length >= INFINITE_SCROLL_MULTIPLE_GRID && className?: string contentMain: JSX.Element contentSide?: JSX.Element @@ -14,14 +17,17 @@ export default function SiteGrid({ sideHiddenOnMobile?: boolean }) { return ( -
+
- getPhotosAction( + const fetcher = useCallback(([_key, size]: [string, number]) => { + console.log('Fetching', size); + return getPhotosAction( initialOffset + size * itemsPerPage, itemsPerPage, - ) - , [initialOffset, itemsPerPage]); + ); + }, [initialOffset, itemsPerPage]); - const { data, isLoading, isValidating, error, mutate, size, setSize } = + const { data, isLoading, isValidating, error, mutate, setSize } = useSwrInfinite( keyGenerator, fetcher, { - revalidateFirstPage: Boolean(isUserSignedIn), - revalidateOnMount: Boolean(isUserSignedIn), + initialSize: 2, + revalidateFirstPage: false, revalidateOnFocus: Boolean(isUserSignedIn), revalidateOnReconnect: Boolean(isUserSignedIn), }, @@ -73,46 +68,11 @@ export default function InfinitePhotoScroll({ data && data[data.length - 1]?.length < itemsPerPage , [data, itemsPerPage]); - useEffect(() => { - if (prefetch && !isFinished) { - preload([key, (size ?? 0) + 1], fetcher); - } - }, [prefetch, isFinished, key, size, fetcher]); - const advance = useCallback(() => { if (!isFinished && !isLoadingOrValidating) { setSize(size => size + 1); } - }, [isFinished, setSize, isLoadingOrValidating]); - - useEffect(() => { - // Only add observer if button is rendered - if (buttonContainerRef.current) { - const observer = new IntersectionObserver(e => { - if (triggerOnView && e[0].isIntersecting) { - advance(); - } - }, { - root: null, - threshold: 0, - }); - observer.observe(buttonContainerRef.current); - return () => observer.disconnect(); - } - }, [triggerOnView, advance]); - - // Poll for button getting stuck - useEffect(() => { - if (triggerOnView && !isFinished && !isLoadingOrValidating) { - const interval = setInterval(() => { - const rect = buttonContainerRef.current?.getBoundingClientRect(); - if (rect && rect.top <= window.innerHeight) { - advance(); - } - }, 1000); - return () => clearInterval(interval); - } - }, [advance, isFinished, isLoadingOrValidating, triggerOnView]); + }, [isFinished, isLoadingOrValidating, setSize]); const photos = useMemo(() => (data ?? [])?.flat(), [data]); @@ -128,11 +88,7 @@ export default function InfinitePhotoScroll({ } as any), [data, mutate]); const renderMoreButton = () => -
+