Skip to content

Commit e040e3c

Browse files
committed
Add count of favorited reviews
1 parent 4451efb commit e040e3c

File tree

4 files changed

+64
-20
lines changed

4 files changed

+64
-20
lines changed

src/components/App.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ import Profile from './Profile'
1212
import withAuth from '../lib/withAuth'
1313
import Reviews from './Reviews'
1414

15-
const Book = () => (
15+
const Book = ({ user }) => (
1616
<div>
1717
<TableOfContents />
1818
<Switch>
19-
<Route exact path="/reviews" component={Reviews} />
19+
<Route exact path="/reviews" render={() => <Reviews user={user} />} />
2020
<Route component={Section} />
2121
</Switch>
2222
</div>
@@ -43,7 +43,7 @@ class App extends Component {
4343
path="/me"
4444
render={() => <Profile logout={logout} {...authProps} />}
4545
/>
46-
<Route component={Book} />
46+
<Route render={() => <Book user={this.props.user} />} />
4747
</Switch>
4848
</div>
4949
)

src/components/Review.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import StarIcon from 'material-ui-icons/Star'
1212
import StarBorderIcon from 'material-ui-icons/StarBorder'
1313
import distanceInWordsToNow from 'date-fns/distance_in_words_to_now'
1414
import times from 'lodash/times'
15+
import remove from 'lodash/remove'
1516
import gql from 'graphql-tag'
1617
import { graphql } from 'react-apollo'
1718

@@ -129,6 +130,16 @@ const FAVORITE_REVIEW_MUTATION = gql`
129130
}
130131
`
131132

133+
const READ_USER_FAVORITES = gql`
134+
query ReadUserFavorites {
135+
currentUser {
136+
favoriteReviews {
137+
id
138+
}
139+
}
140+
}
141+
`
142+
132143
const withFavoriteMutation = graphql(FAVORITE_REVIEW_MUTATION, {
133144
props: ({ mutate }) => ({
134145
favorite: (id, favorite) =>
@@ -140,6 +151,17 @@ const withFavoriteMutation = graphql(FAVORITE_REVIEW_MUTATION, {
140151
id,
141152
favorited: favorite
142153
}
154+
},
155+
update: store => {
156+
const data = store.readQuery({ query: READ_USER_FAVORITES })
157+
158+
if (favorite) {
159+
data.currentUser.favoriteReviews.push({ id, __typename: 'Review' })
160+
} else {
161+
remove(data.currentUser.favoriteReviews, { id })
162+
}
163+
164+
store.writeQuery({ query: READ_USER_FAVORITES, data })
143165
}
144166
})
145167
})

src/components/Reviews.js

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,48 @@ import React from 'react'
22
import PropTypes from 'prop-types'
33
import { graphql } from 'react-apollo'
44
import gql from 'graphql-tag'
5+
import get from 'lodash/get'
6+
import FavoriteIcon from 'material-ui-icons/Favorite'
57

68
import Review from './Review'
79

8-
const Reviews = ({ reviews, loading }) => (
9-
<main className="Reviews mui-fixed">
10-
<div className="Reviews-header-wrapper">
11-
<header className="Reviews-header">
12-
<h1>Reviews</h1>
13-
</header>
14-
</div>
15-
<div className="Reviews-content">
16-
{loading ? (
17-
<div className="Spinner" />
18-
) : (
19-
reviews.map(review => <Review key={review.id} review={review} />)
20-
)}
21-
</div>
22-
</main>
23-
)
10+
const Reviews = ({ reviews, loading, user }) => {
11+
const favoriteCount = get(user, 'favoriteReviews.length')
12+
13+
return (
14+
<main className="Reviews mui-fixed">
15+
<div className="Reviews-header-wrapper">
16+
<header className="Reviews-header">
17+
{favoriteCount ? (
18+
<div className="Reviews-favorite-count">
19+
<FavoriteIcon />
20+
{favoriteCount}
21+
</div>
22+
) : null}
23+
<h1>Reviews</h1>
24+
</header>
25+
</div>
26+
<div className="Reviews-content">
27+
{loading ? (
28+
<div className="Spinner" />
29+
) : (
30+
reviews.map(review => <Review key={review.id} review={review} />)
31+
)}
32+
</div>
33+
</main>
34+
)
35+
}
2436

2537
Reviews.propTypes = {
2638
reviews: PropTypes.arrayOf(PropTypes.object),
27-
loading: PropTypes.bool.isRequired
39+
loading: PropTypes.bool.isRequired,
40+
user: PropTypes.shape({
41+
favoriteReviews: PropTypes.arrayOf(
42+
PropTypes.shape({
43+
id: PropTypes.string.isRequired
44+
})
45+
)
46+
})
2847
}
2948

3049
const REVIEWS_QUERY = gql`

src/lib/withAuth.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ const USER_QUERY = gql`
3838
email
3939
photo
4040
hasPurchased
41+
favoriteReviews {
42+
id
43+
}
4144
}
4245
}
4346
`

0 commit comments

Comments
 (0)