"use client" import { LayoutComponentDefinition, LayoutContext, } from "@vibentec/component-map" import styles from "./index.module.css" import useEmblaCarousel from "embla-carousel-react" import Autoplay from "embla-carousel-autoplay" import { useMemo } from "react" import { DotButton, useDotButton } from "./carousel-dot-button" import { NextButton, PrevButton, usePrevNextButtons } from "./carousel-arrow-button" import LocalizedClientLink from "@modules/common/components/localized-client-link" export function VtCarousel({ nodes, context, }: { nodes: LayoutComponentDefinition context: LayoutContext }) { const props = nodes.config ?? {} const { options } = props as any const images: string[] = props.images ?? props.slides ?? [] const links: (string | undefined)[] = props.links ?? [] const durationSeconds: number = props.duration ?? 4 const showControls = images.length > 1 const plugins = useMemo(() => { if (!durationSeconds || durationSeconds <= 0) return [] return [ Autoplay({ delay: durationSeconds * 1000, stopOnInteraction: false, stopOnMouseEnter: true, }), ] }, [durationSeconds]) const [emblaRef, emblaApi] = useEmblaCarousel(options, plugins) const { selectedIndex, scrollSnaps, onDotButtonClick } = useDotButton(emblaApi) const { prevBtnDisabled, nextBtnDisabled, onPrevButtonClick, onNextButtonClick, } = usePrevNextButtons(emblaApi) return (
{images && images.map((src: string, index: number) => (
{links[index] ? ( {`slide-${index ) : ( {`slide-${index )}
))}
{showControls && (
{scrollSnaps.map((_, index) => ( onDotButtonClick(index)} className={[ styles["embla__dot"], index === selectedIndex ? styles["embla__dot--selected"] : "", ].filter(Boolean).join(" ")} /> ))}
)}
) }