import { useParams, useNavigate } from "react-router-dom"; import { useEffect, useState, useCallback } from "react"; import { supabase } from "@/lib/supabaseClient"; import { Header } from "@/components/layout/Header"; import { RideCard } from "@/components/rides/RideCard"; 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, Plus, FerrisWheel } from "lucide-react"; import { Skeleton } from "@/components/ui/skeleton"; import { AutocompleteSearch } from '@/components/search/AutocompleteSearch'; import { RideForm } from '@/components/admin/RideForm'; import { useAuth } from '@/hooks/useAuth'; import { useAuthModal } from '@/hooks/useAuthModal'; import { toast } from '@/hooks/use-toast'; import { getErrorMessage, handleNonCriticalError } from '@/lib/errorHandler'; import type { Ride, Company, RideModel } from "@/types/database"; import { useDocumentTitle } from '@/hooks/useDocumentTitle'; import { SubmissionErrorBoundary } from '@/components/error/SubmissionErrorBoundary'; export default function RideModelRides() { const { manufacturerSlug, modelSlug } = useParams<{ manufacturerSlug: string; modelSlug: string }>(); const navigate = useNavigate(); const { user } = useAuth(); const { requireAuth } = useAuthModal(); const [model, setModel] = useState(null); const [manufacturer, setManufacturer] = useState(null); const [rides, setRides] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [sortBy, setSortBy] = useState('name'); // Update document title when model changes useDocumentTitle(model ? `${model.name} - Rides` : 'Model Rides'); const [filterCategory, setFilterCategory] = useState('all'); const [filterStatus, setFilterStatus] = useState('all'); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const fetchData = useCallback(async () => { try { setLoading(true); // Fetch manufacturer from companies table const { data: manufacturerData, error: mfgError } = await supabase .from("companies") .select("*") .eq("slug", manufacturerSlug || '') .eq("company_type", "manufacturer") .maybeSingle(); if (mfgError) throw mfgError; if (!manufacturerData) { setLoading(false); return; } // Fetch ride model const { data: modelData, error: modelError } = await supabase .from("ride_models") .select("*") .eq("slug", modelSlug || '') .eq("manufacturer_id", manufacturerData.id) .maybeSingle(); if (modelError) throw modelError; if (!modelData) { setLoading(false); return; } // Enhanced query with filters and sort let query = supabase .from("rides") .select(` *, park:parks!inner(name, slug, location:locations(*)), manufacturer:companies!rides_manufacturer_id_fkey(*), ride_model:ride_models(id, name, slug, manufacturer_id, category) `) .eq("ride_model_id", modelData.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; setManufacturer(manufacturerData); setModel(modelData as RideModel); setRides(ridesData as Ride[] || []); } catch (error) { handleNonCriticalError(error, { action: 'Fetch Model Rides Data', metadata: { manufacturerSlug, modelSlug } }); } finally { setLoading(false); } }, [manufacturerSlug, modelSlug, sortBy, filterCategory, filterStatus]); useEffect(() => { if (manufacturerSlug && modelSlug) { fetchData(); } }, [manufacturerSlug, modelSlug, fetchData]); const filteredRides = rides.filter(ride => ride.name.toLowerCase().includes(searchQuery.toLowerCase()) || ride.park?.name?.toLowerCase().includes(searchQuery.toLowerCase()) ); const handleCreateSubmit = async (data: any) => { try { if (!user || !model) return; const submissionData = { ...data, ride_model_id: model.id, manufacturer_id: manufacturer!.id, }; const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers'); await submitRideCreation(submissionData, user.id); toast({ title: "Ride Submitted", description: "Your ride submission has been sent for review." }); setIsCreateModalOpen(false); fetchData(); } catch (error) { const errorMsg = getErrorMessage(error); toast({ title: "Error", description: errorMsg || "Failed to submit ride.", variant: "destructive" }); } }; if (loading) { return ( <>
{[...Array(8)].map((_, i) => ( ))}
); } if (!model || !manufacturer) { return ( <>

Model not found

); } return ( <>

{model.name} Installations

All rides using the {model.name} by {manufacturer.name}

{filteredRides.length} rides
setSearchQuery(query)} showRecentSearches={false} />
{filteredRides.length > 0 ? (
{filteredRides.map((ride) => ( ))}
) : (

No rides found

No rides match your search criteria for the {model.name}

)} {/* Create Modal */} setIsCreateModalOpen(false)} />
); }