Skip to content
Snippets Groups Projects
Carousel.tsx 2.63 KiB
Newer Older
Toavina's avatar
Toavina committed
import React, { useEffect, useState } from "react"
import Image from "./Image"
Tojo's avatar
Tojo committed
interface DataImage {
Toavina's avatar
Toavina committed
    src: string
Tojo's avatar
Tojo committed
}

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

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

Toavina's avatar
Toavina committed
    const nbr_image: number = images.length
Tojo's avatar
Tojo committed

Toavina's avatar
Toavina committed
    const updateIndex = (newIndex: number) => {
        if (newIndex < 0) {
            newIndex = nbr_image - 1
        } else if (newIndex >= nbr_image) {
            newIndex = 0
        }
Tojo's avatar
Tojo committed

Toavina's avatar
Toavina committed
        setIndex(newIndex)
    }
Tojo's avatar
Tojo committed

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

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

Toavina's avatar
Toavina committed
    return (
Tojo's avatar
Tojo committed
        <div className={`flex items-center `}>
            <div className="relative">
                <div className="btn-carousel  absolute z-50 left-3 -mt-5">
                    <button
                        onClick={() => updateIndex(index - 1)}
                        className={`bg-neutral rounded-3xl w-10 h-10 text-base-100`}
                    >

                    </button>
                </div>
            </div>
Toavina's avatar
Toavina committed
            <div
Tojo's avatar
Tojo committed
                className={`inline-block align-middle carousel  w-full truncate max-h-80`}
Toavina's avatar
Toavina committed
            >
                <div
Tojo's avatar
Tojo committed
                    className={`whitespace-nowrap w-full `}
Toavina's avatar
Toavina committed
                    style={{
Tojo's avatar
Tojo committed
                        transform: `translateX(-${index * 100}%)`,
Toavina's avatar
Toavina committed
                        transition: "transform 0.3s",
                    }}
                >
                    {images.map((item: any, key: any) => {
                        return (
                            <div
Tojo's avatar
Tojo committed
                                className={`carousel-item relative w-full inline-block mr-0`}
Toavina's avatar
Toavina committed
                                key={key}
                            >
Tojo's avatar
Tojo committed
                                <Image image={item.src} className="w-full" />
Toavina's avatar
Toavina committed
                            </div>
                        )
                    })}
                </div>
            </div>
Tojo's avatar
Tojo committed
            <div className="relative">
                <div className="btn-carousel absolute z-50 right-3 -mt-5">
                    <button
                        onClick={() => updateIndex(index + 1)}
                        className={`bg-neutral rounded-3xl w-10 h-10 text-base-100`}
                    >

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

Toavina's avatar
Toavina committed
export default Carousel