Skip to content

Commit

Permalink
fix: stop firing mouseup/down if touch event is fired
Browse files Browse the repository at this point in the history
  • Loading branch information
syusui-s committed Sep 8, 2024
1 parent fd6d233 commit 8adf62d
Showing 1 changed file with 18 additions and 15 deletions.
33 changes: 18 additions & 15 deletions src/hooks/useLongPress.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ const DefaultDelay = 300;

const useLongPress = (propsProvider: () => UseLongPressProps) => {
let ref: HTMLElement | undefined;
let longPressed = false;

onMount(() => {
if (ref == null) return;
const { onLongPress, onClick, delay = DefaultDelay } = propsProvider();

let timer: ReturnType<typeof setTimeout> | undefined;
let longPressed = false;

const startTimer = () => {
longPressed = false;
Expand All @@ -32,11 +32,15 @@ const useLongPress = (propsProvider: () => UseLongPressProps) => {
}
};

const handleMouseDown = () => {
const handlePressStart = (ev: Event) => {
// Calling prevenDefault prevents 'mousedown' event from firing if the event was triggered by a touch event
ev.preventDefault();
startTimer();
};

const handleMouseUp = () => {
const handlePressEnd = (ev: Event) => {
// Calling prevenDefault prevents 'mouseup' event from firing if the event was triggered by a touch event
ev.preventDefault();
clearTimer();
};

Expand All @@ -46,24 +50,23 @@ const useLongPress = (propsProvider: () => UseLongPressProps) => {
onClick();
};

ref.addEventListener('mousedown', handleMouseDown);
ref.addEventListener('mouseup', handleMouseUp);
ref.addEventListener('click', handleClick);
ref.addEventListener('mousedown', handlePressStart);
ref.addEventListener('mouseup', handlePressEnd);

ref.addEventListener('touchstart', handleMouseDown);
ref.addEventListener('touchend', handleMouseUp);
ref.addEventListener('touchstart', handlePressStart);
ref.addEventListener('touchend', handlePressEnd);

// mousedown touchstart
// mouseup mouseleave touchend touchcancel
ref.addEventListener('click', handleClick);

onCleanup(() => {
clearTimer();
ref?.removeEventListener('mouseddown', handleMouseDown);
ref?.removeEventListener('mouseup', handleMouseUp);
ref?.removeEventListener('click', handleClick);
ref?.removeEventListener('mouseddown', handlePressStart);
ref?.removeEventListener('mouseup', handlePressEnd);

ref?.removeEventListener('touchstart', handleMouseDown);
ref?.removeEventListener('touchend', handleMouseUp);
ref?.removeEventListener('touchstart', handlePressStart);
ref?.removeEventListener('touchend', handlePressEnd);

ref?.removeEventListener('click', handleClick);
});
});

Expand Down

0 comments on commit 8adf62d

Please sign in to comment.