/** * @TODO Needs more check and fix */ import React, { CSSProperties, useCallback, useEffect, useMemo, useRef, useState } from "react"; export interface CarouselProps { className?: string; style?: CSSProperties; items: { src: any; caption?: { title: string; subtitle?: string; }; }[]; defaultIndex?: number; indicator?: 'default' | 'dot' | 'thumb'; indicatorPosition?: 'bottom' | 'end'; anim?: 'slide' | 'fade'; } const Carousel = ({ className, style, items, defaultIndex = 0, indicator, indicatorPosition, anim, }: CarouselProps) => { const cid = useRef('carousel-element-' + (Math.random() * 100000).toPrecision()); const [active, setActive] = useState(defaultIndex); const classes = useMemo(() => { return [ 'carousel slide', anim === 'fade' && 'carousel-fade', className ].filter(Boolean).join(' ') }, [anim, className]); const indicatorClasses = useMemo(() => { const cls = [ 'carousel-indicators' ]; switch (indicator) { case 'dot': cls.push('carousel-indicators-dot'); break; case 'thumb': cls.push('carousel-indicators-thumb'); break; case 'default': default: break; } switch (indicatorPosition) { case 'end': cls.push('carousel-indicators-vertical'); break; case 'bottom': default: break; } return cls.join(' '); }, [indicator, indicatorPosition]) return (
{items.map((item, i) => ( ))}
{items.map((item, i) => (
{item.caption &&
} {item.caption &&

{item.caption.title}

{item.caption.subtitle}

}
))}
{indicatorPosition === 'end' && setActive(active-1)} href={`#${cid.current}`} role="button" data-bs-slide="prev"> Previous } {indicatorPosition === 'end' && setActive(active+1)} href={`#${cid.current}`} role="button" data-bs-slide="next"> Next }
) } export default Carousel;