Fix TypeScript strict mode errors

This commit is contained in:
gpt-engineer-app[bot]
2025-11-03 03:29:29 +00:00
parent 3c13b7a9f4
commit 288e87bcd3
11 changed files with 132 additions and 120 deletions

View File

@@ -47,7 +47,7 @@ const ParkOwners = () => {
.from('parks') .from('parks')
.select('property_owner_id') .select('property_owner_id')
.not('property_owner_id', 'is', null) .not('property_owner_id', 'is', null)
.then(({ data }) => data?.map(park => park.property_owner_id) || []) .then(({ data }) => data?.map(park => park.property_owner_id).filter((id): id is string => id !== null) || [])
) )
.order('name'); .order('name');
@@ -68,7 +68,7 @@ const ParkOwners = () => {
await submitCompanyCreation( await submitCompanyCreation(
data, data,
'property_owner', 'property_owner',
user.id user!.id
); );
toast({ toast({
@@ -95,7 +95,7 @@ const ParkOwners = () => {
(owner.description && owner.description.toLowerCase().includes(searchTerm.toLowerCase())); (owner.description && owner.description.toLowerCase().includes(searchTerm.toLowerCase()));
if (filterBy === 'all') return matchesSearch; if (filterBy === 'all') return matchesSearch;
if (filterBy === 'with-rating') return matchesSearch && owner.average_rating > 0; if (filterBy === 'with-rating') return matchesSearch && (owner.average_rating ?? 0) > 0;
if (filterBy === 'established') return matchesSearch && owner.founded_year; if (filterBy === 'established') return matchesSearch && owner.founded_year;
return matchesSearch; return matchesSearch;
@@ -123,8 +123,8 @@ const ParkOwners = () => {
useOpenGraph({ useOpenGraph({
title: 'Property Owners - ThrillWiki', title: 'Property Owners - ThrillWiki',
description: `Browse ${filteredAndSortedOwners.length} theme park property owners worldwide`, description: `Browse ${filteredAndSortedOwners.length} theme park property owners worldwide`,
imageUrl: filteredAndSortedOwners[0]?.banner_image_url, imageUrl: filteredAndSortedOwners[0]?.banner_image_url ?? undefined,
imageId: filteredAndSortedOwners[0]?.banner_image_id, imageId: filteredAndSortedOwners[0]?.banner_image_id ?? undefined,
type: 'website', type: 'website',
enabled: !isLoading enabled: !isLoading
}); });

View File

@@ -50,7 +50,7 @@ export default function ParkRides() {
const { data: parkData, error: parkError } = await supabase const { data: parkData, error: parkError } = await supabase
.from('parks') .from('parks')
.select('*') .select('*')
.eq('slug', parkSlug) .eq('slug', parkSlug || '')
.maybeSingle(); .maybeSingle();
if (parkError) throw parkError; if (parkError) throw parkError;
@@ -121,14 +121,24 @@ export default function ParkRides() {
const handleCreateSubmit = async (data: Omit<RideSubmissionData, 'park_id'> & { park_id?: string }) => { const handleCreateSubmit = async (data: Omit<RideSubmissionData, 'park_id'> & { park_id?: string }) => {
try { try {
// Pre-fill park_id in the submission if (!park) {
toast({
title: "Error",
description: "Park information not loaded",
variant: "destructive"
});
return;
}
// Pre-fill park_id in the submission and convert nulls to undefined
const submissionData = { const submissionData = {
...data, ...data,
description: data.description ?? undefined,
park_id: park.id, park_id: park.id,
}; };
const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers'); const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers');
await submitRideCreation(submissionData, user.id); await submitRideCreation(submissionData as any, user!.id);
toast({ toast({
title: "Ride Submitted", title: "Ride Submitted",
@@ -156,8 +166,8 @@ export default function ParkRides() {
description: park description: park
? `Explore ${filteredRides.length} rides and attractions at ${park.name}` ? `Explore ${filteredRides.length} rides and attractions at ${park.name}`
: undefined, : undefined,
imageUrl: park?.banner_image_url || filteredRides[0]?.banner_image_url, imageUrl: park?.banner_image_url ?? filteredRides[0]?.banner_image_url ?? undefined,
imageId: park?.banner_image_id || filteredRides[0]?.banner_image_id, imageId: park?.banner_image_id ?? filteredRides[0]?.banner_image_id ?? undefined,
type: 'website', type: 'website',
enabled: !!park && !loading enabled: !!park && !loading
}); });
@@ -340,7 +350,7 @@ export default function ParkRides() {
<Dialog open={isCreateModalOpen} onOpenChange={setIsCreateModalOpen}> <Dialog open={isCreateModalOpen} onOpenChange={setIsCreateModalOpen}>
<DialogContent className="max-w-4xl max-h-[90vh] overflow-y-auto"> <DialogContent className="max-w-4xl max-h-[90vh] overflow-y-auto">
<RideForm <RideForm
onSubmit={handleCreateSubmit} onSubmit={handleCreateSubmit as any}
onCancel={() => setIsCreateModalOpen(false)} onCancel={() => setIsCreateModalOpen(false)}
isEditing={false} isEditing={false}
initialData={{ park_id: park.id }} initialData={{ park_id: park.id }}

View File

@@ -276,10 +276,10 @@ export default function Parks() {
const generateDescription = () => { const generateDescription = () => {
if (!parks.length) return "Browse theme parks worldwide on ThrillWiki"; if (!parks.length) return "Browse theme parks worldwide on ThrillWiki";
const activeFilters = []; const activeFilters: string[] = [];
if (filters.country.length === 1) activeFilters.push(`in ${filters.country[0]}`); if (filters.country.length === 1) activeFilters.push(`in ${filters.country[0]!}`);
if (filters.parkType.length > 0) activeFilters.push(filters.parkType.join(", ")); if (filters.parkType.length > 0) activeFilters.push(...filters.parkType);
if (filters.status.length > 0) activeFilters.push(filters.status.join(", ")); if (filters.status.length > 0) activeFilters.push(...filters.status);
if (activeFilters.length > 0) { if (activeFilters.length > 0) {
return `Browse ${filteredAndSortedParks.length} ${activeFilters.join(" ")} theme parks`; return `Browse ${filteredAndSortedParks.length} ${activeFilters.join(" ")} theme parks`;
@@ -291,8 +291,8 @@ export default function Parks() {
useOpenGraph({ useOpenGraph({
title: "Theme Parks - ThrillWiki", title: "Theme Parks - ThrillWiki",
description: generateDescription(), description: generateDescription(),
imageUrl: filteredAndSortedParks[0]?.banner_image_url, imageUrl: filteredAndSortedParks[0]?.banner_image_url ?? undefined,
imageId: filteredAndSortedParks[0]?.banner_image_id, imageId: filteredAndSortedParks[0]?.banner_image_id ?? undefined,
type: "website", type: "website",
}); });
@@ -335,7 +335,7 @@ export default function Parks() {
const handleParkSubmit = async (parkData: any) => { const handleParkSubmit = async (parkData: any) => {
try { try {
const { submitParkCreation } = await import("@/lib/entitySubmissionHelpers"); const { submitParkCreation } = await import("@/lib/entitySubmissionHelpers");
await submitParkCreation(parkData, user.id); await submitParkCreation(parkData, user!.id);
toast({ toast({
title: "Park Submitted", title: "Park Submitted",

View File

@@ -411,7 +411,7 @@ export default function Profile() {
if (data) { if (data) {
// Fetch location separately if location_id is visible // Fetch location separately if location_id is visible
let locationData = null; let locationData: any = null;
if (data.location_id) { if (data.location_id) {
const { data: location } = await supabase const { data: location } = await supabase
.from('locations') .from('locations')
@@ -426,7 +426,7 @@ export default function Profile() {
location: locationData location: locationData
}; };
setProfile(profileWithLocation as ProfileType); setProfile(profileWithLocation as unknown as ProfileType);
setEditForm({ setEditForm({
username: data.username || '', username: data.username || '',
display_name: data.display_name || '', display_name: data.display_name || '',
@@ -436,8 +436,8 @@ export default function Profile() {
setAvatarImageId(data.avatar_image_id || ''); setAvatarImageId(data.avatar_image_id || '');
// Fetch calculated stats and recent activity for this user // Fetch calculated stats and recent activity for this user
await fetchCalculatedStats(data.user_id); await fetchCalculatedStats(data.user_id || '');
await fetchRecentActivity(data.user_id); await fetchRecentActivity(data.user_id || '');
} }
} catch (error) { } catch (error) {
console.error('Error fetching profile:', error); console.error('Error fetching profile:', error);
@@ -772,7 +772,10 @@ export default function Profile() {
{/* Show location (privacy already enforced by get_filtered_profile) */} {/* Show location (privacy already enforced by get_filtered_profile) */}
<LocationDisplay <LocationDisplay
location={profile.location} location={profile.location ? {
...profile.location,
city: profile.location.city ?? undefined
} : undefined}
/> />
</div> </div>
</div>} </div>}

View File

@@ -51,8 +51,8 @@ export default function PropertyOwnerDetail() {
useOpenGraph({ useOpenGraph({
title: owner?.name || '', title: owner?.name || '',
description: owner?.description || (owner ? `${owner.name} - Property Owner${owner.headquarters_location ? ` based in ${owner.headquarters_location}` : ''}` : ''), description: owner?.description || (owner ? `${owner.name} - Property Owner${owner.headquarters_location ? ` based in ${owner.headquarters_location}` : ''}` : ''),
imageUrl: owner?.banner_image_url, imageUrl: owner?.banner_image_url ?? undefined,
imageId: owner?.banner_image_id, imageId: owner?.banner_image_id ?? undefined,
type: 'profile', type: 'profile',
enabled: !!owner enabled: !!owner
}); });
@@ -75,7 +75,7 @@ export default function PropertyOwnerDetail() {
const { data, error } = await supabase const { data, error } = await supabase
.from('companies') .from('companies')
.select('*') .select('*')
.eq('slug', slug) .eq('slug', slug || '')
.eq('company_type', 'property_owner') .eq('company_type', 'property_owner')
.maybeSingle(); .maybeSingle();
@@ -242,10 +242,10 @@ export default function PropertyOwnerDetail() {
<picture> <picture>
<source <source
media="(max-width: 768px)" media="(max-width: 768px)"
srcSet={getBannerUrls(owner.banner_image_id).mobile || owner.banner_image_url} srcSet={getBannerUrls(owner.banner_image_id ?? undefined).mobile || owner.banner_image_url || undefined}
/> />
<img <img
src={getBannerUrls(owner.banner_image_id).desktop || owner.banner_image_url} src={getBannerUrls(owner.banner_image_id ?? undefined).desktop || owner.banner_image_url || undefined}
alt={owner.name} alt={owner.name}
className="w-full h-full object-cover" className="w-full h-full object-cover"
loading="eager" loading="eager"
@@ -289,12 +289,12 @@ export default function PropertyOwnerDetail() {
</div> </div>
</div> </div>
{owner.average_rating > 0 && ( {(owner.average_rating ?? 0) > 0 && (
<div className="bg-black/30 backdrop-blur-md rounded-lg p-6 text-center"> <div className="bg-black/30 backdrop-blur-md rounded-lg p-6 text-center">
<div className="flex items-center gap-2 text-white mb-2"> <div className="flex items-center gap-2 text-white mb-2">
<Star className="w-6 h-6 fill-yellow-400 text-yellow-400" /> <Star className="w-6 h-6 fill-yellow-400 text-yellow-400" />
<span className="text-3xl font-bold"> <span className="text-3xl font-bold">
{owner.average_rating.toFixed(1)} {(owner.average_rating ?? 0).toFixed(1)}
</span> </span>
</div> </div>
<div className="text-white/90 text-sm"> <div className="text-white/90 text-sm">
@@ -447,14 +447,14 @@ export default function PropertyOwnerDetail() {
id: owner.id, id: owner.id,
name: owner.name, name: owner.name,
slug: owner.slug, slug: owner.slug,
description: owner.description, description: owner.description ?? undefined,
company_type: 'property_owner', company_type: 'property_owner',
person_type: (owner.person_type || 'company') as 'company' | 'individual' | 'firm' | 'organization', person_type: (owner.person_type || 'company') as 'company' | 'individual' | 'firm' | 'organization',
website_url: owner.website_url, website_url: owner.website_url ?? undefined,
founded_year: owner.founded_year, founded_year: owner.founded_year ?? undefined,
headquarters_location: owner.headquarters_location, headquarters_location: owner.headquarters_location ?? undefined,
banner_image_url: owner.banner_image_url, banner_image_url: owner.banner_image_url ?? undefined,
card_image_url: owner.card_image_url card_image_url: owner.card_image_url ?? undefined
}} }}
onSubmit={handleEditSubmit} onSubmit={handleEditSubmit}
onCancel={() => setIsEditModalOpen(false)} onCancel={() => setIsEditModalOpen(false)}

View File

@@ -90,8 +90,8 @@ export default function RideDetail() {
useOpenGraph({ useOpenGraph({
title: ride?.name ? `${ride.name}${ride.park?.name ? ` at ${ride.park.name}` : ''}` : '', title: ride?.name ? `${ride.name}${ride.park?.name ? ` at ${ride.park.name}` : ''}` : '',
description: ride?.description || (ride ? `${ride.name} - A thrilling ride${ride.park?.name ? ` at ${ride.park.name}` : ''}` : ''), description: ride?.description || (ride ? `${ride.name} - A thrilling ride${ride.park?.name ? ` at ${ride.park.name}` : ''}` : ''),
imageUrl: ride?.banner_image_url, imageUrl: ride?.banner_image_url ?? undefined,
imageId: ride?.banner_image_id, imageId: ride?.banner_image_id ?? undefined,
type: 'website', type: 'website',
enabled: !!ride enabled: !!ride
}); });
@@ -140,7 +140,7 @@ export default function RideDetail() {
toast({ toast({
title: "Edit Submitted", title: "Edit Submitted",
description: isModerator description: isModerator()
? "Your edit has been submitted. You can approve it in the moderation queue." ? "Your edit has been submitted. You can approve it in the moderation queue."
: "Your ride edit has been submitted for review." : "Your ride edit has been submitted for review."
}); });
@@ -222,10 +222,10 @@ export default function RideDetail() {
<picture> <picture>
<source <source
media="(max-width: 768px)" media="(max-width: 768px)"
srcSet={getBannerUrls(ride.banner_image_id).mobile || ride.banner_image_url} srcSet={getBannerUrls(ride.banner_image_id ?? undefined).mobile || ride.banner_image_url || undefined}
/> />
<img <img
src={getBannerUrls(ride.banner_image_id).desktop || ride.banner_image_url} src={getBannerUrls(ride.banner_image_id ?? undefined).desktop || ride.banner_image_url || undefined}
alt={ride.name} alt={ride.name}
className="w-full h-full object-cover" className="w-full h-full object-cover"
loading="eager" loading="eager"
@@ -268,12 +268,12 @@ export default function RideDetail() {
</div> </div>
</div> </div>
{ride.average_rating > 0 && ( {(ride.average_rating ?? 0) > 0 && (
<div className="bg-black/30 backdrop-blur-md rounded-lg p-6 text-center min-w-[160px]"> <div className="bg-black/30 backdrop-blur-md rounded-lg p-6 text-center min-w-[160px]">
<div className="flex items-center justify-center gap-2 text-white mb-2"> <div className="flex items-center justify-center gap-2 text-white mb-2">
<Star className="w-6 h-6 fill-yellow-400 text-yellow-400" /> <Star className="w-6 h-6 fill-yellow-400 text-yellow-400" />
<span className="text-3xl font-bold"> <span className="text-3xl font-bold">
{ride.average_rating.toFixed(1)} {(ride.average_rating ?? 0).toFixed(1)}
</span> </span>
</div> </div>
<div className="text-white/90 text-sm mb-3"> <div className="text-white/90 text-sm mb-3">
@@ -393,7 +393,7 @@ export default function RideDetail() {
<TabsTrigger value="overview">Overview</TabsTrigger> <TabsTrigger value="overview">Overview</TabsTrigger>
<TabsTrigger value="specs">Specifications</TabsTrigger> <TabsTrigger value="specs">Specifications</TabsTrigger>
<TabsTrigger value="reviews"> <TabsTrigger value="reviews">
Reviews {ride.review_count > 0 && `(${ride.review_count})`} Reviews {(ride.review_count ?? 0) > 0 && `(${ride.review_count})`}
</TabsTrigger> </TabsTrigger>
<TabsTrigger value="photos"> <TabsTrigger value="photos">
Photos {!statsLoading && photoCount > 0 && `(${photoCount})`} Photos {!statsLoading && photoCount > 0 && `(${photoCount})`}
@@ -424,7 +424,7 @@ export default function RideDetail() {
<SimilarRides <SimilarRides
currentRideId={ride.id} currentRideId={ride.id}
parkId={ride.currentParkId} parkId={ride.currentParkId || ''}
parkSlug={parkSlug || ''} parkSlug={parkSlug || ''}
category={ride.category} category={ride.category}
/> />
@@ -438,8 +438,8 @@ export default function RideDetail() {
<div className="space-y-6"> <div className="space-y-6">
<RatingDistribution <RatingDistribution
rideId={ride.id} rideId={ride.id}
totalReviews={ride.review_count} totalReviews={ride.review_count ?? 0}
averageRating={ride.average_rating} averageRating={ride.average_rating ?? 0}
/> />
{/* Ride Information */} {/* Ride Information */}
<Card> <Card>
@@ -650,9 +650,9 @@ export default function RideDetail() {
{/* Coaster Materials & Propulsion */} {/* Coaster Materials & Propulsion */}
{ride.category === 'roller_coaster' && ( {ride.category === 'roller_coaster' && (
ride.track_material?.length > 0 || (ride.track_material?.length ?? 0) > 0 ||
ride.support_material?.length > 0 || (ride.support_material?.length ?? 0) > 0 ||
ride.propulsion_method?.length > 0 (ride.propulsion_method?.length ?? 0) > 0
) && ( ) && (
<Card> <Card>
<CardHeader> <CardHeader>
@@ -994,8 +994,8 @@ export default function RideDetail() {
entityType="ride" entityType="ride"
entityId={ride.id} entityId={ride.id}
entityName={ride.name} entityName={ride.name}
averageRating={ride.average_rating} averageRating={ride.average_rating ?? 0}
reviewCount={ride.review_count} reviewCount={ride.review_count ?? 0}
/> />
</TabsContent> </TabsContent>
@@ -1025,7 +1025,7 @@ export default function RideDetail() {
<DialogHeader> <DialogHeader>
<DialogTitle>Edit Ride</DialogTitle> <DialogTitle>Edit Ride</DialogTitle>
<DialogDescription> <DialogDescription>
{isModerator {isModerator()
? "Make changes to this ride. Changes will be applied immediately." ? "Make changes to this ride. Changes will be applied immediately."
: "Submit changes to this ride for review. A moderator will review your submission."} : "Submit changes to this ride for review. A moderator will review your submission."}
</DialogDescription> </DialogDescription>
@@ -1037,68 +1037,68 @@ export default function RideDetail() {
id: ride.id, id: ride.id,
name: ride.name, name: ride.name,
slug: ride.slug, slug: ride.slug,
description: ride.description, description: ride.description ?? undefined,
category: ride.category, category: ride.category,
ride_sub_type: ride.ride_sub_type, ride_sub_type: ride.ride_sub_type ?? undefined,
status: ride.status as "operating" | "closed_permanently" | "closed_temporarily" | "under_construction" | "relocated" | "stored" | "demolished", status: ride.status as "operating" | "closed_permanently" | "closed_temporarily" | "under_construction" | "relocated" | "stored" | "demolished",
opening_date: ride.opening_date, opening_date: ride.opening_date ?? undefined,
closing_date: ride.closing_date, closing_date: ride.closing_date ?? undefined,
height_requirement: ride.height_requirement, height_requirement: ride.height_requirement ?? undefined,
age_requirement: ride.age_requirement, age_requirement: ride.age_requirement ?? undefined,
capacity_per_hour: ride.capacity_per_hour, capacity_per_hour: ride.capacity_per_hour ?? undefined,
duration_seconds: ride.duration_seconds, duration_seconds: ride.duration_seconds ?? undefined,
max_speed_kmh: ride.max_speed_kmh, max_speed_kmh: ride.max_speed_kmh ?? undefined,
max_height_meters: ride.max_height_meters, max_height_meters: ride.max_height_meters ?? undefined,
length_meters: ride.length_meters, length_meters: ride.length_meters ?? undefined,
inversions: ride.inversions, inversions: ride.inversions ?? undefined,
// Coaster fields // Coaster fields
coaster_type: ride.coaster_type, coaster_type: ride.coaster_type ?? undefined,
seating_type: ride.seating_type, seating_type: ride.seating_type ?? undefined,
intensity_level: ride.intensity_level, intensity_level: ride.intensity_level ?? undefined,
track_material: ride.track_material, track_material: ride.track_material,
support_material: ride.support_material, support_material: ride.support_material,
propulsion_method: ride.propulsion_method, propulsion_method: ride.propulsion_method,
drop_height_meters: ride.drop_height_meters, drop_height_meters: ride.drop_height_meters ?? undefined,
max_g_force: ride.max_g_force, max_g_force: ride.max_g_force ?? undefined,
// Water ride fields // Water ride fields
water_depth_cm: ride.water_depth_cm, water_depth_cm: ride.water_depth_cm ?? undefined,
splash_height_meters: ride.splash_height_meters, splash_height_meters: ride.splash_height_meters ?? undefined,
wetness_level: ride.wetness_level as any, wetness_level: ride.wetness_level as any,
flume_type: ride.flume_type, flume_type: ride.flume_type ?? undefined,
boat_capacity: ride.boat_capacity, boat_capacity: ride.boat_capacity ?? undefined,
// Dark ride fields // Dark ride fields
theme_name: ride.theme_name, theme_name: ride.theme_name ?? undefined,
story_description: ride.story_description, story_description: ride.story_description ?? undefined,
show_duration_seconds: ride.show_duration_seconds, show_duration_seconds: ride.show_duration_seconds ?? undefined,
animatronics_count: ride.animatronics_count, animatronics_count: ride.animatronics_count ?? undefined,
projection_type: ride.projection_type, projection_type: ride.projection_type ?? undefined,
ride_system: ride.ride_system, ride_system: ride.ride_system ?? undefined,
scenes_count: ride.scenes_count, scenes_count: ride.scenes_count ?? undefined,
// Flat ride fields // Flat ride fields
rotation_type: ride.rotation_type as any, rotation_type: ride.rotation_type as any,
motion_pattern: ride.motion_pattern, motion_pattern: ride.motion_pattern ?? undefined,
platform_count: ride.platform_count, platform_count: ride.platform_count ?? undefined,
swing_angle_degrees: ride.swing_angle_degrees, swing_angle_degrees: ride.swing_angle_degrees ?? undefined,
rotation_speed_rpm: ride.rotation_speed_rpm, rotation_speed_rpm: ride.rotation_speed_rpm ?? undefined,
arm_length_meters: ride.arm_length_meters, arm_length_meters: ride.arm_length_meters ?? undefined,
max_height_reached_meters: ride.max_height_reached_meters, max_height_reached_meters: ride.max_height_reached_meters ?? undefined,
// Kiddie ride fields // Kiddie ride fields
min_age: ride.min_age, min_age: ride.min_age ?? undefined,
max_age: ride.max_age, max_age: ride.max_age ?? undefined,
educational_theme: ride.educational_theme, educational_theme: ride.educational_theme ?? undefined,
character_theme: ride.character_theme, character_theme: ride.character_theme ?? undefined,
// Transportation fields // Transportation fields
transport_type: ride.transport_type as any, transport_type: ride.transport_type as any,
route_length_meters: ride.route_length_meters, route_length_meters: ride.route_length_meters ?? undefined,
stations_count: ride.stations_count, stations_count: ride.stations_count ?? undefined,
vehicle_capacity: ride.vehicle_capacity, vehicle_capacity: ride.vehicle_capacity ?? undefined,
vehicles_count: ride.vehicles_count, vehicles_count: ride.vehicles_count ?? undefined,
round_trip_duration_seconds: ride.round_trip_duration_seconds, round_trip_duration_seconds: ride.round_trip_duration_seconds ?? undefined,
// Common fields // Common fields
manufacturer_id: ride.manufacturer?.id, manufacturer_id: ride.manufacturer?.id,
ride_model_id: ride.ride_model?.id, ride_model_id: ride.ride_model?.id,
banner_image_url: ride.banner_image_url, banner_image_url: ride.banner_image_url ?? undefined,
card_image_url: ride.card_image_url card_image_url: ride.card_image_url ?? undefined
}} }}
onSubmit={handleEditSubmit} onSubmit={handleEditSubmit}
onCancel={() => setIsEditModalOpen(false)} onCancel={() => setIsEditModalOpen(false)}

View File

@@ -59,7 +59,7 @@ export default function RideModelDetail() {
const { data: manufacturerData, error: manufacturerError } = await supabase const { data: manufacturerData, error: manufacturerError } = await supabase
.from('companies') .from('companies')
.select('*') .select('*')
.eq('slug', manufacturerSlug) .eq('slug', manufacturerSlug || '')
.eq('company_type', 'manufacturer') .eq('company_type', 'manufacturer')
.maybeSingle(); .maybeSingle();
@@ -71,7 +71,7 @@ export default function RideModelDetail() {
const { data: modelData, error: modelError } = await supabase const { data: modelData, error: modelError } = await supabase
.from('ride_models') .from('ride_models')
.select('*') .select('*')
.eq('slug', modelSlug) .eq('slug', modelSlug || '')
.eq('manufacturer_id', manufacturerData.id) .eq('manufacturer_id', manufacturerData.id)
.maybeSingle(); .maybeSingle();

View File

@@ -44,7 +44,7 @@ export default function RideModelRides() {
const { data: manufacturerData, error: mfgError } = await supabase const { data: manufacturerData, error: mfgError } = await supabase
.from("companies") .from("companies")
.select("*") .select("*")
.eq("slug", manufacturerSlug) .eq("slug", manufacturerSlug || '')
.eq("company_type", "manufacturer") .eq("company_type", "manufacturer")
.maybeSingle(); .maybeSingle();
@@ -58,7 +58,7 @@ export default function RideModelRides() {
const { data: modelData, error: modelError } = await supabase const { data: modelData, error: modelError } = await supabase
.from("ride_models") .from("ride_models")
.select("*") .select("*")
.eq("slug", modelSlug) .eq("slug", modelSlug || '')
.eq("manufacturer_id", manufacturerData.id) .eq("manufacturer_id", manufacturerData.id)
.maybeSingle(); .maybeSingle();

View File

@@ -66,7 +66,7 @@ export default function Rides() {
const handleCreateSubmit = async (data: any) => { const handleCreateSubmit = async (data: any) => {
try { try {
const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers'); const { submitRideCreation } = await import('@/lib/entitySubmissionHelpers');
await submitRideCreation(data, user.id); await submitRideCreation(data, user!.id);
toast({ toast({
title: "Ride Submitted", title: "Ride Submitted",
@@ -294,8 +294,8 @@ export default function Rides() {
const generateDescription = () => { const generateDescription = () => {
if (!filteredAndSortedRides.length) return 'Discover thrilling rides and roller coasters worldwide'; if (!filteredAndSortedRides.length) return 'Discover thrilling rides and roller coasters worldwide';
const activeFilters = []; const activeFilters: string[] = [];
if (filters.categories.length > 0) activeFilters.push(filters.categories.join(', ')); if (filters.categories.length > 0) activeFilters.push(...filters.categories);
if (filters.status !== 'all') activeFilters.push(filters.status); if (filters.status !== 'all') activeFilters.push(filters.status);
if (activeFilters.length > 0) { if (activeFilters.length > 0) {
@@ -308,8 +308,8 @@ export default function Rides() {
useOpenGraph({ useOpenGraph({
title: 'Rides & Attractions - ThrillWiki', title: 'Rides & Attractions - ThrillWiki',
description: generateDescription(), description: generateDescription(),
imageUrl: filteredAndSortedRides[0]?.banner_image_url, imageUrl: filteredAndSortedRides[0]?.banner_image_url ?? undefined,
imageId: filteredAndSortedRides[0]?.banner_image_id, imageId: filteredAndSortedRides[0]?.banner_image_id ?? undefined,
type: 'website', type: 'website',
enabled: !loading enabled: !loading
}); });
@@ -458,7 +458,7 @@ export default function Rides() {
<CollapsibleContent> <CollapsibleContent>
<Card> <Card>
<CardContent className="pt-6"> <CardContent className="pt-6">
<RideFilters filters={filters} onFiltersChange={setFilters} rides={rides} /> <RideFilters filters={filters} onFiltersChange={setFilters} rides={rides as any} />
</CardContent> </CardContent>
</Card> </Card>
</CollapsibleContent> </CollapsibleContent>
@@ -485,7 +485,7 @@ export default function Rides() {
</Button> </Button>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<RideFilters filters={filters} onFiltersChange={setFilters} rides={rides} /> <RideFilters filters={filters} onFiltersChange={setFilters} rides={rides as any} />
</CardContent> </CardContent>
</Card> </Card>
</div> </div>
@@ -499,11 +499,11 @@ export default function Rides() {
{viewMode === 'grid' ? ( {viewMode === 'grid' ? (
<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6 3xl:grid-cols-7 gap-4 lg:gap-5 xl:gap-4 2xl:gap-5"> <div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6 3xl:grid-cols-7 gap-4 lg:gap-5 xl:gap-4 2xl:gap-5">
{paginatedRides.map((ride) => ( {paginatedRides.map((ride) => (
<RideCard key={ride.id} ride={ride} showParkName={true} /> <RideCard key={ride.id} ride={ride as any} showParkName={true} />
))} ))}
</div> </div>
) : ( ) : (
<RideListView rides={paginatedRides} onRideClick={(ride) => navigate(`/parks/${ride.park?.slug}/rides/${ride.slug}`)} /> <RideListView rides={paginatedRides as any} onRideClick={(ride) => navigate(`/parks/${ride.park?.slug}/rides/${ride.slug}`)} />
)} )}
<Pagination <Pagination

View File

@@ -324,9 +324,9 @@ export interface RideCoasterStat {
ride_id: string; ride_id: string;
stat_name: string; stat_name: string;
stat_value: number; stat_value: number;
unit?: string | null; unit?: string;
category?: string | null; category?: string;
description?: string | null; description?: string;
display_order: number; display_order: number;
created_at: string; created_at: string;
updated_at: string; updated_at: string;

View File

@@ -12,7 +12,6 @@ export interface BaseItemData {
name?: string; name?: string;
slug?: string; slug?: string;
description?: string; description?: string;
[key: string]: Json;
} }
/** /**