-
Notifications
You must be signed in to change notification settings - Fork 27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feat/feedback #164
Feat/feedback #164
Changes from all commits
ab28445
a4a0f32
cab8bd7
38b1e6f
a54aa28
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,6 @@ | |
"**/*.ts", | ||
"**/*.tsx", | ||
".next/types/**/*.ts" | ||
], | ||
, "app/molecules/page.tsx" ], | ||
"exclude": ["node_modules"] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
.container { | ||
display: flex; | ||
justify-content: center; | ||
align-items: center; | ||
min-height: 100vh; | ||
} | ||
|
||
.main { | ||
text-align: center; | ||
width: 100%; | ||
max-width: 600px; | ||
padding: 2rem; | ||
|
||
border-radius: 10px; | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,181 @@ | ||||||||||||||||||||||||||||||||||||||||||||
import React, { useState } from 'react'; | ||||||||||||||||||||||||||||||||||||||||||||
import { TextField, Button, Box, Typography, Rating } from '@mui/material'; | ||||||||||||||||||||||||||||||||||||||||||||
import { toast } from 'react-hot-toast'; | ||||||||||||||||||||||||||||||||||||||||||||
import { useColorPalates } from '@samagra-x/stencil-hooks'; | ||||||||||||||||||||||||||||||||||||||||||||
import { useUiConfig } from '@samagra-x/stencil-hooks'; | ||||||||||||||||||||||||||||||||||||||||||||
import styles from './index.module.css'; | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
type FeedbackStyles = { | ||||||||||||||||||||||||||||||||||||||||||||
heading?: object; | ||||||||||||||||||||||||||||||||||||||||||||
rating?: object; | ||||||||||||||||||||||||||||||||||||||||||||
review?: object; | ||||||||||||||||||||||||||||||||||||||||||||
submitButton?: object; | ||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
type FeedbackProps = { | ||||||||||||||||||||||||||||||||||||||||||||
showReviewBox?: boolean; | ||||||||||||||||||||||||||||||||||||||||||||
showRatingBox?: boolean; | ||||||||||||||||||||||||||||||||||||||||||||
star?: number | null; | ||||||||||||||||||||||||||||||||||||||||||||
review?: string; | ||||||||||||||||||||||||||||||||||||||||||||
onChangeReview?: (newReview: string) => void; | ||||||||||||||||||||||||||||||||||||||||||||
onChangeRating?: (newRating: number | null) => void; | ||||||||||||||||||||||||||||||||||||||||||||
handleFeedback?: () => void; | ||||||||||||||||||||||||||||||||||||||||||||
customStyles?: FeedbackStyles; | ||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
const Feedback: React.FC<FeedbackProps> = ({ | ||||||||||||||||||||||||||||||||||||||||||||
showReviewBox = false, | ||||||||||||||||||||||||||||||||||||||||||||
showRatingBox = false, | ||||||||||||||||||||||||||||||||||||||||||||
star = 0, | ||||||||||||||||||||||||||||||||||||||||||||
review = '', | ||||||||||||||||||||||||||||||||||||||||||||
onChangeReview = () => {}, | ||||||||||||||||||||||||||||||||||||||||||||
onChangeRating = () => {}, | ||||||||||||||||||||||||||||||||||||||||||||
handleFeedback = () => {}, | ||||||||||||||||||||||||||||||||||||||||||||
customStyles = {}, | ||||||||||||||||||||||||||||||||||||||||||||
}) => { | ||||||||||||||||||||||||||||||||||||||||||||
const theme = useColorPalates(); | ||||||||||||||||||||||||||||||||||||||||||||
const config = useUiConfig('component', 'feedback'); | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+36
to
+37
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Optimize usage of hooks. Consider memoizing the results of - const theme = useColorPalates();
- const config = useUiConfig('component', 'feedback');
+ const theme = React.useMemo(() => useColorPalates(), []);
+ const config = React.useMemo(() => useUiConfig('component', 'feedback'), []); Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
const [feedbackLoader, setFeedbackLoader] = useState(false); | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
const handleFeedbackClick = async () => { | ||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||
setFeedbackLoader(true); | ||||||||||||||||||||||||||||||||||||||||||||
await handleFeedback(); | ||||||||||||||||||||||||||||||||||||||||||||
setFeedbackLoader(false); | ||||||||||||||||||||||||||||||||||||||||||||
toast.success('Feedback submitted successfully'); | ||||||||||||||||||||||||||||||||||||||||||||
} catch (error) { | ||||||||||||||||||||||||||||||||||||||||||||
setFeedbackLoader(false); | ||||||||||||||||||||||||||||||||||||||||||||
toast.error('Error while submitting feedback'); | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+41
to
+50
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Improve error handling in feedback submission. Consider logging the error details for better debugging and user feedback. - toast.error('Error while submitting feedback');
+ console.error('Feedback submission error:', error);
+ toast.error('Error while submitting feedback. Please try again later.'); Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||
<div className={styles.container}> | ||||||||||||||||||||||||||||||||||||||||||||
<Box className={styles.main}> | ||||||||||||||||||||||||||||||||||||||||||||
<Box> | ||||||||||||||||||||||||||||||||||||||||||||
<Typography | ||||||||||||||||||||||||||||||||||||||||||||
data-testid="feedback-title" | ||||||||||||||||||||||||||||||||||||||||||||
sx={{ | ||||||||||||||||||||||||||||||||||||||||||||
fontSize: '5vh', | ||||||||||||||||||||||||||||||||||||||||||||
fontWeight: 'bold', | ||||||||||||||||||||||||||||||||||||||||||||
color: theme?.primary?.main, | ||||||||||||||||||||||||||||||||||||||||||||
...customStyles.heading, | ||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||
Feedback | ||||||||||||||||||||||||||||||||||||||||||||
</Typography> | ||||||||||||||||||||||||||||||||||||||||||||
</Box> | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
{showRatingBox && ( | ||||||||||||||||||||||||||||||||||||||||||||
<Box className="section"> | ||||||||||||||||||||||||||||||||||||||||||||
<Typography | ||||||||||||||||||||||||||||||||||||||||||||
data-testid="feedback-rating-title" | ||||||||||||||||||||||||||||||||||||||||||||
sx={{ | ||||||||||||||||||||||||||||||||||||||||||||
fontWeight: 'bold', | ||||||||||||||||||||||||||||||||||||||||||||
fontSize: '3vh', | ||||||||||||||||||||||||||||||||||||||||||||
...customStyles.rating, | ||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||
Rating | ||||||||||||||||||||||||||||||||||||||||||||
</Typography> | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
<Rating | ||||||||||||||||||||||||||||||||||||||||||||
data-testid="feedback-rating-component" | ||||||||||||||||||||||||||||||||||||||||||||
name="simple-controlled" | ||||||||||||||||||||||||||||||||||||||||||||
value={star} | ||||||||||||||||||||||||||||||||||||||||||||
max={config?.ratingMaxStars || 5} | ||||||||||||||||||||||||||||||||||||||||||||
onChange={(event, newValue) => onChangeRating(newValue)} | ||||||||||||||||||||||||||||||||||||||||||||
defaultValue={1} | ||||||||||||||||||||||||||||||||||||||||||||
sx={{ | ||||||||||||||||||||||||||||||||||||||||||||
fontSize: '6vh', | ||||||||||||||||||||||||||||||||||||||||||||
...customStyles.rating, | ||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||
<Typography | ||||||||||||||||||||||||||||||||||||||||||||
data-testid="feedback-rating-description" | ||||||||||||||||||||||||||||||||||||||||||||
sx={{ | ||||||||||||||||||||||||||||||||||||||||||||
textAlign: 'center', | ||||||||||||||||||||||||||||||||||||||||||||
fontSize: '2vh', | ||||||||||||||||||||||||||||||||||||||||||||
...customStyles.rating, | ||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||
Please provide a rating. | ||||||||||||||||||||||||||||||||||||||||||||
</Typography> | ||||||||||||||||||||||||||||||||||||||||||||
<Button | ||||||||||||||||||||||||||||||||||||||||||||
data-testid="feedback-rating-button" | ||||||||||||||||||||||||||||||||||||||||||||
variant="contained" | ||||||||||||||||||||||||||||||||||||||||||||
sx={{ | ||||||||||||||||||||||||||||||||||||||||||||
mt: 2, | ||||||||||||||||||||||||||||||||||||||||||||
backgroundColor: `${theme?.primary?.main}`, | ||||||||||||||||||||||||||||||||||||||||||||
fontWeight: 'bold', | ||||||||||||||||||||||||||||||||||||||||||||
borderRadius: '10rem', | ||||||||||||||||||||||||||||||||||||||||||||
fontSize: '1.5vh', | ||||||||||||||||||||||||||||||||||||||||||||
p: 1.5, | ||||||||||||||||||||||||||||||||||||||||||||
'&:hover': { | ||||||||||||||||||||||||||||||||||||||||||||
backgroundColor: `${theme?.primary?.dark}`, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
...customStyles.submitButton, | ||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||
onClick={handleFeedbackClick} | ||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||
Submit Review | ||||||||||||||||||||||||||||||||||||||||||||
</Button> | ||||||||||||||||||||||||||||||||||||||||||||
</Box> | ||||||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
{showReviewBox && ( | ||||||||||||||||||||||||||||||||||||||||||||
<Box className="section"> | ||||||||||||||||||||||||||||||||||||||||||||
<Typography | ||||||||||||||||||||||||||||||||||||||||||||
data-testid="feedback-review-title" | ||||||||||||||||||||||||||||||||||||||||||||
sx={{ | ||||||||||||||||||||||||||||||||||||||||||||
m: '1rem', | ||||||||||||||||||||||||||||||||||||||||||||
fontWeight: 'bold', | ||||||||||||||||||||||||||||||||||||||||||||
fontSize: '3vh', | ||||||||||||||||||||||||||||||||||||||||||||
...customStyles.review, | ||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||
Review | ||||||||||||||||||||||||||||||||||||||||||||
</Typography> | ||||||||||||||||||||||||||||||||||||||||||||
<TextField | ||||||||||||||||||||||||||||||||||||||||||||
data-testid="feedback-review-component" | ||||||||||||||||||||||||||||||||||||||||||||
placeholder="Write your review here" | ||||||||||||||||||||||||||||||||||||||||||||
value={review} | ||||||||||||||||||||||||||||||||||||||||||||
multiline | ||||||||||||||||||||||||||||||||||||||||||||
rows={4} | ||||||||||||||||||||||||||||||||||||||||||||
variant="outlined" | ||||||||||||||||||||||||||||||||||||||||||||
fullWidth | ||||||||||||||||||||||||||||||||||||||||||||
onChange={(e) => onChangeReview(e.target.value)} | ||||||||||||||||||||||||||||||||||||||||||||
sx={{ | ||||||||||||||||||||||||||||||||||||||||||||
border: `2px solid ${theme?.primary?.main}`, | ||||||||||||||||||||||||||||||||||||||||||||
...customStyles.review, | ||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||
<Button | ||||||||||||||||||||||||||||||||||||||||||||
id="reviewBtn" | ||||||||||||||||||||||||||||||||||||||||||||
variant="contained" | ||||||||||||||||||||||||||||||||||||||||||||
data-testid="feedback-review-button" | ||||||||||||||||||||||||||||||||||||||||||||
sx={{ | ||||||||||||||||||||||||||||||||||||||||||||
mt: 2, | ||||||||||||||||||||||||||||||||||||||||||||
backgroundColor: `${theme?.primary?.main}`, | ||||||||||||||||||||||||||||||||||||||||||||
fontWeight: 'bold', | ||||||||||||||||||||||||||||||||||||||||||||
borderRadius: '10rem', | ||||||||||||||||||||||||||||||||||||||||||||
fontSize: '1.5vh', | ||||||||||||||||||||||||||||||||||||||||||||
p: 1.5, | ||||||||||||||||||||||||||||||||||||||||||||
'&:hover': { | ||||||||||||||||||||||||||||||||||||||||||||
backgroundColor: `${theme?.primary?.dark}`, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
...customStyles.submitButton, | ||||||||||||||||||||||||||||||||||||||||||||
}} | ||||||||||||||||||||||||||||||||||||||||||||
onClick={handleFeedbackClick} | ||||||||||||||||||||||||||||||||||||||||||||
> | ||||||||||||||||||||||||||||||||||||||||||||
Submit Review | ||||||||||||||||||||||||||||||||||||||||||||
</Button> | ||||||||||||||||||||||||||||||||||||||||||||
</Box> | ||||||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||||||
</Box> | ||||||||||||||||||||||||||||||||||||||||||||
</div> | ||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
export default Feedback; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! Asynchronous function is correctly implemented.
The new asynchronous function
handleFeedback
correctly logs the feedback data. The comment indicates that the feedback submission logic is yet to be implemented.Do you want me to generate the feedback submission logic or open a GitHub issue to track this task?