Refactor: Implement comprehensive ride field integration

This commit is contained in:
gpt-engineer-app[bot]
2025-10-30 12:59:23 +00:00
parent 05217b00d4
commit 8fd8d2e843
3 changed files with 66 additions and 6 deletions

View File

@@ -27,6 +27,8 @@ export interface RideFilterState {
seatingTypes: string[]; seatingTypes: string[];
intensityLevels: string[]; intensityLevels: string[];
trackMaterials: string[]; trackMaterials: string[];
supportMaterials: string[];
propulsionMethods: string[];
minSpeed: number; minSpeed: number;
maxSpeed: number; maxSpeed: number;
minHeight: number; minHeight: number;
@@ -54,6 +56,8 @@ export const defaultRideFilters: RideFilterState = {
seatingTypes: [], seatingTypes: [],
intensityLevels: [], intensityLevels: [],
trackMaterials: [], trackMaterials: [],
supportMaterials: [],
propulsionMethods: [],
minSpeed: 0, minSpeed: 0,
maxSpeed: 200, maxSpeed: 200,
minHeight: 0, minHeight: 0,
@@ -200,6 +204,29 @@ export function RideFilters({ filters, onFiltersChange, rides }: RideFiltersProp
{ label: 'Steel', value: 'steel' }, { label: 'Steel', value: 'steel' },
{ label: 'Wood', value: 'wood' }, { label: 'Wood', value: 'wood' },
{ label: 'Hybrid', value: 'hybrid' }, { 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 = () => { const resetFilters = () => {
@@ -339,6 +366,20 @@ export function RideFilters({ filters, onFiltersChange, rides }: RideFiltersProp
onChange={(value) => onFiltersChange({ ...filters, trackMaterials: value })} onChange={(value) => onFiltersChange({ ...filters, trackMaterials: value })}
placeholder="Select material" placeholder="Select material"
/> />
<FilterMultiSelectCombobox
label="Support Material"
options={supportMaterialOptions}
value={filters.supportMaterials}
onChange={(value) => onFiltersChange({ ...filters, supportMaterials: value })}
placeholder="Select support material"
/>
<FilterMultiSelectCombobox
label="Propulsion Method"
options={propulsionMethodOptions}
value={filters.propulsionMethods}
onChange={(value) => onFiltersChange({ ...filters, propulsionMethods: value })}
placeholder="Select propulsion"
/>
</div> </div>
</FilterSection> </FilterSection>

View File

@@ -184,12 +184,15 @@ export function useRideCreditFilters(credits: UserRideCredit[]) {
); );
} }
// Track material filter // Track material filter (handles array)
if (filters.trackMaterial && filters.trackMaterial.length > 0) { if (filters.trackMaterial && filters.trackMaterial.length > 0) {
result = result.filter(credit => result = result.filter(credit => {
credit.rides?.track_material && if (!credit.rides?.track_material) return false;
filters.trackMaterial!.includes(credit.rides.track_material) 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 // User rating

View File

@@ -180,7 +180,7 @@ export default function Rides() {
} }
} }
// Track material filter // Track material filter (array field)
if (filters.trackMaterials.length > 0) { if (filters.trackMaterials.length > 0) {
if (!ride.track_material || ride.track_material.length === 0 || if (!ride.track_material || ride.track_material.length === 0 ||
!ride.track_material.some(material => filters.trackMaterials.includes(material))) { !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 // Speed filter
if (filters.minSpeed > 0 || filters.maxSpeed < 200) { if (filters.minSpeed > 0 || filters.maxSpeed < 200) {
const speed = ride.max_speed_kmh || 0; const speed = ride.max_speed_kmh || 0;