"use client"; import React, { useState, useEffect, useCallback } from "react"; import { Star, MessageSquare, CheckCircle2, Reply, Loader2, ChevronLeft, ChevronRight, Send, User, ShieldCheck, } from "lucide-react"; import { toast } from "sonner"; import api from "../lib/services/api"; import { toPersian } from "../lib/utils"; interface ReviewItem { id: string; userName: string; rating: number; comment: string; adminReply?: string; createdAt: string; } interface ProductReviewsProps { productId: string; productName: string; } export default function ProductReviews({ productId, productName }: ProductReviewsProps) { const [reviews, setReviews] = useState([]); const [isLoading, setIsLoading] = useState(true); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [stats, setStats] = useState({ averageRating: 5, totalReviews: 0 }); // Submission Form State const [isSubmitting, setIsSubmitting] = useState(false); const [rating, setRating] = useState(5); const [hoverRating, setHoverRating] = useState(0); const [comment, setComment] = useState(""); const [userName, setUserName] = useState(""); const [userPhone, setUserPhone] = useState(""); const [formOpen, setFormOpen] = useState(false); const fetchReviews = useCallback(async () => { if (!productId) return; try { setIsLoading(true); const res = await api.get(`/products/${productId}/reviews?page=${page}&limit=5`); if (res.data?.success) { setReviews(res.data.data || []); setTotalPages(res.data.pagination?.totalPages || 1); if (res.data.stats) { setStats(res.data.stats); } } } catch (err: unknown) { console.error("Failed to fetch product reviews:", err); } finally { setIsLoading(false); } }, [productId, page]); useEffect(() => { fetchReviews(); }, [fetchReviews]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!comment.trim()) { toast.error("لطفاً متن نظر خود را وارد نمایید."); return; } try { setIsSubmitting(true); const res = await api.post(`/products/${productId}/reviews`, { rating, comment: comment.trim(), userName: userName.trim() || undefined, userPhone: userPhone.trim() || undefined, }); if (res.data?.success) { toast.success( res.data.message || "دیدگاه شما با موفقیت ثبت شد و پس از تایید کارشناسان منتشر خواهد شد." ); setComment(""); setFormOpen(false); } } catch (err: unknown) { console.error("Failed to submit review:", err); } finally { setIsSubmitting(false); } }; return (
{/* Header & Rating Summary */}

نظرات و تجربیات خریداران

دیدگاه‌های ثبت‌شده درباره اثرگذاری مکمل {productName}

{/* Rating Score Badge & Add Review Button */}
{Array.from({ length: 5 }).map((_, i) => ( ))}
{toPersian(stats.averageRating)} از ۵
({toPersian(stats.totalReviews)} دیدگاه)
{/* Submission Form (Accordion / Collapsible) */} {formOpen && (

ارسال نظر و امتیاز برای {productName}

نظر شما پس از تایید مدیریت نمایش داده می‌شود
{/* Star Rating Selector */}
{Array.from({ length: 5 }).map((_, i) => { const starVal = i + 1; const active = starVal <= (hoverRating || rating); return ( ); })} {toPersian(rating)} ستاره
{/* Name & Phone Inputs */}
setUserName(e.target.value)} placeholder="مثلاً علی محمدی" className="w-full px-4 py-2.5 bg-white border border-medical-gray-200 rounded-xl text-xs font-bold outline-none focus:ring-2 focus:ring-canina-blue/20" />
setUserPhone(e.target.value)} placeholder="0912..." className="w-full px-4 py-2.5 bg-white border border-medical-gray-200 rounded-xl text-xs font-bold outline-none focus:ring-2 focus:ring-canina-blue/20 font-mono" dir="ltr" />
{/* Comment Textarea */}