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[];
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"
/>
<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>
</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) {
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

View File

@@ -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;