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[];
|
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>
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user