UNPKG

1.78 kBJavaScriptView Raw
1import React from 'react';
2import PropTypes from 'prop-types';
3import classNames from 'classnames';
4import { mapToCssModules } from './utils';
5
6function CarouselControl(props) {
7 const {
8 direction,
9 onClickHandler,
10 cssModule,
11 directionText,
12 className,
13 ...attributes
14 } = props;
15
16 const anchorClasses = mapToCssModules(
17 classNames(className, `carousel-control-${direction}`),
18 cssModule,
19 );
20
21 const iconClasses = mapToCssModules(
22 classNames(`carousel-control-${direction}-icon`),
23 cssModule,
24 );
25
26 const screenReaderClasses = mapToCssModules(
27 classNames('visually-hidden'),
28 cssModule,
29 );
30
31 return (
32 // We need to disable this linting rule to use an `<a>` instead of
33 // `<button>` because that's what the Bootstrap examples require:
34 // https://getbootstrap.com/docs/4.5/components/carousel/#with-controls
35 // eslint-disable-next-line jsx-a11y/anchor-is-valid
36 <a
37 {...attributes}
38 className={anchorClasses}
39 style={{ cursor: 'pointer' }}
40 role="button"
41 tabIndex="0"
42 onClick={(e) => {
43 e.preventDefault();
44 onClickHandler();
45 }}
46 >
47 <span className={iconClasses} aria-hidden="true" />
48 <span className={screenReaderClasses}>{directionText || direction}</span>
49 </a>
50 );
51}
52
53CarouselControl.propTypes = {
54 /** Set the direction of control button */
55 direction: PropTypes.oneOf(['prev', 'next']).isRequired,
56 /** Function to be triggered on click */
57 onClickHandler: PropTypes.func.isRequired,
58 /** Change underlying component's CSS base class name */
59 cssModule: PropTypes.object,
60 /** Screen reader text */
61 directionText: PropTypes.string,
62 /** Add custom class */
63 className: PropTypes.string,
64};
65
66export default CarouselControl;