UNPKG

1.46 kBJavaScriptView Raw
1import React from 'react';
2import PropTypes from 'prop-types';
3import classNames from 'classnames';
4import { mapToCssModules } from './utils';
5
6function CarouselIndicators(props) {
7 const {
8 items,
9 activeIndex,
10 cssModule,
11 onClickHandler,
12 className,
13 ...attributes
14 } = props;
15
16 const listClasses = mapToCssModules(
17 classNames(className, 'carousel-indicators'),
18 cssModule,
19 );
20 const indicators = items.map((item, idx) => {
21 const indicatorClasses = mapToCssModules(
22 classNames({ active: activeIndex === idx }),
23 cssModule,
24 );
25 return (
26 <button
27 aria-label={item.caption}
28 data-bs-target
29 type="button"
30 key={`${item.key || Object.values(item).join('')}`}
31 onClick={(e) => {
32 e.preventDefault();
33 onClickHandler(idx);
34 }}
35 className={indicatorClasses}
36 />
37 );
38 });
39
40 return (
41 <div className={listClasses} {...attributes}>
42 {indicators}
43 </div>
44 );
45}
46
47CarouselIndicators.propTypes = {
48 /** The current active index */
49 activeIndex: PropTypes.number.isRequired,
50 /** Add custom class */
51 className: PropTypes.string,
52 /** Change underlying component's CSS base class name */
53 cssModule: PropTypes.object,
54 /** Array of items to show */
55 items: PropTypes.array.isRequired,
56 /** Function to be triggered on click */
57 onClickHandler: PropTypes.func.isRequired,
58};
59
60export default CarouselIndicators;