'use client' import { useState, useEffect } from 'react' import { motion, AnimatePresence } from 'framer-motion' import Image from 'next/image' import { ChevronLeft, ChevronRight, Loader2 } from 'lucide-react' interface ImageSliderProps { images: { src: string alt: string title?: string }[] autoPlayInterval?: number } export default function ImageSlider({ images, autoPlayInterval = 5000 }: ImageSliderProps) { const [currentIndex, setCurrentIndex] = useState(0) const [imagesLoaded, setImagesLoaded] = useState(new Array(images.length).fill(false)) const [isLoading, setIsLoading] = useState(true) // Preload all images useEffect(() => { const preloadImages = async () => { const imagePromises = images.map((image, index) => { return new Promise((resolve, reject) => { const img = new window.Image() img.onload = () => { setImagesLoaded(prev => { const newLoaded = [...prev] newLoaded[index] = true return newLoaded }) resolve() } img.onerror = () => { console.warn(`Failed to load image: ${image.src}`) setImagesLoaded(prev => { const newLoaded = [...prev] newLoaded[index] = true // Mark as loaded even if failed to avoid infinite loading return newLoaded }) resolve() // Don't reject to avoid breaking the Promise.all } img.src = image.src }) }) try { await Promise.all(imagePromises) setIsLoading(false) } catch (error) { console.error('Error preloading images:', error) setIsLoading(false) } } preloadImages() }, [images]) useEffect(() => { if (autoPlayInterval > 0 && !isLoading) { const interval = setInterval(() => { setCurrentIndex((prev) => (prev + 1) % images.length) }, autoPlayInterval) return () => clearInterval(interval) } }, [images.length, autoPlayInterval, isLoading]) const goToPrevious = () => { setCurrentIndex((prev) => (prev - 1 + images.length) % images.length) } const goToNext = () => { setCurrentIndex((prev) => (prev + 1) % images.length) } const goToSlide = (index: number) => { setCurrentIndex(index) } return (
{/* Loading State */} {isLoading && (

Loading images...

)} {/* Image Container */} {images[currentIndex].alt} { setImagesLoaded(prev => { const newLoaded = [...prev] newLoaded[currentIndex] = true return newLoaded }) }} /> {/* Image Loading Skeleton */} {!imagesLoaded[currentIndex] && (
)} {/* Gradient Overlay */}
{/* Title Overlay */} {images[currentIndex].title && (
{images[currentIndex].title}
)} {/* Navigation Arrows - Only show when not loading */} {!isLoading && ( <> )} {/* Dots Indicator - Only show when not loading */} {!isLoading && (
{images.map((_, index) => (
)}
) }