Fix: Resolve internal server error

This commit is contained in:
gpt-engineer-app[bot]
2025-11-03 02:26:28 +00:00
parent 5a2c72ecd6
commit f6c409fac4
12 changed files with 35 additions and 34 deletions

View File

@@ -67,7 +67,7 @@ export function RideCard({ ride, showParkName = true, className, parkSlug }: Rid
<div className="aspect-[3/2] bg-gradient-to-br from-primary/20 via-secondary/20 to-accent/20 flex items-center justify-center relative">
{(ride.card_image_url || ride.card_image_id || ride.image_url) ? (
<img
src={ride.card_image_url || getCloudflareImageUrl(ride.card_image_id, 'card') || ride.image_url}
src={ride.card_image_url || getCloudflareImageUrl(ride.card_image_id || '', 'card') || ride.image_url || ''}
srcSet={ride.card_image_id ? `
${getCloudflareImageUrl(ride.card_image_id, 'cardthumb')} 600w,
${getCloudflareImageUrl(ride.card_image_id, 'card')} 1200w
@@ -122,29 +122,29 @@ export function RideCard({ ride, showParkName = true, className, parkSlug }: Rid
{/* Stats & Rating */}
<div className="flex flex-col gap-1.5">
{/* Stats Row */}
{(Number(ride.max_speed_kmh) > 0 || Number(ride.max_height_meters) > 0 || Number(ride.duration_seconds) > 0) && (
{(Number(ride.max_speed_kmh || 0) > 0 || Number(ride.max_height_meters || 0) > 0 || Number(ride.duration_seconds || 0) > 0) && (
<div className="flex items-center gap-3 flex-wrap text-sm">
{Number(ride.max_speed_kmh) > 0 && (
{Number(ride.max_speed_kmh || 0) > 0 && (
<div className="flex items-center gap-1 min-w-0">
<Zap className="w-4 h-4 text-primary/70 flex-shrink-0" />
<span className="font-medium whitespace-nowrap">
<MeasurementDisplay value={ride.max_speed_kmh} type="speed" />
<MeasurementDisplay value={ride.max_speed_kmh || 0} type="speed" />
</span>
</div>
)}
{Number(ride.max_height_meters) > 0 && (
{Number(ride.max_height_meters || 0) > 0 && (
<div className="flex items-center gap-1 min-w-0">
<ArrowUp className="w-4 h-4 text-accent/70 flex-shrink-0" />
<span className="font-medium whitespace-nowrap">
<MeasurementDisplay value={ride.max_height_meters} type="distance" />
<MeasurementDisplay value={ride.max_height_meters || 0} type="distance" />
</span>
</div>
)}
{Number(ride.duration_seconds) > 0 && (
{Number(ride.duration_seconds || 0) > 0 && (
<div className="flex items-center gap-1 min-w-0">
<Clock className="w-4 h-4 text-secondary/70 flex-shrink-0" />
<span className="font-medium whitespace-nowrap">
{Math.floor(ride.duration_seconds / 60)}<span className="text-muted-foreground text-xs ml-0.5">min</span>
{Math.floor((ride.duration_seconds || 0) / 60)}<span className="text-muted-foreground text-xs ml-0.5">min</span>
</span>
</div>
)}
@@ -152,11 +152,11 @@ export function RideCard({ ride, showParkName = true, className, parkSlug }: Rid
)}
{/* Rating */}
{ride.average_rating > 0 && (
{(ride.average_rating != null && ride.average_rating > 0) && (
<div className="inline-flex items-center gap-1 text-sm">
<Star className="w-4 h-4 fill-yellow-500 text-yellow-500" />
<span className="font-semibold text-foreground">{ride.average_rating.toFixed(1)}</span>
{ride.review_count > 0 && (
{(ride.review_count != null && ride.review_count > 0) && (
<span className="text-muted-foreground">({ride.review_count})</span>
)}
</div>

View File

@@ -145,12 +145,12 @@ export function RideFilters({ filters, onFiltersChange, rides }: RideFiltersProp
}, [locations]);
const stateOptions: MultiSelectOption[] = useMemo(() => {
const states = new Set(locations?.map(l => l.state_province).filter(Boolean) || []);
const states = new Set(locations?.map(l => l.state_province).filter((s): s is string => s != null) || []);
return Array.from(states).sort().map(s => ({ label: s, value: s }));
}, [locations]);
const cityOptions: MultiSelectOption[] = useMemo(() => {
const cities = new Set(locations?.map(l => l.city).filter(Boolean) || []);
const cities = new Set(locations?.map(l => l.city).filter((c): c is string => c != null) || []);
return Array.from(cities).sort().map(c => ({ label: c, value: c }));
}, [locations]);

View File

@@ -101,7 +101,7 @@ export function RideListView({ rides, onRideClick }: RideListViewProps) {
</div>
{/* Rating */}
{ride.average_rating > 0 && (
{(ride.average_rating != null && ride.average_rating > 0) && (
<div className="flex items-center gap-1.5 ml-4 flex-shrink-0 bg-yellow-400/10 px-3 py-1.5 rounded-full group-hover:bg-yellow-400/20 transition-colors duration-300">
<Star className="w-4 h-4 fill-yellow-400 text-yellow-400" />
<span className="font-semibold text-foreground">{ride.average_rating.toFixed(1)}</span>

View File

@@ -17,14 +17,14 @@ interface SimilarRide {
name: string;
slug: string;
image_url: string | null;
average_rating: number;
average_rating: number | null;
status: string;
category: string;
description: string | null;
max_speed_kmh: number | null;
max_height_meters: number | null;
duration_seconds: number | null;
review_count: number;
review_count: number | null;
park: {
name: string;
slug: string;
@@ -61,7 +61,7 @@ export function SimilarRides({ currentRideId, parkId, parkSlug, category }: Simi
.limit(4);
if (!error && data) {
setRides(data);
setRides(data as SimilarRide[]);
}
setLoading(false);
}