Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. import { useEffect, useRef, useState } from 'react';
  2.  
  3. /**
  4. * Reports real time position of mouse
  5. * @param {number} delay specifies for how long to wait before mouse is considered not moving (default 3000)
  6. * @returns {Object} current mouse oordinates
  7. */
  8. export default function useMouse(delay) {
  9. const [coords, setCoords] = useState([0, 0]);
  10. const [isMoving, setIsMoving] = useState(false);
  11.  
  12. let timer;
  13. // Create a ref that stores handler
  14. const savedHandler = useRef();
  15. const eventName = 'mousemove';
  16. const element = global;
  17. const handler = mouseMoving;
  18. const defaultDelay = 3000;
  19.  
  20. /**
  21. * Handler for mouse moving
  22. * @param {any} event the event
  23. */
  24. function mouseMoving(event: any) {
  25. if (timer) {
  26. clearTimeout(timer);
  27. }
  28. // eslint-disable-next-line no-console
  29. console.log(isMoving);
  30. // Set new mouse coordinates
  31. setCoords([event.clientX, event.clientY]);
  32. setIsMoving(true);
  33. // Clear delay interval
  34. timer = setTimeout(mouseStopped, delay || defaultDelay);
  35. }
  36.  
  37. /**
  38. * Reports that mouse stopped moving
  39. */
  40. function mouseStopped() {
  41. setIsMoving(false);
  42. }
  43.  
  44. // Update ref.current value if handler changes.
  45. // This allows our effect below to always get latest handler ...
  46. // ... without us needing to pass it in effect deps array ...
  47. // ... and potentially cause effect to re-run every render.
  48. useEffect(() => {
  49. savedHandler.current = handler;
  50. }, [handler]);
  51.  
  52. useEffect(
  53. () => {
  54. // Make sure element supports addEventListener
  55. const isSupported = element && element.addEventListener;
  56.  
  57. if (!isSupported) {
  58. return;
  59. }
  60.  
  61. // Create event listener that calls handler function stored in ref
  62. // eslint-disable-next-line require-jsdoc-except/require-jsdoc
  63. const eventListener = (event: any) => savedHandler.current(event);
  64.  
  65. // Add event listener
  66. element.addEventListener(eventName, eventListener);
  67.  
  68. // Remove event listener on cleanup
  69. // eslint-disable-next-line consistent-return
  70. return () => {
  71. element.removeEventListener(eventName, eventListener);
  72. };
  73. },
  74. [eventName, element], // Re-run if eventName or element changes
  75. );
  76.  
  77. return [coords, isMoving];
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement