import { useState, useEffect, lazy, Suspense } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { EntityBreadcrumb } from '@/components/navigation/EntityBreadcrumb'; import { CompanyDetailSkeleton } from '@/components/loading/CompanyDetailSkeleton'; import { Header } from '@/components/layout/Header'; 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, Ruler } from 'lucide-react'; import { Company } from '@/types/database'; import { supabase } from '@/lib/supabaseClient'; import { DesignerPhotoGallery } from '@/components/companies/DesignerPhotoGallery'; import { handleNonCriticalError } from '@/lib/errorHandler'; // Lazy load admin form const DesignerForm = lazy(() => import('@/components/admin/DesignerForm').then(m => ({ default: m.DesignerForm }))); 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 { trackPageView } from '@/lib/viewTracking'; import { useAuthModal } from '@/hooks/useAuthModal'; import { useDocumentTitle } from '@/hooks/useDocumentTitle'; import { useOpenGraph } from '@/hooks/useOpenGraph'; export default function DesignerDetail() { const { slug } = useParams<{ slug: string }>(); const navigate = useNavigate(); const [designer, setDesigner] = useState(null); const [loading, setLoading] = useState(true); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [totalRides, setTotalRides] = useState(0); const [totalPhotos, setTotalPhotos] = useState(0); const [statsLoading, setStatsLoading] = useState(true); const { user } = useAuth(); const { isModerator } = useUserRole(); const { requireAuth } = useAuthModal(); // Update document title when designer changes useDocumentTitle(designer?.name || 'Designer Details'); // Update Open Graph meta tags useOpenGraph({ title: designer?.name || '', description: designer?.description ?? (designer ? `${designer.name} - Ride Designer${designer.headquarters_location ? ` based in ${designer.headquarters_location}` : ''}` : ''), imageUrl: designer?.banner_image_url ?? undefined, imageId: designer?.banner_image_id ?? undefined, type: 'profile', enabled: !!designer }); useEffect(() => { if (slug) { fetchDesignerData(); } }, [slug]); // Track page view when designer is loaded useEffect(() => { if (designer?.id) { trackPageView('company', designer.id); } }, [designer?.id]); const fetchDesignerData = async () => { try { const { data, error } = await supabase .from('companies') .select('*') .eq('slug', slug || '') .eq('company_type', 'designer') .maybeSingle(); if (error) throw error; setDesigner(data); if (data) { fetchStatistics(data.id); } } catch (error) { handleNonCriticalError(error, { action: 'Fetch designer', metadata: { slug } }); } finally { setLoading(false); } }; const fetchStatistics = async (designerId: string) => { try { // Count rides const { count: ridesCount, error: ridesError } = await supabase .from('rides') .select('id', { count: 'exact', head: true }) .eq('designer_id', designerId); if (ridesError) throw ridesError; setTotalRides(ridesCount || 0); // Count photos const { count: photosCount, error: photosError } = await supabase .from('photos') .select('id', { count: 'exact', head: true }) .eq('entity_type', 'designer') .eq('entity_id', designerId); if (photosError) throw photosError; setTotalPhotos(photosCount || 0); } catch (error) { handleNonCriticalError(error, { action: 'Fetch designer statistics', metadata: { designerId } }); } finally { setStatsLoading(false); } }; const handleEditSubmit = async (data: any) => { try { await submitCompanyUpdate( designer!.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, variant: "destructive" }); } }; if (loading) { return (
); } if (!designer) { return (

Designer Not Found

); } return (
{/* Breadcrumb Navigation */} {/* Edit Button */}
{/* Hero Section */}
{(designer.banner_image_url || designer.banner_image_id) ? ( {designer.name} ) : designer.logo_url ? (
{designer.name}
) : (
)}
Designer

{designer.name}

{designer.headquarters_location && (
{designer.headquarters_location}
)}
{(designer.average_rating ?? 0) > 0 && (
{(designer.average_rating ?? 0).toFixed(1)}
{designer.review_count} {designer.review_count === 1 ? "review" : "reviews"}
)}
{/* Company Info */}
{designer.founded_year && (
{designer.founded_year}
Founded
)} {designer.website_url && ( Visit Website )}
{/* Tabs */} Overview Rides {!statsLoading && totalRides > 0 && `(${totalRides})`} Photos {!statsLoading && totalPhotos > 0 && `(${totalPhotos})`} History {designer.description && (

About

{designer.description}

)}

Rides

View all rides designed by {designer.name}

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