From c504f25a6459624822a9fd6ead11dd26d1449815 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 20:09:09 +0000 Subject: [PATCH] feat: Implement add ride modal and moderation --- src/pages/ParkDetail.tsx | 74 +++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/src/pages/ParkDetail.tsx b/src/pages/ParkDetail.tsx index c9a84ce7..7c0005ba 100644 --- a/src/pages/ParkDetail.tsx +++ b/src/pages/ParkDetail.tsx @@ -8,13 +8,15 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Separator } from '@/components/ui/separator'; import { MapPin, Star, Clock, Phone, Globe, Calendar, ArrowLeft, Users, Zap, Camera, Castle, FerrisWheel, Waves, Tent, Plus } from 'lucide-react'; import { useAuth } from '@/hooks/useAuth'; -import { useUserRole } from '@/hooks/useUserRole'; import { ReviewsSection } from '@/components/reviews/ReviewsSection'; import { RideCard } from '@/components/rides/RideCard'; import { Park, Ride } from '@/types/database'; import { ParkLocationMap } from '@/components/maps/ParkLocationMap'; import { EntityPhotoGallery } from '@/components/upload/EntityPhotoGallery'; import { supabase } from '@/integrations/supabase/client'; +import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { RideForm } from '@/components/admin/RideForm'; +import { toast } from '@/hooks/use-toast'; export default function ParkDetail() { const { slug @@ -23,10 +25,10 @@ export default function ParkDetail() { }>(); const navigate = useNavigate(); const { user } = useAuth(); - const { isModerator, isAdmin } = useUserRole(); const [park, setPark] = useState(null); const [rides, setRides] = useState([]); const [loading, setLoading] = useState(true); + const [isAddRideModalOpen, setIsAddRideModalOpen] = useState(false); useEffect(() => { if (slug) { fetchParkData(); @@ -87,6 +89,48 @@ export default function ParkDetail() { const formatParkType = (type: string) => { return type.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); }; + + const handleAddRideClick = () => { + if (!user) { + navigate('/auth'); + return; + } + setIsAddRideModalOpen(true); + }; + + const handleRideSubmit = async (rideData: any) => { + if (!user) return; + + try { + const { error } = await supabase + .from('content_submissions') + .insert({ + user_id: user.id, + submission_type: 'ride', + status: 'pending', + content: { + ...rideData, + park_id: park?.id, + park_slug: park?.slug + } + }); + + if (error) throw error; + + toast({ + title: "Ride Submitted", + description: "Your ride submission has been sent for moderation review.", + }); + + setIsAddRideModalOpen(false); + } catch (error: any) { + toast({ + title: "Submission Failed", + description: error.message || "Failed to submit ride for review.", + variant: "destructive" + }); + } + }; if (loading) { return
@@ -416,12 +460,10 @@ export default function ParkDetail() { {/* Header with Add Ride button */}

Rides at {park.name}

- {user && (isModerator() || isAdmin()) && ( - - )} +
{/* Conditional rendering */} @@ -460,6 +502,22 @@ export default function ParkDetail() { /> + + {/* Add Ride Modal */} + + + + Add New Ride to {park.name} + + Submit a new ride for moderation. All submissions are reviewed before being published. + + + setIsAddRideModalOpen(false)} + /> + +
; } \ No newline at end of file