From 8fd8d2e84368e9aaa715b58560f64cc68fe9499a Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 30 Oct 2025 12:59:23 +0000 Subject: [PATCH] Refactor: Implement comprehensive ride field integration --- src/components/rides/RideFilters.tsx | 41 ++++++++++++++++++++++++++++ src/hooks/useRideCreditFilters.ts | 13 +++++---- src/pages/Rides.tsx | 18 +++++++++++- 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/components/rides/RideFilters.tsx b/src/components/rides/RideFilters.tsx index 516cb0ca..4e2529ce 100644 --- a/src/components/rides/RideFilters.tsx +++ b/src/components/rides/RideFilters.tsx @@ -27,6 +27,8 @@ export interface RideFilterState { seatingTypes: string[]; intensityLevels: string[]; trackMaterials: string[]; + supportMaterials: string[]; + propulsionMethods: string[]; minSpeed: number; maxSpeed: number; minHeight: number; @@ -54,6 +56,8 @@ export const defaultRideFilters: RideFilterState = { seatingTypes: [], intensityLevels: [], trackMaterials: [], + supportMaterials: [], + propulsionMethods: [], minSpeed: 0, maxSpeed: 200, minHeight: 0, @@ -200,6 +204,29 @@ export function RideFilters({ filters, onFiltersChange, rides }: RideFiltersProp { label: 'Steel', value: 'steel' }, { label: 'Wood', value: 'wood' }, { label: 'Hybrid', value: 'hybrid' }, + { label: 'Aluminum', value: 'aluminum' }, + { label: 'Composite', value: 'composite' }, + { label: 'Other', value: 'other' }, + ]; + + const supportMaterialOptions: MultiSelectOption[] = [ + { label: 'Steel', value: 'steel' }, + { label: 'Wood', value: 'wood' }, + { label: 'Concrete', value: 'concrete' }, + { label: 'Aluminum', value: 'aluminum' }, + { label: 'Composite', value: 'composite' }, + { label: 'Other', value: 'other' }, + ]; + + const propulsionMethodOptions: MultiSelectOption[] = [ + { label: 'Chain Lift', value: 'chain_lift' }, + { label: 'Cable Lift', value: 'cable_lift' }, + { label: 'Launched (LIM/LSM)', value: 'launched_lim_lsm' }, + { label: 'Hydraulic Launch', value: 'hydraulic_launch' }, + { label: 'Compressed Air', value: 'compressed_air' }, + { label: 'Flywheel', value: 'flywheel' }, + { label: 'Gravity', value: 'gravity' }, + { label: 'Other', value: 'other' }, ]; const resetFilters = () => { @@ -339,6 +366,20 @@ export function RideFilters({ filters, onFiltersChange, rides }: RideFiltersProp onChange={(value) => onFiltersChange({ ...filters, trackMaterials: value })} placeholder="Select material" /> + onFiltersChange({ ...filters, supportMaterials: value })} + placeholder="Select support material" + /> + onFiltersChange({ ...filters, propulsionMethods: value })} + placeholder="Select propulsion" + /> diff --git a/src/hooks/useRideCreditFilters.ts b/src/hooks/useRideCreditFilters.ts index f72f9278..6de3dcdb 100644 --- a/src/hooks/useRideCreditFilters.ts +++ b/src/hooks/useRideCreditFilters.ts @@ -184,12 +184,15 @@ export function useRideCreditFilters(credits: UserRideCredit[]) { ); } - // Track material filter + // Track material filter (handles array) if (filters.trackMaterial && filters.trackMaterial.length > 0) { - result = result.filter(credit => - credit.rides?.track_material && - filters.trackMaterial!.includes(credit.rides.track_material) - ); + result = result.filter(credit => { + if (!credit.rides?.track_material) return false; + const rideMaterials = Array.isArray(credit.rides.track_material) + ? credit.rides.track_material + : [credit.rides.track_material]; + return rideMaterials.some(material => filters.trackMaterial!.includes(material)); + }); } // User rating diff --git a/src/pages/Rides.tsx b/src/pages/Rides.tsx index f177356f..27297fcd 100644 --- a/src/pages/Rides.tsx +++ b/src/pages/Rides.tsx @@ -180,7 +180,7 @@ export default function Rides() { } } - // Track material filter + // Track material filter (array field) if (filters.trackMaterials.length > 0) { if (!ride.track_material || ride.track_material.length === 0 || !ride.track_material.some(material => filters.trackMaterials.includes(material))) { @@ -188,6 +188,22 @@ export default function Rides() { } } + // Support material filter (array field) + if (filters.supportMaterials.length > 0) { + if (!ride.support_material || ride.support_material.length === 0 || + !ride.support_material.some(material => filters.supportMaterials.includes(material))) { + return false; + } + } + + // Propulsion method filter (array field) + if (filters.propulsionMethods.length > 0) { + if (!ride.propulsion_method || ride.propulsion_method.length === 0 || + !ride.propulsion_method.some(method => filters.propulsionMethods.includes(method))) { + return false; + } + } + // Speed filter if (filters.minSpeed > 0 || filters.maxSpeed < 200) { const speed = ride.max_speed_kmh || 0;