Skip to content

Commit a533584

Browse files
committed
fix: [Carousel] separate touch and mouse events
1 parent 63109f0 commit a533584

File tree

1 file changed

+27
-30
lines changed

1 file changed

+27
-30
lines changed

src/components/Carousel/index.tsx

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect, useRef, useCallback, useImperativeHandle }
22
import clsx from 'clsx';
33
import { CarouselItem } from './Item';
44
import { setTransform, setTransition } from '../../utils/style';
5+
import canUse from '../../utils/canUse';
56

67
export interface CarouselProps {
78
children: React.ReactNode;
@@ -40,13 +41,13 @@ interface State {
4041
endX: number;
4142
startY: number;
4243
canMove: boolean | null;
43-
preventClick: boolean;
4444
pressDown: boolean;
4545
}
4646

4747
type DragEvent = React.TouchEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement, MouseEvent>;
4848

4949
const formElements = ['TEXTAREA', 'OPTION', 'INPUT', 'SELECT'];
50+
const canTouch = canUse('touch');
5051

5152
export const Carousel = React.forwardRef<CarouselHandle, CarouselProps>((props, ref) => {
5253
const {
@@ -82,7 +83,6 @@ export const Carousel = React.forwardRef<CarouselHandle, CarouselProps>((props,
8283
startY: 0,
8384
canMove: null,
8485
pressDown: false,
85-
preventClick: false,
8686
});
8787

8888
const getIndex = useCallback(
@@ -248,7 +248,6 @@ export const Carousel = React.forwardRef<CarouselHandle, CarouselProps>((props,
248248
state.endX = 0;
249249
state.startY = 0;
250250
state.canMove = null;
251-
state.preventClick = false;
252251
state.pressDown = false;
253252
};
254253

@@ -284,8 +283,6 @@ export const Carousel = React.forwardRef<CarouselHandle, CarouselProps>((props,
284283
if (!state.canMove) {
285284
return;
286285
}
287-
} else if ((e.target as Element).nodeName === 'A') {
288-
state.preventClick = true;
289286
}
290287

291288
e.preventDefault();
@@ -319,6 +316,9 @@ export const Carousel = React.forwardRef<CarouselHandle, CarouselProps>((props,
319316
enableTransition();
320317
if (state.endX) {
321318
updateAfterDrag();
319+
} else {
320+
// when clicked
321+
doAutoPlay();
322322
}
323323
resetDrag();
324324
};
@@ -334,7 +334,6 @@ export const Carousel = React.forwardRef<CarouselHandle, CarouselProps>((props,
334334

335335
if (state.pressDown) {
336336
state.pressDown = false;
337-
state.preventClick = false;
338337
state.endX = e.pageX;
339338

340339
enableTransition();
@@ -345,14 +344,6 @@ export const Carousel = React.forwardRef<CarouselHandle, CarouselProps>((props,
345344
doAutoPlay();
346345
};
347346

348-
const handleClickWrap = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
349-
const state = stateRef.current;
350-
if (state.preventClick) {
351-
e.preventDefault();
352-
}
353-
state.preventClick = false;
354-
};
355-
356347
const handleClickDot = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
357348
const { slideTo: i } = e.currentTarget.dataset;
358349
if (i) {
@@ -412,22 +403,28 @@ export const Carousel = React.forwardRef<CarouselHandle, CarouselProps>((props,
412403
};
413404
}, [autoPlay, activeIndex, doAutoPlay]);
414405

415-
const events = draggable
416-
? {
417-
onTouchStart: dragStart,
418-
onTouchMove: dragMove,
419-
onTouchEnd: dragEnd,
420-
onMouseDown: dragStart,
421-
onMouseMove: dragMove,
422-
onMouseUp: dragEnd,
423-
onMouseEnter,
424-
onMouseLeave,
425-
onClick: handleClickWrap,
426-
}
427-
: {
428-
onMouseEnter,
429-
onMouseLeave,
430-
};
406+
let events;
407+
408+
if (draggable) {
409+
events = canTouch
410+
? {
411+
onTouchStart: dragStart,
412+
onTouchMove: dragMove,
413+
onTouchEnd: dragEnd,
414+
}
415+
: {
416+
onMouseDown: dragStart,
417+
onMouseMove: dragMove,
418+
onMouseUp: dragEnd,
419+
onMouseEnter,
420+
onMouseLeave,
421+
};
422+
} else {
423+
events = {
424+
onMouseEnter,
425+
onMouseLeave,
426+
};
427+
}
431428

432429
return (
433430
<div

0 commit comments

Comments
 (0)