import React, { useState, useEffect } from 'react'; import { getRecentItems } from '../lib/api'; import { useNavigate } from 'react-router-dom'; import { motion, AnimatePresence } from 'framer-motion'; import { Play, Info, ChevronLeft, ChevronRight } from 'lucide-react'; import { Link } from 'react-router-dom'; interface SlideItem { id: string; type: 'movie' | 'tvshow'; title: string; description: string; backdrop: string; genre?: string[]; year?: string | number; } interface DynamicHeroSlideshowProps { slides: SlideItem[]; autoplaySpeed?: number; } const DynamicHeroSlideshow: React.FC = ({ slides, autoplaySpeed = 6000 }) => { const [currentIndex, setCurrentIndex] = useState(0); const [isAutoplay, setIsAutoplay] = useState(true); const navigate = useNavigate(); useEffect(() => { if (!slides.length) return; let interval: NodeJS.Timeout | null = null; if (isAutoplay) { interval = setInterval(() => { setCurrentIndex((prevIndex) => (prevIndex + 1) % slides.length); }, autoplaySpeed); } return () => { if (interval) clearInterval(interval); }; }, [slides, isAutoplay, autoplaySpeed]); const handleNext = () => { setIsAutoplay(false); setCurrentIndex((prevIndex) => (prevIndex + 1) % slides.length); }; const handlePrev = () => { setIsAutoplay(false); setCurrentIndex((prevIndex) => (prevIndex - 1 + slides.length) % slides.length); }; const handleDotClick = (index: number) => { setIsAutoplay(false); setCurrentIndex(index); }; if (!slides.length) return null; const currentSlide = slides[currentIndex]; const path = currentSlide.type === 'movie' ? `/movie/${encodeURIComponent(currentSlide.title)}` : `/tv-show/${encodeURIComponent(currentSlide.title)}`; return (
{/* Backdrop Slideshow */} {currentSlide.title} { const target = e.target as HTMLImageElement; target.src = '/placeholder.svg'; }} />
{/* Navigation arrows */} {/* Content */}

{currentSlide.title}

{currentSlide.year && {currentSlide.year}} {currentSlide.genre && currentSlide.genre.length > 0 && ( {currentSlide.genre.slice(0, 3).join(' • ')} )} {currentSlide.type}

{currentSlide.description}

Play More Info
{/* Dots navigation */}
{slides.map((_, index) => (
); }; interface HeroSectionProps { // These props are still available if you need to override the API data, // but the API data will be used as the primary slides. type?: 'movie' | 'tvshow'; title?: string; description?: string; backdrop?: string; genre?: string[]; year?: string | number; } const HeroSection: React.FC = (props) => { const [slides, setSlides] = useState([]); const [isLoaded, setIsLoaded] = useState(false); useEffect(() => { const fetchSlides = async () => { try { // Fetch recent items from the API (change the limit as needed) const recentItems = await getRecentItems(5); // Map recent items to the slide format expected by DynamicHeroSlideshow const formattedSlides = recentItems.map((item: any, index: number) => ({ id: item.id || index.toString(), type: item.type, title: item.title, description: item.description, backdrop: item.image, // assuming the API returns "image" to be used as backdrop genre: item.genre || [], year: item.year, })); setSlides(formattedSlides); } catch (error) { console.error('Error fetching recent items:', error); } finally { setIsLoaded(true); } }; fetchSlides(); }, []); if (!isLoaded) { return (
); } return ; }; export default HeroSection;