From 13b0638f6205e9337c0d7759e4718e37e71abe7c Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 20 Sep 2025 00:39:14 +0000 Subject: [PATCH] Refactor ride cards --- src/components/homepage/ContentTabs.tsx | 130 ++++++++++++++++++++---- 1 file changed, 109 insertions(+), 21 deletions(-) diff --git a/src/components/homepage/ContentTabs.tsx b/src/components/homepage/ContentTabs.tsx index 9188e775..cf43749c 100644 --- a/src/components/homepage/ContentTabs.tsx +++ b/src/components/homepage/ContentTabs.tsx @@ -2,7 +2,9 @@ import { useState, useEffect } from 'react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { ParkCard } from '@/components/parks/ParkCard'; import { Card, CardContent } from '@/components/ui/card'; -import { Star, TrendingUp, Plus, MapPin } from 'lucide-react'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Star, TrendingUp, Plus, MapPin, Clock, Zap } from 'lucide-react'; import { Park, Ride } from '@/types/database'; import { supabase } from '@/integrations/supabase/client'; @@ -76,51 +78,137 @@ export function ContentTabs() { } }; + const getRideIcon = (category: string) => { + switch (category) { + case 'roller_coaster': return '🎢'; + case 'water_ride': return '🌊'; + case 'dark_ride': return '🎭'; + case 'flat_ride': return '🎡'; + case 'kiddie_ride': return '🎠'; + case 'transportation': return '🚂'; + default: return '🎢'; + } + }; + + const getStatusColor = (status: string) => { + switch (status) { + case 'operating': return 'bg-green-500/20 text-green-400 border-green-500/30'; + case 'seasonal': return 'bg-yellow-500/20 text-yellow-400 border-yellow-500/30'; + case 'under_construction': return 'bg-blue-500/20 text-blue-400 border-blue-500/30'; + default: return 'bg-red-500/20 text-red-400 border-red-500/30'; + } + }; + + const formatCategory = (category: string) => { + return category.split('_').map(word => + word.charAt(0).toUpperCase() + word.slice(1) + ).join(' '); + }; + const RideCard = ({ ride }: { ride: Ride }) => ( - - -
-
-
-

+ +
+ {/* Image/Icon Section */} +
+ {ride.image_url ? ( + {ride.name} + ) : ( +
+ {getRideIcon(ride.category)} +
+ )} + + {/* Gradient Overlay */} +
+ + {/* Status Badge */} + + {ride.status.replace('_', ' ').toUpperCase()} + +
+ + + {/* Header */} +
+
+

{ride.name}

-

- at {ride.park?.name} -

-
-
- {ride.category === 'roller_coaster' ? '🎢' : - ride.category === 'water_ride' ? '🌊' : - ride.category === 'dark_ride' ? '🎭' : '🎡'} + {getRideIcon(ride.category)}
+ + {ride.park?.name && ( +
+ + {ride.park.name} + {ride.park.location?.city && `, ${ride.park.location.city}`} +
+ )}
+ {/* Description */} {ride.description && (

{ride.description}

)} + {/* Category Badge */} + + {formatCategory(ride.category)} + + + {/* Stats */}
-
+
{ride.max_speed_kmh && ( - {ride.max_speed_kmh} km/h +
+ + {ride.max_speed_kmh} + km/h +
)} {ride.max_height_meters && ( - {ride.max_height_meters}m +
+ {ride.max_height_meters} + m +
+ )} + {ride.duration_seconds && ( +
+ + {Math.floor(ride.duration_seconds / 60)} + min +
)}
{ride.average_rating > 0 && (
- {ride.average_rating.toFixed(1)} + {ride.average_rating.toFixed(1)} + ({ride.review_count})
)}
-
-
+ + {/* Action Button */} + + +
);