import { useState } from 'react'; import { useUserReviews } from '@/hooks/reviews/useUserReviews'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Star, Calendar, MapPin, Edit, Trash2, ThumbsUp } from 'lucide-react'; import { supabase } from '@/lib/supabaseClient'; import { StarRating } from '@/components/reviews/StarRating'; import { Button } from '@/components/ui/button'; import { Link } from 'react-router-dom'; import { toast } from 'sonner'; import { getErrorMessage } from '@/lib/errorHandler'; interface ReviewWithEntity { id: string; rating: number; title: string | null; content: string | null; visit_date: string | null; wait_time_minutes: number | null; helpful_votes: number; moderation_status: string; created_at: string; parks?: { id: string; name: string; slug: string; } | null; rides?: { id: string; name: string; slug: string; parks?: { name: string; slug: string; } | null; } | null; } interface UserReviewsListProps { userId: string; reviewCount: number; } export function UserReviewsList({ userId, reviewCount }: UserReviewsListProps) { const [filter, setFilter] = useState<'all' | 'parks' | 'rides'>('all'); const [sortBy, setSortBy] = useState<'date' | 'rating'>('date'); // Use cached user reviews hook const { data: reviews = [], isLoading: loading } = useUserReviews(userId, filter, sortBy); const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); }; const getStatusBadge = (status: string) => { switch (status) { case 'approved': return Approved; case 'pending': return Pending Review; case 'rejected': return Rejected; default: return null; } }; if (loading) { return (
{Array.from({ length: 3 }, (_, i) => (
))}
); } if (reviewCount === 0) { return (

No Reviews Yet

Start sharing your park and ride experiences

); } const stats = { total: reviews.length, parks: reviews.filter(r => r.parks).length, rides: reviews.filter(r => r.rides).length, avgRating: reviews.length > 0 ? (reviews.reduce((sum, r) => sum + r.rating, 0) / reviews.length).toFixed(1) : '0' }; return (
{/* Statistics */}
{stats.total}
Total Reviews
{stats.parks}
Park Reviews
{stats.rides}
Ride Reviews
{stats.avgRating}
Avg Rating
{/* Filters */}
{/* Reviews List */}
{reviews.map((review) => { const entityName = review.parks?.name || review.rides?.name || 'Unknown'; const entitySlug = review.parks?.slug || review.rides?.slug || ''; const entityType = review.parks ? 'park' : 'ride'; const entityPath = review.parks ? `/parks/${entitySlug}` : review.rides ? `/parks/${review.rides.parks?.slug}/rides/${entitySlug}` : '#'; return (
{/* Header */}
{entityName} {entityType === 'park' ? 'Park' : 'Ride'} {getStatusBadge(review.moderation_status)}
{review.rides?.parks && ( at {review.rides.parks.name} )}
{review.rating}
{/* Title */} {review.title && (

{review.title}

)} {/* Content */} {review.content && (

{review.content}

)} {/* Metadata */}
{formatDate(review.created_at)}
{review.visit_date && (
Visited {formatDate(review.visit_date)}
)} {review.wait_time_minutes && ( Wait: {review.wait_time_minutes} min )}
{review.helpful_votes} helpful
); })}
); }