Skip to content

Commit 63ebf0a

Browse files
committed
Add EDIT_REVIEW_MUTATION, AddReview -> ReviewForm
1 parent d1529cf commit 63ebf0a

File tree

3 files changed

+83
-17
lines changed

3 files changed

+83
-17
lines changed

src/components/Review.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ import Dialog, {
2424
DialogTitle
2525
} from 'material-ui/Dialog'
2626
import Button from 'material-ui/Button'
27+
import Modal from 'material-ui/Modal'
28+
29+
import ReviewForm from './ReviewForm'
2730

2831
import { REVIEW_ENTRY, REVIEWS_QUERY } from '../graphql/Review'
2932

@@ -37,7 +40,8 @@ const StarRating = ({ rating }) => (
3740
class Review extends Component {
3841
state = {
3942
anchorEl: null,
40-
deleteConfirmationOpen: false
43+
deleteConfirmationOpen: false,
44+
editing: false
4145
}
4246

4347
openMenu = event => {
@@ -50,6 +54,11 @@ class Review extends Component {
5054

5155
edit = () => {
5256
this.closeMenu()
57+
this.setState({ editing: true })
58+
}
59+
60+
doneEditing = () => {
61+
this.setState({ editing: false })
5362
}
5463

5564
openDeleteConfirmation = () => {
@@ -160,6 +169,10 @@ class Review extends Component {
160169
</Button>
161170
</DialogActions>
162171
</Dialog>
172+
173+
<Modal open={this.state.editing} onClose={this.doneEditing}>
174+
<ReviewForm done={this.doneEditing} review={this.props.review} />
175+
</Modal>
163176
</div>
164177
)
165178
}

src/components/AddReview.js renamed to src/components/ReviewForm.js

Lines changed: 67 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,27 @@ import TextField from 'material-ui/TextField'
66
import StarIcon from 'material-ui-icons/Star'
77
import StarBorderIcon from 'material-ui-icons/StarBorder'
88
import gql from 'graphql-tag'
9-
import { graphql } from 'react-apollo'
9+
import { graphql, compose } from 'react-apollo'
10+
import classNames from 'classnames'
1011

1112
import { validateReview } from '../lib/validators'
1213
import { REVIEWS_QUERY, REVIEW_ENTRY } from '../graphql/Review'
1314

1415
const GREY = '#0000008a'
1516

16-
class AddReview extends Component {
17-
state = {
18-
text: '',
19-
stars: null,
20-
errorText: null
17+
class ReviewForm extends Component {
18+
constructor(props) {
19+
super(props)
20+
21+
const { review } = props
22+
23+
this.isEditing = !!review
24+
25+
this.state = {
26+
text: review ? review.text : '',
27+
stars: review ? review.stars : null,
28+
errorText: null
29+
}
2130
}
2231

2332
updateText = event => {
@@ -38,15 +47,21 @@ class AddReview extends Component {
3847
return
3948
}
4049

41-
this.props.addReview(text, stars)
50+
const { review } = this.props
51+
52+
if (this.isEditing) {
53+
this.props.editReview(review.id, text, stars)
54+
} else {
55+
this.props.addReview(text, stars)
56+
}
4257

4358
this.props.done()
4459
}
4560

4661
render() {
4762
return (
4863
<form
49-
className="AddReview"
64+
className={classNames('ReviewForm', { editing: this.isEditing })}
5065
autoComplete="off"
5166
onSubmit={this.handleSubmit}
5267
>
@@ -83,22 +98,28 @@ class AddReview extends Component {
8398
</Button>
8499

85100
<Button type="submit" color="primary" className="AddReview-submit">
86-
Add review
101+
{this.isEditing ? 'Save' : 'Add review'}
87102
</Button>
88103
</div>
89104
</form>
90105
)
91106
}
92107
}
93108

94-
AddReview.propTypes = {
109+
ReviewForm.propTypes = {
95110
done: PropTypes.func.isRequired,
96111
user: PropTypes.shape({
97112
name: PropTypes.string.isRequired,
98113
photo: PropTypes.string.isRequired,
99114
username: PropTypes.string.isRequired
100-
}).isRequired,
101-
addReview: PropTypes.func.isRequired
115+
}),
116+
addReview: PropTypes.func.isRequired,
117+
editReview: PropTypes.func.isRequired,
118+
review: PropTypes.shape({
119+
id: PropTypes.string.isRequired,
120+
text: PropTypes.string,
121+
stars: PropTypes.number
122+
})
102123
}
103124

104125
const ADD_REVIEW_MUTATION = gql`
@@ -110,7 +131,7 @@ const ADD_REVIEW_MUTATION = gql`
110131
${REVIEW_ENTRY}
111132
`
112133

113-
const withMutation = graphql(ADD_REVIEW_MUTATION, {
134+
const withAddReview = graphql(ADD_REVIEW_MUTATION, {
114135
props: ({ ownProps: { user }, mutate }) => ({
115136
addReview: (text, stars) => {
116137
mutate({
@@ -145,4 +166,36 @@ const withMutation = graphql(ADD_REVIEW_MUTATION, {
145166
})
146167
})
147168

148-
export default withMutation(AddReview)
169+
const EDIT_REVIEW_MUTATION = gql`
170+
mutation EditReview($id: ObjID!, $input: UpdateReviewInput!) {
171+
updateReview(id: $id, input: $input) {
172+
id
173+
text
174+
stars
175+
}
176+
}
177+
`
178+
179+
const withEditReview = graphql(EDIT_REVIEW_MUTATION, {
180+
props: ({ mutate }) => ({
181+
editReview: (id, text, stars) => {
182+
mutate({
183+
variables: {
184+
id,
185+
input: { text, stars }
186+
},
187+
optimisticResponse: {
188+
updateReview: {
189+
__typename: 'Review',
190+
id,
191+
text,
192+
stars,
193+
favorite: true
194+
}
195+
}
196+
})
197+
}
198+
})
199+
})
200+
201+
export default compose(withAddReview, withEditReview)(ReviewForm)

src/components/Reviews.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Modal from 'material-ui/Modal'
99
import { propType } from 'graphql-anywhere'
1010

1111
import Review from './Review'
12-
import AddReview from './AddReview'
12+
import ReviewForm from './ReviewForm'
1313

1414
import { REVIEWS_QUERY, REVIEW_ENTRY } from '../graphql/Review'
1515

@@ -67,7 +67,7 @@ class Reviews extends Component {
6767
open={this.state.addingReview}
6868
onClose={this.doneAddingReview}
6969
>
70-
<AddReview done={this.doneAddingReview} user={user} />
70+
<ReviewForm done={this.doneAddingReview} user={user} />
7171
</Modal>
7272
</div>
7373
)}

0 commit comments

Comments
 (0)