'use client'; import React, { useState, useEffect } from 'react'; import StarRating from './StarRating'; import { apiClient } from '@/app/utils/apiClient'; import { toast } from 'react-hot-toast'; import './ProductReviews.scss'; interface User { id: number; name: string; lastname: string; profile_picture?: string; } interface ReviewMedia { id: number; media_type: string; media_data: string; } interface Review { id: number; rating: number; comment: string; createdAt: string; User: User; media?: ReviewMedia[]; } interface RatingSummary { average: number; total: number; distribution: { [key: number]: number; }; } interface ProductReviewsProps { productId: number; } const ProductReviews: React.FC = ({ productId }) => { const [reviews, setReviews] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [userRating, setUserRating] = useState(0); const [userComment, setUserComment] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [isLoggedIn, setIsLoggedIn] = useState(false); const [ratingSummary, setRatingSummary] = useState(null); useEffect(() => { fetchReviews(); checkLoginStatus(); }, [productId]); const checkLoginStatus = () => { const token = localStorage.getItem('accessToken') || sessionStorage.getItem('accessToken'); setIsLoggedIn(!!token); }; const fetchReviews = async () => { try { setLoading(true); setError(null); const response = await apiClient(`/reviews/products/${productId}/reviews`, { skipAuth: true }); if (response.success && response.data) { setReviews(response.data.reviews); setRatingSummary(response.data.ratingSummary); } else { setError('Failed to load reviews'); } } catch (err) { console.error('Error fetching reviews:', err); setError('An error occurred while loading reviews'); } finally { setLoading(false); } }; const handleRatingChange = (rating: number) => { setUserRating(rating); }; const handleSubmitReview = async (e: React.FormEvent) => { e.preventDefault(); if (!isLoggedIn) { toast.error('Please log in to submit a review'); return; } if (userRating === 0) { toast.error('Please select a rating'); return; } try { setIsSubmitting(true); const response = await apiClient(`/reviews/products/${productId}/reviews`, { method: 'POST', body: JSON.stringify({ rating: userRating, comment: userComment }) }); if (response.success) { toast.success('Review submitted successfully'); setUserRating(0); setUserComment(''); fetchReviews(); } else { toast.error(response.message || 'Failed to submit review'); } } catch (err: any) { console.error('Error submitting review:', err); toast.error(err.message || 'An error occurred while submitting your review'); } finally { setIsSubmitting(false); } }; const formatDate = (dateString: string) => { const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: 'long', day: 'numeric' }; return new Date(dateString).toLocaleDateString(undefined, options); }; return (

Customer Reviews

{ratingSummary && (
{ratingSummary.average} Based on {ratingSummary.total} reviews
)}

Write a Review

{isLoggedIn ? (