mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 08:11:13 -05:00
Refactor: Implement comprehensive ride field integration
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user