import { useState, useCallback, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { API_URL } from "../config/authConstants"; import { useAuthContext } from "../context/AuthContext"; import MenuIcon from "../components/icons/MenuIcon"; import Sidebar from "../components/Sidebar"; import ProfileAvatar from "../components/profile/ProfileAvatar"; import { ProfileModal } from "../components/profile"; import AuthModal from "../components/AuthModal"; import "../styles/reviews.css"; import { useTranslation } from 'react-i18next'; /* ── Star rating sub-component ── */ function StarRating({ value, onChange, size = 28, readOnly = false }) { const [hovered, setHovered] = useState(0); return (
{[1, 2, 3, 4, 5].map((star) => { const filled = star <= (hovered || value); return ( !readOnly && onChange(star)} onMouseEnter={() => !readOnly && setHovered(star)} onMouseLeave={() => !readOnly && setHovered(0)} > ); })}
); } /* ── Single review card ── */ function ReviewCard({ review }) { const { t } = useTranslation(); const date = review.createdAt ? new Date(review.createdAt).toLocaleDateString("ru-RU", { day: "numeric", month: "long", year: "numeric", }) : ""; return (
{review.authorName ? review.authorName.charAt(0).toUpperCase() : "?"}
{review.authorName || t('reviews.anonymous')} {date && {date}}
{review.rating}/5
{review.text &&

{review.text}

}
); } /* ── Review form ── */ function ReviewForm({ onSubmit, submitting }) { const { t } = useTranslation(); const [rating, setRating] = useState(0); const [text, setText] = useState(""); const [error, setError] = useState(""); const handleSubmit = (e) => { e.preventDefault(); if (rating === 0) { setError(t('reviews.ratePrompt')); return; } setError(""); onSubmit({ rating, text: text.trim() }); setRating(0); setText(""); }; return (

{t('reviews.leaveReview')}

{t('reviews.rating')}
{error &&
{error}
}