BlogClientPage.tsx
export interface BlogClientPageProps {
data: BlogPostProps
searchText: string
}
export default function BlogClientPage({
data,
searchText,
}: BlogClientPageProps) {
const [isPendingShowMore, startShowMoreTransition] = useTransition()
const [search, setSearch] = useState<string>(searchText || '')
const [blogData, setBlogData] = useState<BlogPostProps>(data)
const { push } = useRouter()
const currentPage = blogData.skip / PAGE_SIZE
const skip = currentPage * PAGE_SIZE
const showShowMoreButton = blogData.items.length < blogData.total
function onUpdatePage() {
setBlogData((prev) => ({
...prev,
skip: prev.skip + PAGE_SIZE,
}))
}
async function onLoadMorePosts() {
startShowMoreTransition(async () => {
onUpdatePage()
const response = await fetch(
`https://cdn.contentful.com/spaces/${spaceId}/environments/${environment}/entries?content_type=pageBlogPost&fields.title[match]=${search}&skip=${skip + PAGE_SIZE}&limit=${PAGE_SIZE}`,
{
headers: {
Authorization: `Bearer ${env.NEXT_PUBLIC_CONTENTFUL_API_KEY}`,
},
},
)
const data = await response.json()
console.log('data', data)
setBlogData((prev) => ({
...prev,
items: [...prev.items, ...data.items],
includes: {
Asset: [...prev.includes.Asset, ...data.includes.Asset],
Entry: [...prev.includes.Entry, ...data.includes.Entry],
},
}))
})
}
const onSearch = debounce(async () => {
push(`/blog?search=${search}`)
}, 500)
useEffect(() => {
onSearch()
return () => onSearch.cancel()
}, [search])
useEffect(() => {
setBlogData(data)
}, [data])
IF I use this:
useEffect(() => {
setBlogData(data)
}, [data])