import StarRoundedIcon from '@mui/icons-material/StarRounded' import Alert from '@mui/material/Alert' import Avatar from '@mui/material/Avatar' 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/product/api/reviews-api' import { OptimizedImage } from '@/shared/ui/OptimizedImage' import { RichTextMessageContent } from '@/shared/ui/RichTextMessageContent' function initials(display: string) { const s = display.trim() if (!s) return '?' return s.slice(0, 1).toUpperCase() } 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 && ( )} {initials(r.authorDisplay)} {r.authorDisplay} } emptyIcon={} /> {formatReviewDate(r.createdAt)} {r.productTitle} ) })} )} ) }