Infinite scroll
yarn add react-infinite-scroll-hook// app/views/posts/index.js
import React from 'react'
- import {useContent} from '@thoughtbot/superglue'
+ import {useContent, NavigationContext} from '@thoughtbot/superglue'
import PostList from './PostList'
import Header from './Header'
+ import useInfiniteScroll from 'react-infinite-scroll-hook';
export default PostIndex = () => {
const {
posts,
header,
pathToNextPage,
pathToPrevPage
} = useContent()
+ const { remote, pageKey } = useContext(NavigationContext)
+ const { loading, setLoading } = useState(false)
+ const hasNextPage = !!pathToNextPage
+
+ const beforeSave = (prevPage, receivedPage) => {
+ const prevPosts = prevPage.data.posts
+ const receivedPosts = receivedPage.data.posts
+ receivedPage.data.posts = prevPosts + receivedPosts
+
+ return receivedPage
+ }
+
+ const loadMore = () => {
+ setLoading(true)
+ remote(pathToNextPage, {pageKey, beforeSave})
+ .then(() => setLoading(false))
+ }
+
+ const [sentryRef] = useInfiniteScroll({
+ loading,
+ hasNextPage,
+ onLoadMore: loadMore,
+ });
return (
<>
<Header {...header}/>
<div>
{
posts.list.map(({id, body}) => (
<p key={id}>{body}</p>
))
}
+ {(loading || hasNextPage) && (
+ <p ref={sentryRef}>
+ loading
+ </p>
+ )}
</div>
- {pathToPrevPage && <a href={pathToPrevPage} data-sg-visit>Prev Page</a>}
- {pathToNextPage && <a href={pathToNextPage} data-sg-visit>Next Page</a>}
</>
)
}
Last updated