import { useState, useEffect } from 'react'; import { Header } from '@/components/layout/Header'; import { ParkCard } from '@/components/parks/ParkCard'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Badge } from '@/components/ui/badge'; import { MapPin, Search, Filter, SlidersHorizontal } from 'lucide-react'; import { Park } from '@/types/database'; import { supabase } from '@/integrations/supabase/client'; import { useNavigate } from 'react-router-dom'; export default function Parks() { const [parks, setParks] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [sortBy, setSortBy] = useState('name'); const [filterType, setFilterType] = useState('all'); const [filterStatus, setFilterStatus] = useState('all'); const navigate = useNavigate(); useEffect(() => { fetchParks(); }, [sortBy, filterType, filterStatus]); const fetchParks = async () => { try { let query = supabase .from('parks') .select(`*, location:locations(*), operator:companies!parks_operator_id_fkey(*)`); // Apply filters if (filterType !== 'all') { query = query.eq('park_type', filterType); } if (filterStatus !== 'all') { query = query.eq('status', filterStatus); } // Apply sorting switch (sortBy) { case 'rating': query = query.order('average_rating', { ascending: false }); break; case 'rides': query = query.order('ride_count', { ascending: false }); break; case 'reviews': query = query.order('review_count', { ascending: false }); break; default: query = query.order('name'); } const { data } = await query; setParks(data || []); } catch (error) { console.error('Error fetching parks:', error); } finally { setLoading(false); } }; const filteredParks = parks.filter(park => park.name.toLowerCase().includes(searchQuery.toLowerCase()) || park.location?.city?.toLowerCase().includes(searchQuery.toLowerCase()) || park.location?.country?.toLowerCase().includes(searchQuery.toLowerCase()) ); const handleParkClick = (park: Park) => { navigate(`/parks/${park.slug}`); }; const parkTypes = [ { value: 'all', label: 'All Types' }, { value: 'theme_park', label: 'Theme Parks' }, { value: 'amusement_park', label: 'Amusement Parks' }, { value: 'water_park', label: 'Water Parks' }, { value: 'family_entertainment', label: 'Family Entertainment' } ]; 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 */}

Theme Parks

Discover amazing theme parks, amusement parks, and attractions worldwide

{filteredParks.length} parks found {parks.reduce((sum, park) => sum + park.ride_count, 0)} total rides
{/* Search and Filters */}
setSearchQuery(e.target.value)} className="pl-10" />
{/* Parks Grid */} {filteredParks.length > 0 ? (
{filteredParks.map((park) => ( handleParkClick(park)} /> ))}
) : (

No parks found

Try adjusting your search criteria or filters

)}
); }