import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Header } from '@/components/layout/Header'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Dialog, DialogContent } from '@/components/ui/dialog'; import { ArrowLeft, MapPin, Star, Globe, Calendar, Edit, FerrisWheel } from 'lucide-react'; import { Company } from '@/types/database'; import { supabase } from '@/integrations/supabase/client'; import { OperatorForm } from '@/components/admin/OperatorForm'; import { OperatorPhotoGallery } from '@/components/companies/OperatorPhotoGallery'; import { ParkCard } from '@/components/parks/ParkCard'; import { useAuth } from '@/hooks/useAuth'; import { useUserRole } from '@/hooks/useUserRole'; import { toast } from '@/hooks/use-toast'; import { submitCompanyUpdate } from '@/lib/companyHelpers'; import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityVersionHistory } from '@/components/versioning/EntityVersionHistory'; import { EntityHistoryTimeline, HistoryEvent } from '@/components/history/EntityHistoryTimeline'; import { FormerNamesSection } from '@/components/history/FormerNamesSection'; export default function OperatorDetail() { const { slug } = useParams<{ slug: string }>(); const navigate = useNavigate(); const [operator, setOperator] = useState(null); const [parks, setParks] = useState([]); const [loading, setLoading] = useState(true); const [parksLoading, setParksLoading] = useState(true); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const { user } = useAuth(); const { isModerator } = useUserRole(); useEffect(() => { if (slug) { fetchOperatorData(); } }, [slug]); const fetchOperatorData = async () => { try { const { data, error } = await supabase .from('companies') .select('*') .eq('slug', slug) .eq('company_type', 'operator') .maybeSingle(); if (error) throw error; setOperator(data); // Fetch parks operated by this operator if (data) { fetchParks(data.id); } } catch (error) { console.error('Error fetching operator:', error); } finally { setLoading(false); } }; const fetchParks = async (operatorId: string) => { try { const { data, error } = await supabase .from('parks') .select(` *, location:locations(*) `) .eq('operator_id', operatorId) .order('name') .limit(6); if (error) throw error; setParks(data || []); } catch (error) { console.error('Error fetching parks:', error); } finally { setParksLoading(false); } }; const handleEditSubmit = async (data: any) => { try { await submitCompanyUpdate( operator!.id, data, user!.id ); 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 (
); } if (!operator) { return (

Operator Not Found

); } return (
{/* Back Button and Edit Button */}
{/* Hero Section */}
{(operator.banner_image_url || operator.banner_image_id) ? ( {operator.name} ) : operator.logo_url ? (
{operator.name}
) : (
)}
Operator

{operator.name}

{operator.headquarters_location && (
{operator.headquarters_location}
)}
{operator.average_rating > 0 && (
{operator.average_rating.toFixed(1)}
{operator.review_count} {operator.review_count === 1 ? "review" : "reviews"}
)}
{/* Company Info */}
{operator.founded_year && (
{operator.founded_year}
Founded
)} {operator.website_url && ( Visit Website )}
{/* Tabs */} Overview Parks Photos History {operator.description && (

About

{operator.description}

)}

Parks Operated

{parksLoading ? (
{[1, 2, 3].map((i) => (
))}
) : parks.length > 0 ? (
{parks.map((park) => ( ))}
) : (

No parks found for {operator.name}

)} Company History Version History
{/* Edit Modal */} setIsEditModalOpen(false)} />
); }