Skip to content

Commit 897c108

Browse files
committed
optimized post review process
1 parent 8c46789 commit 897c108

File tree

2 files changed

+27
-59
lines changed

2 files changed

+27
-59
lines changed

src/components/productPage/Reviews.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,22 @@ export default function Reviews({ id, reviewList }) {
1515

1616
const [ isEditorReadOnly, setIsEditorReadOnly ] = useState(false)
1717
const [ sameEmailError, setSameEmailError ] = useState(false)
18+
const [ reviews, setReviews ] = useState(reviewList)
1819

1920
const formik = useFormik({
2021
initialValues: { name: '', email: '', message: '' },
2122
onSubmit: async (values, { resetForm }) => {
2223

2324
setIsEditorReadOnly(true)
2425

26+
// fetch api route with attached data
2527
await fetch(`/api/postReview?productId=${id}&name=${values.name}&email=${values.email}&reviewText=${encodeURIComponent(values.message)}`)
2628
.then(res => {
29+
2730
if (res.status >= 400) {
2831
if (res.status === 400) {
2932

33+
// api will send status 400 if email is already present, then we trigger error
3034
setSameEmailError(res.statusText)
3135
const err = new Error(res.statustext)
3236
setIsEditorReadOnly(false)
@@ -36,7 +40,7 @@ export default function Reviews({ id, reviewList }) {
3640
} else if (res.status > 400) {
3741

3842
setSameEmailError(false)
39-
const err = new Error('Error')
43+
const err = new Error('Error in components/productPage/Reviews.js, formik onSubmit, fetch, .then statement, if (res.status > 400) condition')
4044
setIsEditorReadOnly(false)
4145

4246
throw err
@@ -45,13 +49,16 @@ export default function Reviews({ id, reviewList }) {
4549
return res.json()
4650
})
4751
.then(data => {
52+
4853
resetForm()
4954
setEditorState(EditorState.push(editorState, ContentState.createFromText('')))
5055

5156
setSameEmailError(false)
5257

53-
const publishedReview = data.data.createReview.data
58+
const publishedReview = data.data.createReview.data
59+
// for now we're pushing review obj into array with others, after page reload they will be fetched altogether
5460
reviewList.push(publishedReview)
61+
setReviews(reviewList)
5562

5663
setIsEditorReadOnly(false)
5764

@@ -65,13 +72,12 @@ export default function Reviews({ id, reviewList }) {
6572
email: Yup.string().min(6).max(50),
6673
message: Yup.string().min(1).max(100).required('Required')
6774
})
68-
})
69-
70-
const [ reviews, setReviews ] = useState(reviewList)
75+
})
7176

7277
const value = formik.values.message
7378

7479
const prepareDraft = value => {
80+
7581
const draft = htmlToDraft(value)
7682
const contentState = ContentState.createFromBlockArray(draft.contentBlocks)
7783
const editorState = EditorState.createWithContent(contentState)
@@ -84,6 +90,7 @@ export default function Reviews({ id, reviewList }) {
8490
const [ editorState, setEditorState ] = useState(value ? prepareDraft(value) : EditorState.createEmpty())
8591

8692
const onEditorStateChange = editorState => {
93+
8794
const forFormik = draftToHtml(
8895
convertToRaw(editorState.getCurrentContent())
8996
)

src/pages/api/postReview.js

Lines changed: 15 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,87 +19,48 @@ export default async (req, res) => {
1919
},
2020
body: JSON.stringify({
2121
query: `
22-
query Review($productId: String, $email: String) {
23-
reviews(filters: { and: [{ productId: { eq: $productId }}, { email: { eq: $email }}]}) {
22+
mutation postReview($productId: String, $name: String, $email: String, $reviewText: String) {
23+
createReview(data: { productId: $productId, name: $name, email: $email, reviewText: $reviewText }) {
2424
data {
25+
id
2526
attributes {
2627
productId
28+
name
2729
email
30+
reviewText
31+
createdAt
2832
}
2933
}
3034
}
3135
}
3236
`,
3337
variables: {
3438
productId: productId,
35-
email: email
39+
name: name,
40+
email: email,
41+
reviewText: reviewText
3642
}
3743
})
3844
})
3945
.then(r => {
4046
if (r.status >= 400) {
4147
return r.json().then(errResData => {
42-
const err = new Error('Error')
48+
const err = new Error('Error in api/postReview.js, when mutating query to post review, if (r.status >= 400) condition')
4349
err.data = errResData
4450
throw err
4551
})
4652
}
4753
return r.json()
4854
})
49-
.then(async data => {
50-
const isEmailAlreadyPersent = data.data.reviews.data.length !== 0
55+
.then(data => {
5156

52-
if (isEmailAlreadyPersent) {
57+
// Strapi will attach errors obj to data in case such email is already present
58+
if (data.errors) {
5359
res.statusMessage = 'The review with such email has already been published. Please, choose another email.'
5460
res.status(400).end()
5561
} else {
56-
await fetch(`${
57-
process.env.NODE_ENV === "production"
58-
? process.env.PROD_CMS_URL
59-
: process.env.DEV_CMS_URL
60-
}/graphql`, {
61-
method: 'POST',
62-
headers: {
63-
'Content-Type': 'application/json',
64-
},
65-
body: JSON.stringify({
66-
query: `
67-
mutation postReview($productId: String, $name: String, $email: String, $reviewText: String) {
68-
createReview(data: { productId: $productId, name: $name, email: $email, reviewText: $reviewText }) {
69-
data {
70-
id
71-
attributes {
72-
productId
73-
name
74-
email
75-
reviewText
76-
createdAt
77-
}
78-
}
79-
}
80-
}
81-
`,
82-
variables: {
83-
productId: productId,
84-
name: name,
85-
email: email,
86-
reviewText: reviewText
87-
}
88-
})
89-
})
90-
.then(r => {
91-
if (r.status >= 400) {
92-
return r.json().then(errResData => {
93-
const err = new Error('Error')
94-
err.data = errResData
95-
throw err
96-
})
97-
}
98-
return r.json()
99-
})
100-
.then(data => res.status(200).json(data))
101-
.catch(err => res.status(404).json({ message: `Error: ${err}` }))
62+
res.status(200).json(data)
10263
}
10364
})
104-
.catch(err => res.status(404).json({ message: `Error: ${err}` }))
65+
.catch(err => res.status(404).json({ message: `Error in api/postReview.js, nested .catch statement, err object: ${err}` }))
10566
}

0 commit comments

Comments
 (0)