Spaces:
Running
Running
"use client"; | |
import InfiniteScroll from "react-infinite-scroll-component"; | |
import Image from "next/image"; | |
import { useState } from "react"; | |
import { getLogos } from "@/app/_actions/logos"; | |
export const InfiniteGallery = ({ | |
logos: initialLogos, | |
hasMore: initialHasMore, | |
}: { | |
logos: Array<number>; | |
hasMore: boolean; | |
}) => { | |
const [page, setPage] = useState(0); | |
const [logos, setLogos] = useState([...initialLogos]); | |
const [hasMore, setHasMore] = useState(initialHasMore); | |
const fetchMoreData = async () => { | |
const newLogos = await getLogos(page + 1); | |
setLogos([...logos, ...newLogos.logos]); | |
setHasMore(newLogos.hasMore); | |
setPage(page + 1); | |
}; | |
return ( | |
<InfiniteScroll | |
scrollableTarget="content-wrapper" | |
dataLength={logos.length} //This is important field to render the next data | |
next={fetchMoreData} | |
hasMore={hasMore} | |
loader={ | |
<div className="w-full max-lg:col-span-2 text-center">Loading...</div> | |
} | |
className="max-lg:grid max-lg:grid-cols-2 lg:flex lg:items-start lg:justify-center gap-6 flex-wrap" | |
endMessage={ | |
<div className="w-full max-lg:col-span-2 text-zinc-400 text-center"> | |
Yay! You have seen it all | |
</div> | |
} | |
> | |
{logos.map((index) => ( | |
<Image | |
key={index} | |
src={`/api/images/${index}`} | |
alt="Generated logo" | |
width={500} | |
height={500} | |
className="rounded-2xl w-full lg:size-72 object-cover" | |
/> | |
))} | |
</InfiniteScroll> | |
); | |
}; | |