"use client"; import { useEffect, useState, useMemo, useCallback } from "react"; import { Carousel, CarouselContent, CarouselItem, type CarouselApi } from "./ui/carousel"; import Image from "next/image"; interface GalleryProps { images: { src: string }[]; } const Gallery = ({ images }: GalleryProps) => { const [mainApi, setMainApi] = useState(null); const [thumbnailApi, setThumbnailApi] = useState(null); const [current, setCurrent] = useState(0); const [isReady, setIsReady] = useState(false); const syncCarousels = useCallback( (index: number) => { if (mainApi && thumbnailApi) { setCurrent(index); mainApi.scrollTo(index); thumbnailApi.scrollTo(index); } }, [mainApi, thumbnailApi] ); const handleClick = useCallback( (index: number) => { syncCarousels(index); }, [syncCarousels] ); const mainImage = useMemo( () => images.map((image, index) => ( {`Carousel )), [images] ); const thumbnailImages = useMemo( () => images.map((image, index) => ( handleClick(index)} > {`Carousel )), [images, current, handleClick] ); useEffect(() => { if (!mainApi || !thumbnailApi) return; if (isReady) return; const handleMainSelect = () => { const selected = mainApi.selectedScrollSnap(); if (selected !== current) { syncCarousels(selected); } }; const handleThumbnailSelect = () => { const selected = thumbnailApi.selectedScrollSnap(); if (selected !== current) { syncCarousels(selected); } }; mainApi.on("select", handleMainSelect); thumbnailApi.on("select", handleThumbnailSelect); syncCarousels(0); setIsReady(true); return () => { mainApi.off("select", handleMainSelect); thumbnailApi.off("select", handleThumbnailSelect); }; }, [mainApi, thumbnailApi, current, syncCarousels, isReady]); return (
{mainImage} {thumbnailImages}
); }; export default Gallery;