diff --git a/src/app/(with-header)/wines/[id]/_components/NoReview.tsx b/src/app/(with-header)/wines/[id]/_components/NoReview.tsx index 4dadd36..441510b 100644 --- a/src/app/(with-header)/wines/[id]/_components/NoReview.tsx +++ b/src/app/(with-header)/wines/[id]/_components/NoReview.tsx @@ -1,7 +1,7 @@ import Image from 'next/image'; -import emptyReview from '@/assets/icons/empty_review.svg'; -import PostReviewModal from '@/components/modal/PostReviewModal'; import { AddReviewData } from '@/types/review-data'; +import PostReviewModal from '@/components/modal/PostReviewModal'; +import emptyReview from '@/assets/icons/empty_review.svg'; export default function NoReview({ addReview }: { addReview: (newReview: AddReviewData) => void }) { return ( diff --git a/src/app/(with-header)/wines/[id]/_components/ReviewAroma.tsx b/src/app/(with-header)/wines/[id]/_components/ReviewAroma.tsx index c2fa6fc..ce32da7 100644 --- a/src/app/(with-header)/wines/[id]/_components/ReviewAroma.tsx +++ b/src/app/(with-header)/wines/[id]/_components/ReviewAroma.tsx @@ -1,10 +1,10 @@ import Image from 'next/image'; import { aromaTraslations } from '@/constants/aromaTranslation'; -interface ReviewAromaProps { +type ReviewAromaProps = { selectedAroma: string[]; count: number; -} +}; export default function ReviewAroma({ selectedAroma, count }: ReviewAromaProps) { return ( diff --git a/src/app/(with-header)/wines/[id]/_components/ReviewContainer.tsx b/src/app/(with-header)/wines/[id]/_components/ReviewContainer.tsx index df6591e..f98df5c 100644 --- a/src/app/(with-header)/wines/[id]/_components/ReviewContainer.tsx +++ b/src/app/(with-header)/wines/[id]/_components/ReviewContainer.tsx @@ -32,15 +32,25 @@ function ReviewList({ } export default function ReviewContainer({ data }: { data: ReviewData }) { - const { reviews, avgRating } = data; - const [localReviews, setLocalReviews] = useState(reviews); + const [localReviews, setLocalReviews] = useState(data.reviews); + const [averageRating, setAverageRating] = useState(data.avgRating); + + const recalculateAverageRating = (reviews: ReviewData['reviews']) => (reviews.length ? reviews.reduce((sum, review) => sum + review.rating, 0) / reviews.length : 0); + + const updateReviews = (updater: (prev: ReviewData['reviews']) => ReviewData['reviews']) => { + setLocalReviews((prev) => { + const updatedReviews = updater(prev); + setAverageRating(recalculateAverageRating(updatedReviews)); + return updatedReviews; + }); + }; const deleteMyReview = (id: number) => { - setLocalReviews((prevReviews) => prevReviews.filter((review) => review.id !== id)); + updateReviews((prev) => prev.filter((review) => review.id !== id)); }; const editMyReview = (id: number, editReviewData: EditReviewData, updatedAt: string) => { - setLocalReviews((prevReviews) => prevReviews.map((review) => (review.id === id ? { ...review, ...editReviewData, updatedAt } : review))); + updateReviews((prev) => prev.map((review) => (review.id === id ? { ...review, ...editReviewData, updatedAt } : review))); }; const addReview = (newReview: AddReviewData) => { @@ -53,27 +63,28 @@ export default function ReviewContainer({ data }: { data: ReviewData }) { isLiked: false, }; - setLocalReviews((prevReviews) => [formattedReview, ...prevReviews]); + updateReviews((prev) => [formattedReview, ...prev]); }; - const averages = calculateTasteAverage(reviews); - const topThreeAromas = getTopThreeAromas(reviews); - const ratingPercentages = calculateRatingCount(reviews); + const averages = calculateTasteAverage(localReviews); + const topThreeAromas = getTopThreeAromas(localReviews); + const ratingPercentages = calculateRatingCount(localReviews); + return (
{wineData.name}
-