import { useState, useEffect, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Header } from '@/components/layout/Header'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Dialog, DialogContent } from '@/components/ui/dialog'; import { ArrowLeft, Filter, SlidersHorizontal, FerrisWheel, Plus } from 'lucide-react'; import { Ride, Company } from '@/types/database'; import { RideSubmissionData } from '@/types/submission-data'; import { supabase } from '@/integrations/supabase/client'; import { RideCard } from '@/components/rides/RideCard'; import { RideForm } from '@/components/admin/RideForm'; import { AutocompleteSearch } from '@/components/search/AutocompleteSearch'; import { useAuth } from '@/hooks/useAuth'; import { toast } from '@/hooks/use-toast'; import { useAuthModal } from '@/hooks/useAuthModal'; import { useDocumentTitle } from '@/hooks/useDocumentTitle'; import { useOpenGraph } from '@/hooks/useOpenGraph'; import { logger } from '@/lib/logger'; export default function DesignerRides() { const { designerSlug } = useParams<{ designerSlug: string }>(); const navigate = useNavigate(); const { user } = useAuth(); const { requireAuth } = useAuthModal(); const [designer, setDesigner] = useState(null); 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'); // Update document title when designer changes useDocumentTitle(designer ? `${designer.name} - Rides` : 'Designer Rides'); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const fetchData = useCallback(async () => { try { // Fetch designer const { data: designerData, error: designerError } = await supabase .from('companies') .select('*') .eq('slug', designerSlug || '') .eq('company_type', 'designer') .maybeSingle(); if (designerError) throw designerError; setDesigner(designerData); if (designerData) { // Fetch rides designed by this company let query = supabase .from('rides') .select(` *, park:parks!inner(name, slug, location:locations(*)), manufacturer:companies!rides_manufacturer_id_fkey(*) `) .eq('designer_id', designerData.id); if (filterCategory !== 'all') { query = query.eq('category', filterCategory); } if (filterStatus !== 'all') { query = query.eq('status', filterStatus); } 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('height_meters', { ascending: false, nullsFirst: false }); break; case 'reviews': query = query.order('review_count', { ascending: false }); break; default: query = query.order('name'); } const { data: ridesData, error: ridesError } = await query; if (ridesError) throw ridesError; // Supabase returns nullable types, but our Ride type uses undefined // eslint-disable-next-line @typescript-eslint/no-explicit-any setRides((ridesData || []) as any); } } catch (error) { logger.error('Error fetching data', { error }); } finally { setLoading(false); } }, [designerSlug, sortBy, filterCategory, filterStatus]); useEffect(() => { if (designerSlug) { fetchData(); } }, [designerSlug, fetchData]); const filteredRides = rides.filter(ride => ride.name.toLowerCase().includes(searchQuery.toLowerCase()) || ride.park?.name?.toLowerCase().includes(searchQuery.toLowerCase()) ); useOpenGraph({ title: designer ? `${designer.name} - Rides` : 'Designer Rides', description: designer ? `Explore ${filteredRides.length} rides designed by ${designer.name}` : undefined, imageUrl: designer?.banner_image_url ?? filteredRides[0]?.banner_image_url ?? undefined, imageId: designer?.banner_image_id ?? filteredRides[0]?.banner_image_id ?? undefined, type: 'website', enabled: !!designer && !loading }); const handleCreateSubmit = async (data: any) => { try { if (!designer) { toast({ title: "Error", description: "Designer information is missing.", variant: "destructive" }); return; } const submissionData: RideSubmissionData = { ...data, description: data.description ?? undefined, designer_id: designer.id, }; const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers'); // Type assertion needed: RideForm returns data with undefined for optional fields, // but submitRideCreation expects RideFormData which requires stricter types // eslint-disable-next-line @typescript-eslint/no-explicit-any await submitRideCreation(submissionData as any, user!.id); toast({ title: "Ride Submitted", description: "Your ride submission has been sent for review." }); setIsCreateModalOpen(false); fetchData(); } catch (error) { const message = error instanceof Error ? error.message : "Failed to submit ride."; toast({ title: "Error", description: message, variant: "destructive" }); } }; 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) => (
))}
); } if (!designer) { return (

Designer Not Found

); } return (

Rides by {designer.name}

Explore all rides designed by {designer.name}

{filteredRides.length} rides {rides.filter(r => r.category === 'roller_coaster').length} coasters
setSearchQuery(query)} showRecentSearches={false} />
{filteredRides.length > 0 ? (
{filteredRides.map((ride) => ( ))}
) : (

No rides found

{designer.name} hasn't designed any rides matching your criteria

)}
setIsCreateModalOpen(false)} />
); }