import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Star, ThumbsUp, Calendar, MapPin } from 'lucide-react'; import { supabase } from '@/integrations/supabase/client'; 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:user_id(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 any || []); } catch (error) { console.error('Error fetching reviews:', error); } finally { setLoading(false); } }; const renderStars = (rating: number) => { return Array.from({ length: 5 }, (_, i) => ( )); }; 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 || 'U').charAt(0).toUpperCase()}
{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.title && (

{review.title}

)} {review.content && (

{review.content}

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