mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 10:11:13 -05:00
Fix TypeScript strict mode errors
This commit is contained in:
@@ -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
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,
|
||||||
park_id: park.id,
|
description: data.description ?? undefined,
|
||||||
};
|
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 }}
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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>}
|
||||||
|
|||||||
@@ -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,13 +289,13 @@ 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">
|
||||||
{owner.review_count} {owner.review_count === 1 ? "review" : "reviews"}
|
{owner.review_count} {owner.review_count === 1 ? "review" : "reviews"}
|
||||||
@@ -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)}
|
||||||
|
|||||||
@@ -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)}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ export interface BaseItemData {
|
|||||||
name?: string;
|
name?: string;
|
||||||
slug?: string;
|
slug?: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
[key: string]: Json;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user