import React, { useState, useEffect } from 'react'; import { Product, Reviews } from '../utils/types'; import Review from '../components/Review'; import axios from 'axios'; import '../ProductStyle.scss'; import ShareIcon from "../assets/icons/share-icon.svg"; import ReviewForm from '../components/ReviewForm'; import { Link, useParams } from 'react-router-dom'; export default function ProductPage() { const { id } = useParams(); // Получение id из URL-параметров // Состояние для продукта и рецензий const [product, setProduct] = useState(null); const [reviews, setReviews] = useState([]); // Состояние для среднего рейтинга и флага для отслеживания получения данных const [averageRating, setAverageRating] = useState(0); const [isDataFetched, setIsDataFetched] = useState(false); const totalReviews = reviews.length; // Количество рецензий const trimText = (text: string, limit: number): string => { // Функция для усечения текста return text.length > limit ? text.substring(0, limit) + '...' : text; }; const countReviewsByRate = (rate: number): number => { // Функция для подсчета рецензий по рейтингу return reviews.filter(review => review.rate === rate).length; }; const percentageOfRate = (rate: number): number => { // Функция для вычисления процента рецензий по рейтингу const count = countReviewsByRate(rate); return (count / totalReviews) * 100; }; useEffect(() => { // Получение продукта по его id const baseUrl = window.location.origin; // Получаем текущий домен сайта axios.get(`${baseUrl}/api/get/products`) .then(response => { const productData = response.data.products.find( (item: Product) => item.id.toString() === id ); setProduct(productData); }) .catch(error => { console.error('Ошибка при получении продукта:', error); }); }, [id]); useEffect(() => { // Получение рецензий по id продукта if (!isDataFetched) { const baseUrl = window.location.origin; axios.get(`${baseUrl}/api/get/reviews/${id}`) .then(response => { const reviewsData = response.data.review; setReviews(reviewsData); const totalRating = reviewsData.reduce((acc: number, review: Reviews) => acc + review.rate, 0); const average = totalRating / reviewsData.length; setAverageRating(reviewsData.length > 0 ? average : 0); setIsDataFetched(true); }) .catch(error => { console.error('Ошибка при получении рецензий:', error); }); } }, [id, isDataFetched]); if (!product) { // Отображение загрузки, если продукт не загружен return
Загрузка...
; } return (
Product

{product.title}

{trimText(product.description, 200)}

{product.price} ₽ Купить

Описание

{product.description}

    {product.tags.split('|').map((tag, index) => (
  • {tag}
  • ))}

Отзывы

{averageRating.toFixed(1)}
{/* Контейнер для отображения звезд, занимающий 100% ширины */}
{/* Отображение звезд, которые не должны быть закрашены */} {'★★★★★'.split('').map((star, i) => ( {star} ))} {/* Контейнер для отображения звезд, которые должны быть закрашены */}
{/* Отображение звезд, которые должны быть закрашены */} {'★★★★★'.split('').map((star, i) => ( {star} ))}
{[5, 4, 3, 2, 1].map(rate => (
{rate}
))}
{reviews.map(review => ( ))}
); }