import { useState, useEffect, lazy, Suspense } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Header } from '@/components/layout/Header'; import { trackPageView } from '@/lib/viewTracking'; import { getBannerUrls } from '@/lib/cloudflareImageUtils'; 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 { AdminFormSkeleton } from '@/components/loading/PageSkeletons'; import { ArrowLeft, MapPin, Star, Globe, Calendar, Edit, Building2, Gauge } from 'lucide-react'; import { Company, Park } from '@/types/database'; import { supabase } from '@/lib/supabaseClient'; import { PropertyOwnerPhotoGallery } from '@/components/companies/PropertyOwnerPhotoGallery'; import { ParkCard } from '@/components/parks/ParkCard'; import { handleNonCriticalError } from '@/lib/errorHandler'; // Lazy load admin form const PropertyOwnerForm = lazy(() => import('@/components/admin/PropertyOwnerForm').then(m => ({ default: m.PropertyOwnerForm }))); import { useAuth } from '@/hooks/useAuth'; import { useUserRole } from '@/hooks/useUserRole'; import { toast } from '@/hooks/use-toast'; import { getErrorMessage } from '@/lib/errorHandler'; import { submitCompanyUpdate } from '@/lib/companyHelpers'; import { VersionIndicator } from '@/components/versioning/VersionIndicator'; import { EntityHistoryTabs } from '@/components/history/EntityHistoryTabs'; import { useAuthModal } from '@/hooks/useAuthModal'; import { useDocumentTitle } from '@/hooks/useDocumentTitle'; import { useOpenGraph } from '@/hooks/useOpenGraph'; export default function PropertyOwnerDetail() { const { slug } = useParams<{ slug: string }>(); const navigate = useNavigate(); const [owner, setOwner] = useState(null); const [parks, setParks] = useState([]); const [loading, setLoading] = useState(true); const [parksLoading, setParksLoading] = useState(true); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [totalParks, setTotalParks] = useState(0); const [operatingRides, setOperatingRides] = useState(0); const [statsLoading, setStatsLoading] = useState(true); const [totalPhotos, setTotalPhotos] = useState(0); const { user } = useAuth(); const { isModerator } = useUserRole(); const { requireAuth } = useAuthModal(); // Update document title when owner changes useDocumentTitle(owner?.name || 'Property Owner Details'); // Update Open Graph meta tags useOpenGraph({ title: owner?.name || '', description: owner?.description || (owner ? `${owner.name} - Property Owner${owner.headquarters_location ? ` based in ${owner.headquarters_location}` : ''}` : ''), imageUrl: owner?.banner_image_url ?? undefined, imageId: owner?.banner_image_id ?? undefined, type: 'profile', enabled: !!owner }); useEffect(() => { if (slug) { fetchOwnerData(); } }, [slug]); // Track page view when property owner is loaded useEffect(() => { if (owner?.id) { trackPageView('company', owner.id); } }, [owner?.id]); const fetchOwnerData = async () => { try { const { data, error } = await supabase .from('companies') .select('*') .eq('slug', slug || '') .eq('company_type', 'property_owner') .maybeSingle(); if (error) throw error; setOwner(data); // Fetch parks owned by this property owner if (data) { fetchParks(data.id); fetchStatistics(data.id); fetchPhotoCount(data.id); } } catch (error) { handleNonCriticalError(error, { action: 'Fetch Property Owner', metadata: { slug } }); } finally { setLoading(false); } }; const fetchParks = async (ownerId: string) => { try { const { data, error } = await supabase .from('parks') .select(` *, location:locations(*) `) .eq('property_owner_id', ownerId) .order('name') .limit(6); if (error) throw error; setParks(data || []); } catch (error) { handleNonCriticalError(error, { action: 'Fetch Owner Parks', metadata: { ownerId } }); } finally { setParksLoading(false); } }; const fetchStatistics = async (ownerId: string) => { try { // Get total parks count const { count: parksCount, error: parksError } = await supabase .from('parks') .select('id', { count: 'exact', head: true }) .eq('property_owner_id', ownerId); if (parksError) throw parksError; setTotalParks(parksCount || 0); // Get operating rides count across all owned parks const { data: ridesData, error: ridesError } = await supabase .from('rides') .select('id, parks!inner(property_owner_id)') .eq('parks.property_owner_id', ownerId) .eq('status', 'operating'); if (ridesError) throw ridesError; setOperatingRides(ridesData?.length || 0); } catch (error) { handleNonCriticalError(error, { action: 'Fetch Owner Statistics', metadata: { ownerId } }); } finally { setStatsLoading(false); } }; const fetchPhotoCount = async (ownerId: string) => { try { const { count, error } = await supabase .from('photos') .select('id', { count: 'exact', head: true }) .eq('entity_type', 'property_owner') .eq('entity_id', ownerId); if (error) throw error; setTotalPhotos(count || 0); } catch (error) { handleNonCriticalError(error, { action: 'Fetch Owner Photo Count', metadata: { ownerId } }); setTotalPhotos(0); } }; const handleEditSubmit = async (data: any) => { try { await submitCompanyUpdate( owner!.id, data, user!.id ); toast({ title: "Edit Submitted", description: "Your edit has been submitted for review." }); setIsEditModalOpen(false); } catch (error) { const errorMsg = getErrorMessage(error); toast({ title: "Error", description: errorMsg || "Failed to submit edit.", variant: "destructive" }); } }; if (loading) { return (
); } if (!owner) { return (

Property Owner Not Found

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

{owner.name}

{owner.headquarters_location && (
{owner.headquarters_location}
)}
{(owner.average_rating ?? 0) > 0 && (
{(owner.average_rating ?? 0).toFixed(1)}
{owner.review_count} {owner.review_count === 1 ? "review" : "reviews"}
)}
{/* Company Info */}
{!statsLoading && totalParks > 0 && (
{totalParks}
{totalParks === 1 ? 'Park Owned' : 'Parks Owned'}
)} {!statsLoading && operatingRides > 0 && (
{operatingRides}
Operating {operatingRides === 1 ? 'Ride' : 'Rides'}
)} {owner.founded_year && (
{owner.founded_year}
Founded
)} {owner.website_url && ( Visit Website )}
{/* Tabs */} Overview Parks {!statsLoading && totalParks > 0 && `(${totalParks})`} Photos {!statsLoading && totalPhotos > 0 && `(${totalPhotos})`} History {owner.description && (

About

{owner.description}

)}

Parks Owned

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

No parks found for {owner.name}

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