import { useEffect, useRef, useState } from "react"; import { Carousel, CarouselContent, CarouselItem, } from "@/components/ui/carousel"; import { PhotoProvider, PhotoView } from "react-photo-view"; import "react-photo-view/dist/react-photo-view.css"; import { RiArrowLeftLine, RiArrowRightLine, RiPlayCircleFill, } from "react-icons/ri"; import { useSelector } from "react-redux"; import { getIsRtl } from "@/redux/reducer/languageSlice"; import ReactPlayer from "react-player"; import { getPlaceholderImage } from "@/redux/reducer/settingSlice"; import CustomImage from "@/components/Common/CustomImage"; const ProductGallery = ({ galleryImages, videoData }) => { const [selectedIndex, setSelectedIndex] = useState(0); // -1 means video const carouselApi = useRef(null); const isRTL = useSelector(getIsRtl); const placeHolderImage = useSelector(getPlaceholderImage); const hasVideo = videoData?.url; useEffect(() => { if (!carouselApi.current) return; // If no video, we use this normally const handleSelect = () => { const index = carouselApi.current.selectedScrollSnap(); setSelectedIndex(index); }; carouselApi.current.on("select", handleSelect); setSelectedIndex(carouselApi.current.selectedScrollSnap()); return () => { carouselApi.current?.off("select", handleSelect); }; }, []); const handlePrevImage = () => { if (!carouselApi.current) return; if (selectedIndex === -1) { // From video, go to last image const lastImageIndex = galleryImages.length - 1; carouselApi.current.scrollTo(lastImageIndex); setSelectedIndex(lastImageIndex); } else if (selectedIndex === 0) { if (hasVideo) { setSelectedIndex(-1); } else { const lastIndex = galleryImages.length - 1; carouselApi.current.scrollTo(lastIndex); setSelectedIndex(lastIndex); } } else { const newIndex = selectedIndex - 1; carouselApi.current.scrollTo(newIndex); setSelectedIndex(newIndex); } }; const handleNextImage = () => { if (!carouselApi.current) return; if (selectedIndex === -1) { // From video, go to first image carouselApi.current.scrollTo(0); setSelectedIndex(0); } else if (selectedIndex === galleryImages.length - 1) { // From last image, go to video if (hasVideo) { // Go to video setSelectedIndex(-1); } else { // Loop to first image carouselApi.current.scrollTo(0); setSelectedIndex(0); } } else { const newIndex = (selectedIndex + 1) % galleryImages.length; carouselApi.current.scrollTo(newIndex); setSelectedIndex(newIndex); } }; const handleImageClick = (index) => { setSelectedIndex(index); }; return (
{selectedIndex === -1 ? ( ) : ( )}
{ carouselApi.current = api; }} > {galleryImages?.map((image, index) => ( handleImageClick(index)} /> ))} {hasVideo && (
setSelectedIndex(-1)} >
)}
); }; export default ProductGallery;