58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
"use client"
|
|
import { Card, CardContent } from "@/components/ui/card"
|
|
import {
|
|
Carousel,
|
|
CarouselApi,
|
|
CarouselContent,
|
|
CarouselItem,
|
|
CarouselNext,
|
|
CarouselPrevious,
|
|
} from "@/components/ui/carousel"
|
|
import { useEffect, useState } from "react"
|
|
|
|
const CustomCarousel = () => {
|
|
const [api, setApi] = useState<CarouselApi | undefined>(undefined)
|
|
const [current, setCurrent] = useState<number>(0)
|
|
const [count, setCount] = useState<number>(0)
|
|
|
|
useEffect(() => {
|
|
if (!api) {
|
|
return
|
|
}
|
|
|
|
setCount(api.scrollSnapList().length)
|
|
setCurrent(api.selectedScrollSnap() + 1)
|
|
|
|
api.on("select", () => {
|
|
setCurrent(api.selectedScrollSnap() + 1)
|
|
})
|
|
}, [api])
|
|
|
|
return (
|
|
<div className="flex flex-col items-center gap-3">
|
|
<Carousel setApi={setApi} className="w-full max-w-xs">
|
|
<CarouselContent>
|
|
{Array.from({ length: 5 }).map((_, index) => (
|
|
<CarouselItem key={index}>
|
|
<div className="p-1">
|
|
<Card className="dark:border-default-300">
|
|
<CardContent className="flex aspect-square items-center justify-center p-6">
|
|
<span className="text-4xl font-semibold">{index + 1}</span>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
</CarouselItem>
|
|
))}
|
|
</CarouselContent>
|
|
<CarouselPrevious />
|
|
<CarouselNext />
|
|
</Carousel>
|
|
<div className="py-2 text-center font-medium text-sm text-muted-foreground">
|
|
Slide <strong>{current}</strong> of <strong>{count}</strong>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default CustomCarousel
|