From 6705e75379ea4c1bbefc27f97c66bcfac7c8151c Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 22:46:13 +0000 Subject: [PATCH] Add edit ride modal --- src/pages/RideDetail.tsx | 169 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 159 insertions(+), 10 deletions(-) diff --git a/src/pages/RideDetail.tsx b/src/pages/RideDetail.tsx index b5612795..2202fe37 100644 --- a/src/pages/RideDetail.tsx +++ b/src/pages/RideDetail.tsx @@ -6,6 +6,7 @@ import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Separator } from '@/components/ui/separator'; +import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { MapPin, Star, @@ -24,7 +25,8 @@ import { FerrisWheel, Waves, Theater, - Train + Train, + Edit } from 'lucide-react'; import { ReviewsSection } from '@/components/reviews/ReviewsSection'; import { MeasurementDisplay } from '@/components/ui/measurement-display'; @@ -37,6 +39,10 @@ import { RecentPhotosPreview } from '@/components/rides/RecentPhotosPreview'; import { ParkLocationMap } from '@/components/maps/ParkLocationMap'; import { Ride } from '@/types/database'; import { supabase } from '@/integrations/supabase/client'; +import { RideForm } from '@/components/admin/RideForm'; +import { useAuth } from '@/hooks/useAuth'; +import { useUserRole } from '@/hooks/useUserRole'; +import { toast } from '@/hooks/use-toast'; export default function RideDetail() { const { parkSlug, rideSlug } = useParams<{ parkSlug: string; rideSlug: string }>(); @@ -44,6 +50,9 @@ export default function RideDetail() { const [ride, setRide] = useState(null); const [loading, setLoading] = useState(true); const [activeTab, setActiveTab] = useState("overview"); + const [isEditModalOpen, setIsEditModalOpen] = useState(false); + const { user } = useAuth(); + const { isModerator } = useUserRole(); useEffect(() => { if (parkSlug && rideSlug) { @@ -115,6 +124,85 @@ export default function RideDetail() { ).join(' '); }; + const handleEditSubmit = async (data: any) => { + try { + if (isModerator) { + // Moderators can edit directly + const { error } = await supabase + .from('rides') + .update({ + name: data.name, + slug: data.slug, + description: data.description, + category: data.category, + ride_sub_type: data.ride_sub_type, + status: data.status, + opening_date: data.opening_date, + closing_date: data.closing_date, + height_requirement: data.height_requirement, + age_requirement: data.age_requirement, + capacity_per_hour: data.capacity_per_hour, + duration_seconds: data.duration_seconds, + max_speed_kmh: data.max_speed_kmh, + max_height_meters: data.max_height_meters, + length_meters: data.length_meters, + inversions: data.inversions, + coaster_type: data.coaster_type, + seating_type: data.seating_type, + intensity_level: data.intensity_level, + drop_height_meters: data.drop_height_meters, + max_g_force: data.max_g_force, + banner_image_url: data.banner_image_url, + banner_image_id: data.banner_image_id, + card_image_url: data.card_image_url, + card_image_id: data.card_image_id, + manufacturer_id: data.manufacturer_id, + ride_model_id: data.ride_model_id, + updated_at: new Date().toISOString() + }) + .eq('id', ride?.id); + + if (error) throw error; + + toast({ + title: "Ride Updated", + description: "The ride has been updated successfully." + }); + + setIsEditModalOpen(false); + fetchRideData(); // Refresh the ride data + } else { + // Regular users submit for moderation + const { error } = await supabase + .from('content_submissions') + .insert({ + user_id: user?.id, + submission_type: 'ride_edit', + content: { + ride_id: ride?.id, + ...data + }, + status: 'pending' + }); + + if (error) throw error; + + toast({ + title: "Edit Submitted", + description: "Your edit has been submitted for review." + }); + + setIsEditModalOpen(false); + } + } catch (error: any) { + toast({ + title: "Error", + description: error.message || "Failed to submit edit.", + variant: "destructive" + }); + } + }; + if (loading) { return (
@@ -155,15 +243,26 @@ export default function RideDetail() {
- {/* Back Button */} - + {/* Back Button and Edit Button */} +
+ + + {user && ( + + )} +
{/* Hero Section */}
@@ -631,6 +730,56 @@ export default function RideDetail() { /> + + {/* Edit Ride Modal */} + + + + Edit Ride + + {isModerator + ? "Make changes to this ride. Changes will be applied immediately." + : "Submit changes to this ride for review. A moderator will review your submission."} + + + {ride && ( + setIsEditModalOpen(false)} + isEditing={true} + /> + )} + +
);