From 6c52dd36cde676b0f206f868c9d523c56895612a Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 13:02:13 +0000 Subject: [PATCH] Fix: Correct route names in App.tsx --- src/App.tsx | 2 + src/pages/RideModelRides.tsx | 146 +++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 src/pages/RideModelRides.tsx diff --git a/src/App.tsx b/src/App.tsx index 80ac8460..deb90c2c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,6 +17,8 @@ import Manufacturers from "./pages/Manufacturers"; import ManufacturerDetail from "./pages/ManufacturerDetail"; import ManufacturerRides from "./pages/ManufacturerRides"; import ManufacturerModels from "./pages/ManufacturerModels"; +import RideModelDetail from "./pages/RideModelDetail"; +import RideModelRides from "./pages/RideModelRides"; import Designers from "./pages/Designers"; import DesignerDetail from "./pages/DesignerDetail"; import DesignerRides from "./pages/DesignerRides"; diff --git a/src/pages/RideModelRides.tsx b/src/pages/RideModelRides.tsx new file mode 100644 index 00000000..55893ccf --- /dev/null +++ b/src/pages/RideModelRides.tsx @@ -0,0 +1,146 @@ +import { useParams, useNavigate } from "react-router-dom"; +import { useEffect, useState } from "react"; +import { supabase } from "@/integrations/supabase/client"; +import { Header } from "@/components/layout/Header"; +import { RideCard } from "@/components/rides/RideCard"; +import { Button } from "@/components/ui/button"; +import { ArrowLeft } from "lucide-react"; +import { Skeleton } from "@/components/ui/skeleton"; +import type { Ride, Company } from "@/types/database"; + +interface RideModel { + id: string; + name: string; + slug: string; + manufacturer_id: string; +} + +export default function RideModelRides() { + const { manufacturerSlug, modelSlug } = useParams<{ manufacturerSlug: string; modelSlug: string }>(); + const navigate = useNavigate(); + const [model, setModel] = useState(null); + const [manufacturer, setManufacturer] = useState(null); + const [rides, setRides] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + if (manufacturerSlug && modelSlug) { + fetchData(); + } + }, [manufacturerSlug, modelSlug]); + + const fetchData = 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; + } + + // Fetch rides for this model + const { data: ridesData, error: ridesError } = await supabase + .from("rides") + .select("*") + .eq("ride_model_id", modelData.id) + .order("name"); + + if (ridesError) throw ridesError; + + setManufacturer(manufacturerData); + setModel(modelData); + setRides(ridesData || []); + } catch (error) { + console.error("Error fetching data:", error); + } finally { + setLoading(false); + } + }; + + if (loading) { + return ( + <> +
+
+ +
+ {[...Array(6)].map((_, i) => ( + + ))} +
+
+ + ); + } + + if (!model || !manufacturer) { + return ( + <> +
+
+

Model not found

+
+ + ); + } + + return ( + <> +
+
+ + +
+

+ {model.name} Installations +

+

+ All rides based on the {model.name} by {manufacturer.name} +

+
+ + {rides.length === 0 ? ( +

+ No rides found for this model. +

+ ) : ( +
+ {rides.map((ride) => ( + + ))} +
+ )} +
+ + ); +}