Skip to content

Commit dd345eb

Browse files
authored
Merge pull request #772 from leandrowd/feat/extract-carousel-controls
Refactor: Extract Arrow and Indicator components from Carousel
2 parents b8762d6 + 3c60fe4 commit dd345eb

File tree

4 files changed

+64
-32
lines changed

4 files changed

+64
-32
lines changed

src/__tests__/__snapshots__/Carousel.tsx.snap

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,29 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

33
exports[`Slider Basics Default Props methods renderArrowNext should return a button 1`] = `
4-
<button
5-
aria-label="next"
6-
className="control-arrow control-next"
7-
onClick={[MockFunction]}
8-
type="button"
4+
<Arrow
5+
direction="next"
6+
enabled={true}
7+
label="next"
8+
onClickHandler={[MockFunction]}
99
/>
1010
`;
1111

1212
exports[`Slider Basics Default Props methods renderArrowPrev should return a button 1`] = `
13-
<button
14-
aria-label="prev"
15-
className="control-arrow control-prev"
16-
onClick={[MockFunction]}
17-
type="button"
13+
<Arrow
14+
direction="prev"
15+
enabled={true}
16+
label="prev"
17+
onClickHandler={[MockFunction]}
1818
/>
1919
`;
2020

2121
exports[`Slider Basics Default Props methods renderIndicator should return a list item 1`] = `
22-
<li
23-
aria-label="slide 1"
24-
className="dot selected"
25-
onClick={[MockFunction]}
26-
onKeyDown={[MockFunction]}
27-
role="button"
28-
tabIndex={0}
29-
value={0}
22+
<Indicator
23+
index={0}
24+
isSelected={true}
25+
label="slide"
26+
onClickHandler={[MockFunction]}
3027
/>
3128
`;
3229

src/components/Carousel/Arrow.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import React from 'react';
2+
import klass from '../../cssClasses'; // Assuming cssClasses.ts is in src/
3+
4+
interface ArrowProps {
5+
direction: 'prev' | 'next';
6+
onClickHandler: () => void;
7+
enabled: boolean;
8+
label: string;
9+
}
10+
11+
const Arrow: React.FC<ArrowProps> = ({ direction, onClickHandler, enabled, label }) => {
12+
const isPrev = direction === 'prev';
13+
const arrowClassName = isPrev ? klass.ARROW_PREV(!enabled) : klass.ARROW_NEXT(!enabled);
14+
15+
return <button type="button" aria-label={label} className={arrowClassName} onClick={onClickHandler} />;
16+
};
17+
18+
export default Arrow;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React from 'react';
2+
import klass from '../../cssClasses'; // Assuming cssClasses.ts is in src/
3+
4+
interface IndicatorProps {
5+
onClickHandler: (e: React.MouseEvent | React.KeyboardEvent) => void;
6+
isSelected: boolean;
7+
index: number;
8+
label: string;
9+
}
10+
11+
const Indicator: React.FC<IndicatorProps> = ({ onClickHandler, isSelected, index, label }) => {
12+
return (
13+
<li
14+
className={klass.DOT(isSelected)}
15+
onClick={onClickHandler}
16+
onKeyDown={onClickHandler}
17+
value={index}
18+
key={index}
19+
role="button"
20+
tabIndex={0}
21+
aria-label={`${label} ${index + 1}`}
22+
/>
23+
);
24+
};
25+
26+
export default Indicator;

src/components/Carousel/index.tsx

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import getDocument from '../../shims/document';
77
import getWindow from '../../shims/window';
88
import { noop, defaultStatusFormatter, isKeyboardEvent } from './utils';
99
import { AnimationHandler, CarouselProps, CarouselState } from './types';
10+
import Arrow from './Arrow';
11+
import Indicator from './Indicator';
1012
import {
1113
slideAnimationHandler,
1214
slideSwipeAnimationHandler,
@@ -43,29 +45,18 @@ export default class Carousel extends React.Component<CarouselProps, CarouselSta
4345
onSwipeMove: () => false,
4446
preventMovementUntilSwipeScrollTolerance: false,
4547
renderArrowPrev: (onClickHandler: () => void, hasPrev: boolean, label: string) => (
46-
<button type="button" aria-label={label} className={klass.ARROW_PREV(!hasPrev)} onClick={onClickHandler} />
48+
<Arrow direction="prev" onClickHandler={onClickHandler} enabled={hasPrev} label={label} />
4749
),
4850
renderArrowNext: (onClickHandler: () => void, hasNext: boolean, label: string) => (
49-
<button type="button" aria-label={label} className={klass.ARROW_NEXT(!hasNext)} onClick={onClickHandler} />
51+
<Arrow direction="next" onClickHandler={onClickHandler} enabled={hasNext} label={label} />
5052
),
5153
renderIndicator: (
5254
onClickHandler: (e: React.MouseEvent | React.KeyboardEvent) => void,
5355
isSelected: boolean,
5456
index: number,
5557
label: string
5658
) => {
57-
return (
58-
<li
59-
className={klass.DOT(isSelected)}
60-
onClick={onClickHandler}
61-
onKeyDown={onClickHandler}
62-
value={index}
63-
key={index}
64-
role="button"
65-
tabIndex={0}
66-
aria-label={`${label} ${index + 1}`}
67-
/>
68-
);
59+
return <Indicator onClickHandler={onClickHandler} isSelected={isSelected} index={index} label={label} />;
6960
},
7061
renderItem: (item: React.ReactNode) => {
7162
return item;

0 commit comments

Comments
 (0)