"use client"; import { useEffect, useState, useMemo } 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(); const [thumbnailApi, setThumbnailApi] = useState(); const [current, setCurrent] = useState(0); const mainImage = useMemo( () => images.map((image, index) => ( {`Carousel )), [images] ); const thumbnailImages = useMemo( () => images.map((image, index) => ( handleClick(index)}> {`Carousel )), // eslint-disable-next-line react-hooks/exhaustive-deps [images, current] ); useEffect(() => { if (!mainApi || !thumbnailApi) { return; } const handleTopSelect = () => { const selected = mainApi.selectedScrollSnap(); setCurrent(selected); thumbnailApi.scrollTo(selected); }; const handleBottomSelect = () => { const selected = thumbnailApi.selectedScrollSnap(); setCurrent(selected); mainApi.scrollTo(selected); }; mainApi.on("select", handleTopSelect); thumbnailApi.on("select", handleBottomSelect); return () => { mainApi.off("select", handleTopSelect); thumbnailApi.off("select", handleBottomSelect); }; }, [mainApi, thumbnailApi]); const handleClick = (index: number) => { if (!mainApi || !thumbnailApi) { return; } thumbnailApi.scrollTo(index); mainApi.scrollTo(index); setCurrent(index); }; return (
{mainImage} {thumbnailImages}
); }; export default Gallery;