import { useState } from 'react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { ParkCard } from '@/components/parks/ParkCard'; import { RideCard } from '@/components/rides/RideCard'; import { RecentChangeCard } from './RecentChangeCard'; import { Badge } from '@/components/ui/badge'; import { Clock } from 'lucide-react'; import { useHomepageTrendingParks, useHomepageTrendingRides } from '@/hooks/homepage/useHomepageTrending'; import { useHomepageRecentParks, useHomepageRecentRides } from '@/hooks/homepage/useHomepageRecent'; import { useHomepageRecentChanges } from '@/hooks/homepage/useHomepageRecentChanges'; import { useHomepageRecentlyOpenedParks, useHomepageRecentlyOpenedRides } from '@/hooks/homepage/useHomepageOpened'; import { useHomepageHighestRatedParks, useHomepageHighestRatedRides } from '@/hooks/homepage/useHomepageRated'; import { useHomepageOpeningSoonParks, useHomepageOpeningSoonRides } from '@/hooks/homepage/useHomepageOpeningSoon'; import { useHomepageClosingSoonParks, useHomepageClosingSoonRides } from '@/hooks/homepage/useHomepageClosing'; import { useHomepageRecentlyClosedParks, useHomepageRecentlyClosedRides } from '@/hooks/homepage/useHomepageClosed'; export function ContentTabs() { const [activeTab, setActiveTab] = useState('trending-parks'); // Lazy load data - only fetch when tab is active const trendingParks = useHomepageTrendingParks(activeTab === 'trending-parks'); const trendingRides = useHomepageTrendingRides(activeTab === 'trending-rides'); const recentParks = useHomepageRecentParks(activeTab === 'recent-parks'); const recentRides = useHomepageRecentRides(activeTab === 'recent-rides'); const recentChanges = useHomepageRecentChanges(activeTab === 'recent-changes'); const recentlyOpenedParks = useHomepageRecentlyOpenedParks(activeTab === 'recently-opened'); const recentlyOpenedRides = useHomepageRecentlyOpenedRides(activeTab === 'recently-opened'); const highestRatedParks = useHomepageHighestRatedParks(activeTab === 'highest-rated-parks'); const highestRatedRides = useHomepageHighestRatedRides(activeTab === 'highest-rated-rides'); const openingSoonParks = useHomepageOpeningSoonParks(activeTab === 'opening-soon'); const openingSoonRides = useHomepageOpeningSoonRides(activeTab === 'opening-soon'); const closingSoonParks = useHomepageClosingSoonParks(activeTab === 'closing-soon'); const closingSoonRides = useHomepageClosingSoonRides(activeTab === 'closing-soon'); const recentlyClosedParks = useHomepageRecentlyClosedParks(activeTab === 'recently-closed'); const recentlyClosedRides = useHomepageRecentlyClosedRides(activeTab === 'recently-closed'); // Combine parks and rides for mixed tabs const recentlyOpened = [ ...(recentlyOpenedParks.data || []).map(p => ({ ...p, entityType: 'park' as const })), ...(recentlyOpenedRides.data || []).map(r => ({ ...r, entityType: 'ride' as const })) ].sort((a, b) => new Date(b.opening_date || 0).getTime() - new Date(a.opening_date || 0).getTime()).slice(0, 24); const openingSoon = [ ...(openingSoonParks.data || []).map(p => ({ ...p, entityType: 'park' as const })), ...(openingSoonRides.data || []).map(r => ({ ...r, entityType: 'ride' as const })) ].sort((a, b) => new Date(a.opening_date || 0).getTime() - new Date(b.opening_date || 0).getTime()).slice(0, 24); const closingSoon = [ ...(closingSoonParks.data || []).map(p => ({ ...p, entityType: 'park' as const })), ...(closingSoonRides.data || []).map(r => ({ ...r, entityType: 'ride' as const })) ].sort((a, b) => new Date(a.closing_date || 0).getTime() - new Date(b.closing_date || 0).getTime()).slice(0, 24); const recentlyClosed = [ ...(recentlyClosedParks.data || []).map(p => ({ ...p, entityType: 'park' as const })), ...(recentlyClosedRides.data || []).map(r => ({ ...r, entityType: 'ride' as const })) ].sort((a, b) => new Date(b.closing_date || 0).getTime() - new Date(a.closing_date || 0).getTime()).slice(0, 24); const isLoadingInitial = activeTab === 'trending-parks' && trendingParks.isLoading; if (isLoadingInitial) { return (
{[...Array(12)].map((_, i) => (
))}
); } return (
Trending Parks Trending Rides New Parks New Rides Recent Changes Top Parks Top Rides Opening Soon Recently Opened Closing Soon Recently Closed

Trending Parks

Most viewed parks in the last 30 days

{trendingParks.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : (
{trendingParks.data?.map((park) => ( ))}
)}

Trending Rides

Most viewed rides in the last 30 days

{trendingRides.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : (
{trendingRides.data?.map((ride) => ( ))}
)}

Recently Added Parks

Latest parks added to our database

{recentParks.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : (
{recentParks.data?.map((park) => ( ))}
)}

Recently Added Rides

Latest attractions added to our database

{recentRides.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : (
{recentRides.data?.map((ride) => ( ))}
)}

Recent Changes

Latest updates across all entities

{recentChanges.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : recentChanges.data && recentChanges.data.length > 0 ? (
{recentChanges.data.map((change) => ( ))}
) : (

No Recent Changes

There are no recent entity changes to display yet. Check back soon for the latest updates to parks, rides, and companies!

)}

Recently Opened

Parks and rides that opened in the last year

{recentlyOpenedParks.isLoading || recentlyOpenedRides.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : (
{recentlyOpened.map((entity) => ( entity.entityType === 'park' ? (
{entity.opening_date && ( {new Date(entity.opening_date).getFullYear()} )}
) : (
{entity.opening_date && ( {new Date(entity.opening_date).getFullYear()} )}
) ))}
)}

Highest Rated Parks

Top-rated theme parks based on visitor reviews

{highestRatedParks.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : highestRatedParks.data && highestRatedParks.data.length > 0 ? (
{highestRatedParks.data.map((park) => ( ))}
) : (
No rated parks available yet. Be the first to leave a review!
)}

Highest Rated Rides

Top-rated attractions based on rider reviews

{highestRatedRides.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : highestRatedRides.data && highestRatedRides.data.length > 0 ? (
{highestRatedRides.data.map((ride) => ( ))}
) : (
No rated rides available yet. Be the first to leave a review!
)}

Opening Soon

Parks and rides opening in the next 6 months

{openingSoonParks.isLoading || openingSoonRides.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : openingSoon.length > 0 ? (
{openingSoon.map((entity: any) => ( entity.entityType === 'park' ? (
{new Date(entity.opening_date).toLocaleDateString('en-US', { month: 'short', year: 'numeric' })}
) : (
{new Date(entity.opening_date).toLocaleDateString('en-US', { month: 'short', year: 'numeric' })}
) ))}
) : (
No parks or rides scheduled to open in the next 6 months.
)}

Closing Soon

Last chance: Parks and rides closing in the next 6 months

{closingSoonParks.isLoading || closingSoonRides.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : closingSoon.length > 0 ? (
{closingSoon.map((entity: any) => ( entity.entityType === 'park' ? (
Closes {new Date(entity.closing_date).toLocaleDateString('en-US', { month: 'short', year: 'numeric' })}
) : (
Closes {new Date(entity.closing_date).toLocaleDateString('en-US', { month: 'short', year: 'numeric' })}
) ))}
) : (
No parks or rides scheduled to close in the next 6 months.
)}

Recently Closed

Parks and rides that closed in the last year

{recentlyClosedParks.isLoading || recentlyClosedRides.isLoading ? (
{[...Array(12)].map((_, i) => (
))}
) : recentlyClosed.length > 0 ? (
{recentlyClosed.map((entity: any) => ( entity.entityType === 'park' ? (
Closed {new Date(entity.closing_date).getFullYear()}
) : (
Closed {new Date(entity.closing_date).getFullYear()}
) ))}
) : (
No parks or rides closed in the last year.
)}
); }