Skip to content

Commit 0f2919e

Browse files
committed
Switch to after for pagination, add orderBy
1 parent 8f114ed commit 0f2919e

File tree

5 files changed

+46
-17
lines changed

5 files changed

+46
-17
lines changed

src/components/Review.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,13 +247,21 @@ const withDeleteMutation = graphql(DELETE_REVIEW_MUTATION, {
247247
update: store => {
248248
const query = {
249249
query: REVIEWS_QUERY,
250-
variables: { skip: 0, limit: 10 }
250+
variables: { limit: 10, orderBy: 'createdAt_DESC' }
251251
}
252252

253253
let data = store.readQuery(query)
254254
remove(data.reviews, { id })
255255
store.writeQuery({ ...query, data })
256256

257+
query.variables.orderBy = 'createdAt_ASC'
258+
259+
try {
260+
data = store.readQuery(query)
261+
remove(data.reviews, { id })
262+
store.writeQuery({ ...query, data })
263+
} catch (e) {}
264+
257265
data = store.readQuery({ query: READ_USER_FAVORITES })
258266
remove(data.currentUser.favoriteReviews, { id })
259267
store.writeQuery({ query: READ_USER_FAVORITES, data })

src/components/ReviewForm.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ const withAddReview = graphql(ADD_REVIEW_MUTATION, {
157157
update: (store, { data: { createReview: newReview } }) => {
158158
const query = {
159159
query: REVIEWS_QUERY,
160-
variables: { skip: 0, limit: 10 }
160+
variables: { limit: 10, orderBy: 'createdAt_DESC' }
161161
}
162162

163163
const data = store.readQuery(query)

src/components/ReviewList.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React, { Component } from 'react'
22
import PropTypes from 'prop-types'
33
import { graphql } from 'react-apollo'
44
import { propType } from 'graphql-anywhere'
5-
import find from 'lodash/find'
65

76
import Review from './Review'
87

@@ -51,33 +50,35 @@ class ReviewList extends Component {
5150

5251
ReviewList.propTypes = {
5352
reviews: PropTypes.arrayOf(propType(REVIEW_ENTRY)),
54-
user: PropTypes.object
53+
user: PropTypes.object,
54+
orderBy: PropTypes.string.isRequired
5555
}
5656

5757
const withReviews = graphql(REVIEWS_QUERY, {
58-
options: {
58+
options: ({ orderBy }) => ({
5959
errorPolicy: 'all',
60-
variables: { skip: 0, limit: 10 },
60+
variables: { limit: 10, orderBy },
6161
notifyOnNetworkStatusChange: true
62-
},
62+
}),
6363
props: ({ data: { reviews, fetchMore, networkStatus } }) => ({
6464
reviews,
6565
networkStatus,
6666
loadMoreReviews: () => {
67+
if (!reviews) {
68+
return
69+
}
70+
71+
const lastId = reviews[reviews.length - 1].id
6772
return fetchMore({
68-
variables: { skip: reviews.length - 5, limit: 15 },
73+
variables: { after: lastId },
6974
updateQuery: (previousResult, { fetchMoreResult }) => {
7075
if (!fetchMoreResult.reviews) {
7176
return previousResult
7277
}
7378

74-
const newReviews = fetchMoreResult.reviews.filter(
75-
({ id }) => !find(previousResult.reviews, { id })
76-
)
77-
7879
return {
7980
...previousResult,
80-
reviews: [...previousResult.reviews, ...newReviews]
81+
reviews: [...previousResult.reviews, ...fetchMoreResult.reviews]
8182
}
8283
}
8384
})

src/components/Reviews.js

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,21 @@ import FavoriteIcon from 'material-ui-icons/Favorite'
55
import Button from 'material-ui/Button'
66
import AddIcon from 'material-ui-icons/Add'
77
import Modal from 'material-ui/Modal'
8+
import { MenuItem } from 'material-ui/Menu'
9+
import { FormControl } from 'material-ui/Form'
10+
import Select from 'material-ui/Select'
811

912
import ReviewList from './ReviewList'
1013
import ReviewForm from './ReviewForm'
1114

1215
class Reviews extends Component {
1316
state = {
14-
addingReview: false
17+
addingReview: false,
18+
orderBy: 'createdAt_DESC'
19+
}
20+
21+
handleOrderByChange = event => {
22+
this.setState({ orderBy: event.target.value })
1523
}
1624

1725
addReview = () => {
@@ -36,11 +44,23 @@ class Reviews extends Component {
3644
{favoriteCount}
3745
</div>
3846
) : null}
47+
3948
<h1>Reviews</h1>
49+
50+
<FormControl>
51+
<Select
52+
value={this.state.orderBy}
53+
onChange={this.handleOrderByChange}
54+
displayEmpty
55+
>
56+
<MenuItem value="createdAt_DESC">Newest</MenuItem>
57+
<MenuItem value="createdAt_ASC">Oldest</MenuItem>
58+
</Select>
59+
</FormControl>
4060
</header>
4161
</div>
4262

43-
<ReviewList user={user} />
63+
<ReviewList user={user} orderBy={this.state.orderBy} />
4464

4565
{user && (
4666
<div>

src/graphql/Review.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ export const REVIEW_ENTRY = gql`
1717
`
1818

1919
export const REVIEWS_QUERY = gql`
20-
query ReviewsQuery($skip: Int, $limit: Int) {
21-
reviews(skip: $skip, limit: $limit) {
20+
query ReviewsQuery($after: ObjID, $limit: Int, $orderBy: ReviewOrderBy) {
21+
reviews(after: $after, limit: $limit, orderBy: $orderBy) {
2222
...ReviewEntry
2323
}
2424
}

0 commit comments

Comments
 (0)