import { useState, useEffect } from 'react'; import { Search, Filter, MapPin, SlidersHorizontal, FerrisWheel } from 'lucide-react'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Sheet, SheetContent, SheetTrigger, SheetHeader, SheetTitle } from '@/components/ui/sheet'; import { ParkCard } from './ParkCard'; import { Park } from '@/types/database'; import { supabase } from '@/lib/supabaseClient'; import { getErrorMessage } from '@/lib/errorHandler'; export function ParkGrid() { const [parks, setParks] = useState([]); const [filteredParks, setFilteredParks] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [sortBy, setSortBy] = useState('name'); const [filterStatus, setFilterStatus] = useState('all'); const [filterType, setFilterType] = useState('all'); useEffect(() => { fetchParks(); }, []); useEffect(() => { filterAndSortParks(); }, [parks, searchTerm, sortBy, filterStatus, filterType]); const fetchParks = async () => { try { const { data, error } = await supabase .from('parks') .select(` *, location:locations(*), operator:companies!parks_operator_id_fkey(*), property_owner:companies!parks_property_owner_id_fkey(*) `) .order('name'); if (error) throw error; setParks(data || []); } catch (error: unknown) { // Parks fetch failed - display empty grid } finally { setLoading(false); } }; const filterAndSortParks = () => { let filtered = parks.filter(park => { const matchesSearch = park.name.toLowerCase().includes(searchTerm.toLowerCase()) || park.description?.toLowerCase().includes(searchTerm.toLowerCase()) || park.location?.city?.toLowerCase().includes(searchTerm.toLowerCase()) || park.location?.country?.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = filterStatus === 'all' || park.status === filterStatus; const matchesType = filterType === 'all' || park.park_type === filterType; return matchesSearch && matchesStatus && matchesType; }); // Sort parks filtered.sort((a, b) => { switch (sortBy) { case 'name': return a.name.localeCompare(b.name); case 'rating': return (b.average_rating || 0) - (a.average_rating || 0); case 'rides': return (b.ride_count || 0) - (a.ride_count || 0); case 'recent': return new Date(b.created_at).getTime() - new Date(a.created_at).getTime(); default: return 0; } }); setFilteredParks(filtered); }; const clearFilters = () => { setSearchTerm(''); setSortBy('name'); setFilterStatus('all'); setFilterType('all'); }; if (loading) { return (
{[...Array(8)].map((_, i) => (
))}
); } return (
{/* Header */}

Discover Theme Parks

Explore {parks.length} amazing theme parks around the world

{/* Search and Filters */}
{/* Search */}
setSearchTerm(e.target.value)} className="pl-10 bg-muted/50 border-border/50 focus:border-primary/50" />
{/* Quick Sort */} {/* Advanced Filters */} Filter Parks
{/* Status Filter */}
{/* Type Filter */}
{/* Active Filters */} {(filterStatus !== 'all' || filterType !== 'all' || searchTerm) && (
Active filters: {searchTerm && ( setSearchTerm('')} className="cursor-pointer"> Search: {searchTerm} ✕ )} {filterStatus !== 'all' && ( setFilterStatus('all')} className="cursor-pointer"> Status: {filterStatus} ✕ )} {filterType !== 'all' && ( setFilterType('all')} className="cursor-pointer"> Type: {filterType.replace('_', ' ')} ✕ )}
)} {/* Results Count */}
Showing {filteredParks.length} of {parks.length} parks
{/* Parks Grid */} {filteredParks.length === 0 ? (

No parks found

Try adjusting your search terms or filters

) : (
{filteredParks.map((park) => ( ))}
)}
); }