import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { UserAvatar } from '@/components/ui/user-avatar'; import { Star, ThumbsUp, Calendar, MapPin } from 'lucide-react'; import { supabase } from '@/lib/supabaseClient'; import { ReportButton } from '@/components/moderation/ReportButton'; import { StarRating } from './StarRating'; import { getErrorMessage, handleNonCriticalError } from '@/lib/errorHandler'; interface ReviewWithProfile { id: string; user_id: string; park_id: string | null; ride_id: string | null; rating: number; title: string | null; content: string | null; visit_date: string | null; wait_time_minutes: number | null; helpful_votes: number; total_votes: number; moderation_status: string; created_at: string; updated_at: string; profiles?: { username: string; avatar_url: string | null; display_name: string | null; } | null; } interface ReviewsListProps { entityType: 'park' | 'ride'; entityId: string; entityName: string; } export function ReviewsList({ entityType, entityId, entityName }: ReviewsListProps) { const [reviews, setReviews] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { fetchReviews(); }, [entityType, entityId]); const fetchReviews = async () => { try { const query = supabase .from('reviews') .select(` *, profiles!reviews_user_id_fkey(username, avatar_url, display_name) `) .eq('moderation_status', 'approved') .order('created_at', { ascending: false }); if (entityType === 'park') { query.eq('park_id', entityId); } else { query.eq('ride_id', entityId); } const { data } = await query; setReviews((data || []) as ReviewWithProfile[]); } catch (error: unknown) { handleNonCriticalError(error, { action: 'Fetch reviews', metadata: { entityType, entityId } }); } finally { setLoading(false); } }; const renderStars = (rating: number) => { return ; }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); }; if (loading) { return (
{Array.from({ length: 3 }, (_, i) => (
))}
); } if (reviews.length === 0) { return (

No Reviews Yet

Be the first to share your experience with {entityName}!

); } return (

{reviews.length} Review{reviews.length !== 1 ? 's' : ''}

{reviews.map((review) => (
{review.profiles?.display_name || review.profiles?.username || 'Anonymous User'}
{formatDate(review.created_at)} {review.visit_date && ( <> Visited {formatDate(review.visit_date)} )}
{renderStars(review.rating)} {review.rating}
{review.title && (

{review.title}

)} {review.content && (

{review.content}

)}
{review.wait_time_minutes && (
Wait time: {review.wait_time_minutes} min
)}
{review.helpful_votes} helpful
))}
); }