Untitled

 avatar
unknown
jsx
3 years ago
2.7 kB
3
Indexable
import Container from "@/components/atoms/Container";
import React from "react";

import styles from "./imageslider.module.scss";
import StandardCardBody from "@/components/molecules/StandardCardBody";
import SwiperCard from "@/components/molecules/SwiperCard";
import { Swiper, SwiperSlide } from "swiper/react";
import "swiper/css";
import { useCallback } from "react";
import { useState } from "react";

const ImageSlider = ({ data }) => {
  const sliderRef = React.createRef(null);
  const navigationPrevRef = React.useRef(null);
  const navigationNextRef = React.useRef(null);

  const [slideIndex, setSlideIndex] = useState({ index: 0 });

  const handlePrev = useCallback(() => {
    if (!sliderRef.current) return;
    sliderRef.current.swiper.slidePrev();
    setSlideIndex((prev) => {
      return { index: prev.index >= 1 ? prev.index - 1 : 0 };
    });
  }, []);

  const handleNext = useCallback(() => {
    if (!sliderRef.current) return;
    sliderRef.current.swiper.slideNext();
    setSlideIndex((prev) => {
      return { index: slideIndex.index >= data.slides.length ? slideIndex.index : prev.index + 1 };
    });
  }, []);

  return (
    <Container type="content" className={styles.component}>
      <div className={styles.navigation}>
        <div className={styles.current_slide}>
          {slideIndex.index} Of {data.slides.length}
        </div>
      </div>
      <div className="swiper-image-slider component">
        <Swiper
          ref={sliderRef}
          navigation={{
            prevEl: navigationPrevRef.current,
            nextEl: navigationNextRef.current,
          }}
          onBeforeInit={(swiper) => {
            swiper.params.navigation.prevEl = navigationPrevRef.current;
            swiper.params.navigation.nextEl = navigationNextRef.current;
          }}
        >
          {data &&
            data.slides?.map((slide, index) => (
              <SwiperSlide>
                <div className={styles.component_slide} key={index}>
                  <SwiperCard
                    image={slide.image}
                    type={slide.image.type}
                    canHover={slide.image.hover}
                    body={
                      <StandardCardBody
                        tag={slide.body.category}
                        title={slide.body.title}
                        description={slide.body.author}
                      />
                    }
                  />
                </div>
              </SwiperSlide>
            ))}
          <div className="swiper-image-button-prev" onClick={handlePrev} />
          <div className="swiper-image-button-next" onClick={handleNext} />
        </Swiper>
      </div>
    </Container>
  );
};

export default ImageSlider;