From 8540d227b2af67cf0efa7aa58e04e648937bf005 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 13:05:32 +0000 Subject: [PATCH] feat: Implement bot detection plan --- src/pages/RideDetail.tsx | 384 ++++++++++++++++++++++++++++++++++++++- src/types/database.ts | 36 +++- 2 files changed, 418 insertions(+), 2 deletions(-) diff --git a/src/pages/RideDetail.tsx b/src/pages/RideDetail.tsx index 012f4720..da911c5a 100644 --- a/src/pages/RideDetail.tsx +++ b/src/pages/RideDetail.tsx @@ -29,7 +29,11 @@ import { Waves, Theater, Train, - Edit + Edit, + Wrench, + Sparkles, + Repeat, + Baby } from 'lucide-react'; import { ReviewsSection } from '@/components/reviews/ReviewsSection'; import { MeasurementDisplay } from '@/components/ui/measurement-display'; @@ -703,6 +707,345 @@ export default function RideDetail() { + + {/* Coaster Materials & Propulsion */} + {ride.category === 'roller_coaster' && ( + ride.track_material?.length > 0 || + ride.support_material?.length > 0 || + ride.propulsion_method?.length > 0 + ) && ( + + + + + Coaster Construction + + + + {ride.track_material && ride.track_material.length > 0 && ( +
+
Track Material
+
+ {ride.track_material.map(material => ( + + {material.replace('_', ' ').toUpperCase()} + + ))} +
+
+ )} + {ride.support_material && ride.support_material.length > 0 && ( +
+
Support Material
+
+ {ride.support_material.map(material => ( + + {material.replace('_', ' ').toUpperCase()} + + ))} +
+
+ )} + {ride.propulsion_method && ride.propulsion_method.length > 0 && ( +
+
Propulsion Method
+
+ {ride.propulsion_method.map(method => ( + + {method.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())} + + ))} +
+
+ )} +
+
+ )} + + {/* Water Ride Details */} + {ride.category === 'water_ride' && ( + ride.water_depth_cm || ride.splash_height_meters || ride.wetness_level || + ride.flume_type || ride.boat_capacity + ) && ( + + + + + Water Ride Details + + + + {ride.water_depth_cm && ( +
+ Water Depth + + + +
+ )} + {ride.splash_height_meters && ( +
+ Splash Height + + + +
+ )} + {ride.wetness_level && ( +
+ Wetness Level + + {ride.wetness_level.charAt(0).toUpperCase() + ride.wetness_level.slice(1)} + +
+ )} + {ride.flume_type && ( +
+ Flume Type + + {ride.flume_type.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())} + +
+ )} + {ride.boat_capacity && ( +
+ Boat Capacity + {ride.boat_capacity} riders +
+ )} +
+
+ )} + + {/* Dark Ride Details */} + {ride.category === 'dark_ride' && ( + ride.theme_name || ride.story_description || ride.show_duration_seconds || + ride.animatronics_count || ride.projection_type || ride.ride_system || ride.scenes_count + ) && ( + + + + + Dark Ride Details + + + + {ride.theme_name && ( +
+ Theme + {ride.theme_name} +
+ )} + {ride.story_description && ( +
+
Story
+

{ride.story_description}

+
+ )} + {ride.show_duration_seconds && ( +
+ Show Duration + + {Math.floor(ride.show_duration_seconds / 60)}:{(ride.show_duration_seconds % 60).toString().padStart(2, '0')} + +
+ )} + {ride.animatronics_count && ( +
+ Animatronics + {ride.animatronics_count} +
+ )} + {ride.scenes_count && ( +
+ Scenes + {ride.scenes_count} +
+ )} + {ride.projection_type && ( +
+ Projection Type + + {ride.projection_type.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())} + +
+ )} + {ride.ride_system && ( +
+ Ride System + + {ride.ride_system.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())} + +
+ )} +
+
+ )} + + {/* Flat Ride Details */} + {ride.category === 'flat_ride' && ( + ride.rotation_type || ride.motion_pattern || ride.platform_count || + ride.swing_angle_degrees || ride.rotation_speed_rpm || ride.arm_length_meters || + ride.max_height_reached_meters + ) && ( + + + + + Flat Ride Details + + + + {ride.rotation_type && ( +
+ Rotation Type + + {ride.rotation_type.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())} + +
+ )} + {ride.motion_pattern && ( +
+ Motion Pattern + + {ride.motion_pattern.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())} + +
+ )} + {ride.platform_count && ( +
+ Platforms + {ride.platform_count} +
+ )} + {ride.swing_angle_degrees && ( +
+ Swing Angle + {ride.swing_angle_degrees}° +
+ )} + {ride.rotation_speed_rpm && ( +
+ Rotation Speed + {ride.rotation_speed_rpm} RPM +
+ )} + {ride.arm_length_meters && ( +
+ Arm Length + + + +
+ )} + {ride.max_height_reached_meters && ( +
+ Max Height Reached + + + +
+ )} +
+
+ )} + + {/* Kiddie Ride Details */} + {ride.category === 'kiddie_ride' && ( + ride.min_age || ride.max_age || ride.educational_theme || ride.character_theme + ) && ( + + + + + Kiddie Ride Details + + + + {(ride.min_age || ride.max_age) && ( +
+ Age Range + + {ride.min_age && ride.max_age ? `${ride.min_age}-${ride.max_age} years` : + ride.min_age ? `${ride.min_age}+ years` : + ride.max_age ? `Up to ${ride.max_age} years` : 'N/A'} + +
+ )} + {ride.educational_theme && ( +
+ Educational Theme + {ride.educational_theme} +
+ )} + {ride.character_theme && ( +
+ Character Theme + {ride.character_theme} +
+ )} +
+
+ )} + + {/* Transportation Details */} + {ride.category === 'transportation' && ( + ride.transport_type || ride.route_length_meters || ride.stations_count || + ride.vehicle_capacity || ride.vehicles_count || ride.round_trip_duration_seconds + ) && ( + + + + + Transportation Details + + + + {ride.transport_type && ( +
+ Transport Type + + {ride.transport_type.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase())} + +
+ )} + {ride.route_length_meters && ( +
+ Route Length + + + +
+ )} + {ride.stations_count && ( +
+ Stations + {ride.stations_count} +
+ )} + {ride.vehicle_capacity && ( +
+ Vehicle Capacity + {ride.vehicle_capacity} passengers +
+ )} + {ride.vehicles_count && ( +
+ Number of Vehicles + {ride.vehicles_count} +
+ )} + {ride.round_trip_duration_seconds && ( +
+ Round Trip Duration + + {Math.floor(ride.round_trip_duration_seconds / 60)}:{(ride.round_trip_duration_seconds % 60).toString().padStart(2, '0')} + +
+ )} +
+
+ )} @@ -768,11 +1111,50 @@ export default function RideDetail() { max_height_meters: ride.max_height_meters, length_meters: ride.length_meters, inversions: ride.inversions, + // Coaster fields coaster_type: ride.coaster_type, seating_type: ride.seating_type, intensity_level: ride.intensity_level, + track_material: ride.track_material, + support_material: ride.support_material, + propulsion_method: ride.propulsion_method, drop_height_meters: ride.drop_height_meters, max_g_force: ride.max_g_force, + // Water ride fields + water_depth_cm: ride.water_depth_cm, + splash_height_meters: ride.splash_height_meters, + wetness_level: ride.wetness_level, + flume_type: ride.flume_type, + boat_capacity: ride.boat_capacity, + // Dark ride fields + theme_name: ride.theme_name, + story_description: ride.story_description, + show_duration_seconds: ride.show_duration_seconds, + animatronics_count: ride.animatronics_count, + projection_type: ride.projection_type, + ride_system: ride.ride_system, + scenes_count: ride.scenes_count, + // Flat ride fields + rotation_type: ride.rotation_type, + motion_pattern: ride.motion_pattern, + platform_count: ride.platform_count, + swing_angle_degrees: ride.swing_angle_degrees, + rotation_speed_rpm: ride.rotation_speed_rpm, + arm_length_meters: ride.arm_length_meters, + max_height_reached_meters: ride.max_height_reached_meters, + // Kiddie ride fields + min_age: ride.min_age, + max_age: ride.max_age, + educational_theme: ride.educational_theme, + character_theme: ride.character_theme, + // Transportation fields + transport_type: ride.transport_type, + route_length_meters: ride.route_length_meters, + stations_count: ride.stations_count, + vehicle_capacity: ride.vehicle_capacity, + vehicles_count: ride.vehicles_count, + round_trip_duration_seconds: ride.round_trip_duration_seconds, + // Common fields manufacturer_id: ride.manufacturer?.id, ride_model_id: ride.ride_model?.id, banner_image_url: ride.banner_image_url, diff --git a/src/types/database.ts b/src/types/database.ts index 77495d9d..fb69daca 100644 --- a/src/types/database.ts +++ b/src/types/database.ts @@ -162,7 +162,7 @@ export interface Ride { banner_image_id?: string; card_image_url?: string; card_image_id?: string; - // New roller coaster specific fields + // Roller coaster specific fields coaster_type?: string; seating_type?: string; intensity_level?: string; @@ -171,6 +171,40 @@ export interface Ride { propulsion_method?: string[]; drop_height_meters?: number; max_g_force?: number; + // Water ride specific fields + water_depth_cm?: number; + splash_height_meters?: number; + wetness_level?: 'dry' | 'light' | 'moderate' | 'soaked'; + flume_type?: string; + boat_capacity?: number; + // Dark ride specific fields + theme_name?: string; + story_description?: string; + show_duration_seconds?: number; + animatronics_count?: number; + projection_type?: string; + ride_system?: string; + scenes_count?: number; + // Flat ride specific fields + rotation_type?: 'horizontal' | 'vertical' | 'multi_axis' | 'pendulum' | 'none'; + motion_pattern?: string; + platform_count?: number; + swing_angle_degrees?: number; + rotation_speed_rpm?: number; + arm_length_meters?: number; + max_height_reached_meters?: number; + // Kiddie ride specific fields + min_age?: number; + max_age?: number; + educational_theme?: string; + character_theme?: string; + // Transportation specific fields + transport_type?: 'monorail' | 'train' | 'skylift' | 'ferry' | 'cable_car' | 'peoplemover'; + route_length_meters?: number; + stations_count?: number; + vehicle_capacity?: number; + vehicles_count?: number; + round_trip_duration_seconds?: number; } export interface Profile {