Improve mouse tracking (#1061)

* Improve mouse tracking

* Fix lint

* Fix regression on Filters

* Fix according to review
This commit is contained in:
Charles Bochet
2023-08-03 10:36:11 -07:00
committed by GitHub
parent 21e3d8fcac
commit 2b21e05524
27 changed files with 208 additions and 141 deletions

View File

@ -0,0 +1,67 @@
import { useCallback, useEffect } from 'react';
type MouseListener = (positionX: number, positionY: number) => void;
export function useTrackPointer({
shouldTrackPointer = true,
onMouseMove,
onMouseDown,
onMouseUp,
}: {
shouldTrackPointer?: boolean;
onMouseMove?: MouseListener;
onMouseDown?: MouseListener;
onMouseUp?: MouseListener;
}) {
const extractPosition = useCallback((event: MouseEvent | TouchEvent) => {
const clientX =
'clientX' in event ? event.clientX : event.changedTouches[0].clientX;
const clientY =
'clientY' in event ? event.clientY : event.changedTouches[0].clientY;
return { clientX, clientY };
}, []);
const onInternalMouseMove = useCallback(
(event: MouseEvent | TouchEvent) => {
const { clientX, clientY } = extractPosition(event);
onMouseMove?.(clientX, clientY);
},
[onMouseMove, extractPosition],
);
const onInternalMouseDown = useCallback(
(event: MouseEvent | TouchEvent) => {
const { clientX, clientY } = extractPosition(event);
onMouseDown?.(clientX, clientY);
},
[onMouseDown, extractPosition],
);
const onInternalMouseUp = useCallback(
(event: MouseEvent | TouchEvent) => {
const { clientX, clientY } = extractPosition(event);
onMouseUp?.(clientX, clientY);
},
[onMouseUp, extractPosition],
);
useEffect(() => {
if (shouldTrackPointer) {
document.addEventListener('mousemove', onInternalMouseMove);
document.addEventListener('mousedown', onInternalMouseDown);
document.addEventListener('mouseup', onInternalMouseUp);
return () => {
document.removeEventListener('mousemove', onInternalMouseMove);
document.removeEventListener('mousedown', onInternalMouseDown);
document.removeEventListener('mouseup', onInternalMouseUp);
};
}
}, [
shouldTrackPointer,
onInternalMouseMove,
onInternalMouseDown,
onInternalMouseUp,
]);
}