'use client' import { useCallback, useEffect, useState } from 'react' import Button from '@/components/formElements/Button' import AdminState from '@/components/feedback/AdminState' import ReviewCard from '@/components/reviews/ReviewCard' import StatusChip from '@/components/ui/StatusChip' import { getReviewStatus } from '@/constants/status' import { EVENT_REVIEWS_PAGE_SIZE, LIST_ADMIN_EVENT_REVIEWS_PAGE, type AdminEventReview, } from '@/services/reviews' import { texts } from '@/texts' interface EventReviewsPanelProps { eventId: string } const authorDisplayName = (review: AdminEventReview) => { const name = [review.user?.firstName, review.user?.lastName].filter(Boolean).join(' ').trim() return name || texts.events.guest } /** Read-only admin reviews for one event (includes hidden/deleted). */ const EventReviewsPanel = ({ eventId }: EventReviewsPanelProps) => { const [reviews, setReviews] = useState([]) const [isLoading, setIsLoading] = useState(true) const [isLoadingMore, setIsLoadingMore] = useState(false) const [page, setPage] = useState(1) const [totalItems, setTotalItems] = useState(0) const fetchPage = useCallback( async (nextPage: number, options?: { errorMode: 'silent' }) => LIST_ADMIN_EVENT_REVIEWS_PAGE(eventId, nextPage, EVENT_REVIEWS_PAGE_SIZE, options), [eventId] ) const load = useCallback(async () => { setIsLoading(true) const result = await fetchPage(1) if (result.ok) { setReviews(result.data.items) setTotalItems(result.data.totalItemsCount) setPage(1) } setIsLoading(false) }, [fetchPage]) const loadMore = async () => { if (isLoadingMore || reviews.length >= totalItems) return setIsLoadingMore(true) const nextPage = page + 1 const result = await fetchPage(nextPage, { 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) } useEffect(() => { void load() }, [load]) if (isLoading) { return

{texts.reviews.loading}

} if (reviews.length === 0) { return (
) } return (
} hostReplyBody={review.hostReplyBody} rating={review.rating} tone="organizer" /> ) })} {reviews.length < totalItems ? (
) : null} ) } export default EventReviewsPanel