'use client' import { useState } from 'react' import Link from 'next/link' import ConsumerState from '@/components/feedback/ConsumerState' import ReviewCard from '@/components/reviews/ReviewCard' import HeatIconFill from '@/components/icons/HeatIconFill' import { SEO_ROUTES } from '@/constants/routes' import Button from '@/components/formElements/Button' import { LIST_ORGANIZER_REVIEWS_PAGE, ORGANIZER_REVIEWS_PAGE_SIZE, type OrganizerReview } from '@/services/reviews' import { texts, format } from '@/texts' interface OrganizerReviewsSectionProps { organizerId: string avgRating?: number | null reviewsCount?: number initialReviews?: OrganizerReview[] } const OrganizerReviewsSection = ({ organizerId, avgRating, reviewsCount = 0, initialReviews = [] }: OrganizerReviewsSectionProps) => { const [reviews, setReviews] = useState(initialReviews) const [page, setPage] = useState(1) const [isLoadingMore, setIsLoadingMore] = useState(false) const hasMore = reviews.length < reviewsCount const loadMore = async () => { if (!hasMore || isLoadingMore) return setIsLoadingMore(true) const nextPage = page + 1 const result = await LIST_ORGANIZER_REVIEWS_PAGE(organizerId, nextPage, ORGANIZER_REVIEWS_PAGE_SIZE, { errorMode: 'silent' }) if (result.ok) { setReviews((current) => { const seen = new Set(current.map((review) => review.id)) return [...current, ...result.data.items.filter((review) => !seen.has(review.id))] }) setPage(nextPage) } setIsLoadingMore(false) } return (

{texts.reviews.guestReviewsTitle}

{reviewsCount && reviewsCount > 0 && avgRating != null ? (
{avgRating.toLocaleString('fa-IR', { maximumFractionDigits: 1 })} {format(texts.events.reviewCountParen, { count: reviewsCount.toLocaleString('fa-IR') })}
) : (

{texts.reviews.organizerEmptyHint}

)}
{reviews.length === 0 ? ( ) : ( <>
    {reviews.map((review) => ( {review.eventTitle} } hostReplyBody={review.hostReplyBody} rating={review.rating} tone="organizer" /> ))}
{hasMore ? (
) : null} )}
) } export default OrganizerReviewsSection