import { useState, useEffect } from 'react'; import { Header } from '@/components/layout/Header'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Badge } from '@/components/ui/badge'; import { Filter, SlidersHorizontal, Zap, Clock, Star } from 'lucide-react'; import { AutocompleteSearch } from '@/components/search/AutocompleteSearch'; import { Ride } from '@/types/database'; import { supabase } from '@/integrations/supabase/client'; import { useNavigate } from 'react-router-dom'; export default function Rides() { const [rides, setRides] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [sortBy, setSortBy] = useState('name'); const [filterCategory, setFilterCategory] = useState('all'); const [filterStatus, setFilterStatus] = useState('all'); const navigate = useNavigate(); useEffect(() => { fetchRides(); }, [sortBy, filterCategory, filterStatus]); const fetchRides = async () => { try { let query = supabase .from('rides') .select(` *, park:parks!inner(name, slug, location:locations(*)), manufacturer:companies!rides_manufacturer_id_fkey(*) `); // Apply filters if (filterCategory !== 'all') { query = query.eq('category', filterCategory); } if (filterStatus !== 'all') { query = query.eq('status', filterStatus); } // Apply sorting switch (sortBy) { case 'rating': query = query.order('average_rating', { ascending: false }); break; case 'speed': query = query.order('max_speed_kmh', { ascending: false, nullsFirst: false }); break; case 'height': query = query.order('max_height_meters', { ascending: false, nullsFirst: false }); break; case 'reviews': query = query.order('review_count', { ascending: false }); break; default: query = query.order('name'); } const { data } = await query; setRides(data || []); } catch (error) { console.error('Error fetching rides:', error); } finally { setLoading(false); } }; const filteredRides = rides.filter(ride => ride.name.toLowerCase().includes(searchQuery.toLowerCase()) || ride.park?.name?.toLowerCase().includes(searchQuery.toLowerCase()) || ride.manufacturer?.name?.toLowerCase().includes(searchQuery.toLowerCase()) ); const getRideIcon = (category: string) => { switch (category) { case 'roller_coaster': return '🎢'; case 'water_ride': return '🌊'; case 'dark_ride': return '🎭'; case 'flat_ride': return '🎡'; case 'kiddie_ride': return '🎠'; case 'transportation': return '🚂'; default: return '🎢'; } }; const getStatusColor = (status: string) => { switch (status) { case 'operating': return 'bg-green-500/20 text-green-400 border-green-500/30'; case 'seasonal': return 'bg-yellow-500/20 text-yellow-400 border-yellow-500/30'; case 'under_construction': return 'bg-blue-500/20 text-blue-400 border-blue-500/30'; default: return 'bg-red-500/20 text-red-400 border-red-500/30'; } }; const formatCategory = (category: string) => { return category.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1) ).join(' '); }; const categories = [ { value: 'all', label: 'All Categories' }, { value: 'roller_coaster', label: 'Roller Coasters' }, { value: 'flat_ride', label: 'Flat Rides' }, { value: 'water_ride', label: 'Water Rides' }, { value: 'dark_ride', label: 'Dark Rides' }, { value: 'kiddie_ride', label: 'Kiddie Rides' }, { value: 'transportation', label: 'Transportation' } ]; const statusOptions = [ { value: 'all', label: 'All Status' }, { value: 'operating', label: 'Operating' }, { value: 'seasonal', label: 'Seasonal' }, { value: 'under_construction', label: 'Under Construction' }, { value: 'closed', label: 'Closed' } ]; if (loading) { return (
{[...Array(8)].map((_, i) => (
))}
); } return (
{/* Page Header */}
🎢

Rides & Attractions

Explore amazing rides and attractions from theme parks worldwide

{filteredRides.length} rides found {rides.filter(r => r.category === 'roller_coaster').length} roller coasters
{/* Search and Filters */}
setSearchQuery(query)} showRecentSearches={false} />
{/* Rides Grid */} {filteredRides.length > 0 ? (
{filteredRides.map((ride) => (
{/* Image/Icon Section */}
{ride.image_url ? ( {ride.name} ) : (
{getRideIcon(ride.category)}
)} {/* Gradient Overlay */}
{/* Status Badge */} {ride.status.replace('_', ' ').toUpperCase()}
{/* Header */}

{ride.name}

{getRideIcon(ride.category)}
{ride.park?.name && (

at {ride.park.name}

)}
{/* Description */} {ride.description && (

{ride.description}

)} {/* Category Badge */} {formatCategory(ride.category)} {/* Stats */}
{ride.max_speed_kmh && (
{ride.max_speed_kmh}km/h
)} {ride.max_height_meters && (
{ride.max_height_meters}m
)} {ride.duration_seconds && (
{Math.floor(ride.duration_seconds / 60)}min
)}
{ride.average_rating > 0 && (
{ride.average_rating.toFixed(1)}
)}
{/* Action Button */}
))}
) : (
🎢

No rides found

Try adjusting your search criteria or filters

)}
); }