Skip to content
Snippets Groups Projects
Carousel.tsx 2.59 KiB
Newer Older
Tojo's avatar
Tojo committed
import React, {useEffect, useState} from "react";
Tojo's avatar
Tojo committed

interface DataImage {
Tojo's avatar
Tojo committed
  src: string;
Tojo's avatar
Tojo committed
}

interface Props {
Tojo's avatar
Tojo committed
  images: Array<DataImage>;
  isLogo: boolean;
  delay?: number;
Tojo's avatar
Tojo committed
}

Tojo's avatar
Tojo committed
const Carousel = (props: Props) => {
  const { images, isLogo, delay } = props;
Tojo's avatar
Tojo committed
  const [index, setIndex] = useState(1);
Tojo's avatar
Tojo committed

  const nbr_image: number = images.length;

  const updateIndex = (newIndex: number) => {
    if (newIndex < 0) {
      newIndex = nbr_image - 1;
    } else if (newIndex >= nbr_image) {
      newIndex = 0;
    }

    setIndex(newIndex);
  };

Tojo's avatar
Tojo committed
  useEffect(() => {
Tojo's avatar
Tojo committed
    const interval = setInterval(() => {
      if (delay != 0) {
        updateIndex(index + 1);
      }
    }, delay);

    return () => {
      if (interval) {
        clearInterval(interval);
      }
    };
  });
Tojo's avatar
Tojo committed

  return (
    <div className="block relative">
Tojo's avatar
Tojo committed
      <div
Toavina's avatar
Toavina committed
        className={`carousel ${isLogo ? "w-1/4 ml-7" : "w-full"} truncate`}
Tojo's avatar
Tojo committed
      >
Toavina's avatar
Toavina committed
          className={`whitespace-nowrap ${isLogo ? "w-1/2" : "w-full"} `}
          style={{
            transform:
             isLogo ?
Toavina's avatar
Toavina committed
              nbr_image > 2
                ? `translateX(-${index * 60 }%)`
                : `translateX(0)`
                : `translateX(-${index * 100}%)`,
            transition: "transform 0.3s",
          }}
        >
          {images.map((item: any, key: any) => {
            return (
              <div
                className={`carousel-item relative w-full inline-block`}
                key={key}
              >
                {isLogo ? (
                  <div className="flex justify-center items-center w-full">
                    <img
                      src={item.src}
Toavina's avatar
Toavina committed
                      className="w-28 h-28 border border-gray-600"
                    />
                  </div>
                ) : (
                  <img src={item.src} className="w-full h-[384px]" />
                )}
              </div>
            );
          })}
        </div>
Tojo's avatar
Tojo committed
      </div>
Tojo's avatar
Tojo committed
      <div
        className={`absolute flex justify-between pl-5 pr-5 ${
Toavina's avatar
Toavina committed
          isLogo ? "w-[30%]" : "w-full"
Tojo's avatar
Tojo committed
        }  ${isLogo ? "top-9" : "top-[47%]"} `}
Tojo's avatar
Tojo committed
      >
        <button
          onClick={() => updateIndex(index - 1)}
Tojo's avatar
Tojo committed
          className={`bg-neutral rounded-3xl  ${
            isLogo ? "w-5" : "w-10"
Tojo's avatar
Tojo committed
          } h-10 text-base-100`}
Tojo's avatar
Tojo committed
        >

        </button>
        <button
          onClick={() => updateIndex(index + 1)}
Tojo's avatar
Tojo committed
          className={`bg-neutral rounded-3xl  ${
            isLogo ? "w-5" : "w-10"
Tojo's avatar
Tojo committed
          } h-10 text-base-100`}
Tojo's avatar
Tojo committed
        >

        </button>
      </div>
Tojo's avatar
Tojo committed
    </div>
  );
};

export default Carousel;