import StarRoundedIcon from '@mui/icons-material/StarRounded' import Alert from '@mui/material/Alert' import Box from '@mui/material/Box' import Paper from '@mui/material/Paper' import Rating from '@mui/material/Rating' import Skeleton from '@mui/material/Skeleton' import Stack from '@mui/material/Stack' import Typography from '@mui/material/Typography' import { useQuery } from '@tanstack/react-query' import { Link as RouterLink } from 'react-router-dom' import { fetchLatestApprovedReviews } from '@/entities/review/api/reviews-api' import { OptimizedImage } from '@/shared/ui/OptimizedImage' import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent.lazy' import { UserAvatar } from '@/shared/ui/UserAvatar' function formatReviewDate(iso: string): string { try { return new Date(iso).toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric' }) } catch { return '' } } export function ReviewsBlock() { const q = useQuery({ queryKey: ['reviews', 'latest', 5], queryFn: () => fetchLatestApprovedReviews(5), }) const items = !q.isLoading && !q.isError && q.data ? q.data.items : [] return ( Отзывы Последние отзывы о товарах {q.isLoading && ( {[1, 2, 3].map((i) => ( ))} )} {q.isError && Не удалось загрузить отзывы.} {!q.isLoading && !q.isError && q.data && items.length === 0 && ( Отзывов пока нет Будьте первым, кто оставит отзыв о наших товарах. Ваше мнение поможет другим покупателям сделать правильный выбор. )} {items.length > 0 && ( {items.map((r, i) => { const zebra = i % 2 === 0 const text = typeof r.text === 'string' && r.text.trim() ? r.text.trim() : 'Без комментария' return ( {r.imageUrl && ( )} {r.authorDisplay} } emptyIcon={} /> {formatReviewDate(r.createdAt)} {r.product.published ? ( {r.product.title} ) : ( {r.product.title} )} ) })} )} ) }