diff --git a/src/app/grid/page.tsx b/src/app/grid/page.tsx index f5d0679f..b9c8258c 100644 --- a/src/app/grid/page.tsx +++ b/src/app/grid/page.tsx @@ -36,11 +36,12 @@ export default async function GridPage() { ? - + {photos.length >= INFINITE_SCROLL_MULTIPLE_GRID && + } } contentSide={
0 ?
- + {photos.length >= INFINITE_SCROLL_MULTIPLE_HOME && + }
: ); diff --git a/src/photo/InfinitePhotoScroll.tsx b/src/photo/InfinitePhotoScroll.tsx index 437d0c4b..af9dcbc6 100644 --- a/src/photo/InfinitePhotoScroll.tsx +++ b/src/photo/InfinitePhotoScroll.tsx @@ -7,9 +7,9 @@ import { useCallback, useEffect, useMemo, useRef } from 'react'; import SiteGrid from '@/components/SiteGrid'; import Spinner from '@/components/Spinner'; import { getPhotosAction } from '@/photo/actions'; -import { useAppState } from '@/state/AppState'; import { Photo } from '.'; import PhotoGrid from './PhotoGrid'; +import { clsx } from 'clsx/lite'; export type RevalidatePhoto = ( photoId: string, @@ -32,9 +32,7 @@ export default function InfinitePhotoScroll({ }) { const key = type; - const { isUserSignedIn } = useAppState(); - - const buttonRef = useRef(null); + const buttonContainerRef = useRef(null); const fetcher = useCallback(([_key, size]: [string, number]) => getPhotosAction( @@ -43,17 +41,13 @@ export default function InfinitePhotoScroll({ ) , [initialOffset, itemsPerPage]); - const { data, isLoading, error, mutate, size, setSize } = + const { data, isLoading, isValidating, error, mutate, size, setSize } = useSwrInfinite( (size: number, prev: []) => prev && prev.length === 0 ? null : [key, size], fetcher, - { - revalidateOnFocus: isUserSignedIn, - revalidateOnReconnect: isUserSignedIn, - revalidateFirstPage: isUserSignedIn, - }, + { revalidateFirstPage: false }, ); const isFinished = useMemo(() => @@ -61,25 +55,29 @@ export default function InfinitePhotoScroll({ , [data, itemsPerPage]); useEffect(() => { - if (prefetch) { - preload([key, size ?? 0 + 1], fetcher); + if (prefetch && !isFinished) { + preload([key, (size ?? 0) + 1], fetcher); } - }, [prefetch, key, size, fetcher]); + }, [prefetch, isFinished, key, size, fetcher]); - const advance = useCallback(() => setSize(size => size + 1), [setSize]); + const advance = useCallback(() => { + if (!isFinished) { + setSize(size => size + 1); + } + }, [isFinished, setSize]); useEffect(() => { // Only add observer if button is rendered - if (buttonRef.current) { + if (buttonContainerRef.current) { const observer = new IntersectionObserver(e => { - if (triggerOnView && e.some(e => e.isIntersecting)) { + if (triggerOnView && e[0].isIntersecting) { advance(); } }, { root: null, threshold: 0, }); - observer.observe(buttonRef.current); + observer.observe(buttonContainerRef.current); return () => observer.disconnect(); } }, [triggerOnView, advance]); @@ -98,18 +96,26 @@ export default function InfinitePhotoScroll({ } as any), [data, mutate]); const renderMoreButton = () => - ; + +
; return (