From 2b3dd239cb0783691bc4defb7b0c8f575ef39f95 Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Tue, 26 Mar 2019 18:23:21 +1100 Subject: [PATCH] Make useHoverDirty controllable + reuse in useMouse --- src/useHoverDirty.ts | 10 +++++----- src/useMouse.ts | 33 +++++++++++---------------------- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/src/useHoverDirty.ts b/src/useHoverDirty.ts index e5df777d99..e99c08753f 100644 --- a/src/useHoverDirty.ts +++ b/src/useHoverDirty.ts @@ -1,8 +1,8 @@ import {useEffect, useState} from 'react'; // kudos: https://usehooks.com/ -const useHoverDirty = (ref) => { - if (process.env.NODE_ENV !== 'production') { +const useHoverDirty = (ref, enabled: boolean = true) => { + if (process.env.NODE_ENV === 'development') { if ((typeof ref !== 'object') || (typeof ref.current === 'undefined')) { throw new TypeError('useHoverDirty expects a single ref argument.'); } @@ -14,18 +14,18 @@ const useHoverDirty = (ref) => { const onMouseOver = () => setValue(true); const onMouseOut = () => setValue(false); - if (ref && ref.current) { + if (enabled && ref && ref.current) { ref.current.addEventListener('mouseover', onMouseOver); ref.current.addEventListener('mouseout', onMouseOut); } return () => { - if (ref && ref.current) { + if (enabled && ref && ref.current) { ref.current.removeEventListener('mouseover', onMouseOver); ref.current.removeEventListener('mouseout', onMouseOut); } }; - }, []); + }, [enabled, ref]); return value; } diff --git a/src/useMouse.ts b/src/useMouse.ts index 89b575b5f3..66709a16d3 100644 --- a/src/useMouse.ts +++ b/src/useMouse.ts @@ -1,5 +1,5 @@ import {useState, useEffect, useRef, RefObject} from 'react'; -import useToggle from "./useToggle"; +import useHoverDirty from "./useHoverDirty"; export interface State { docX: number; @@ -13,8 +13,14 @@ export interface State { } const useMouse = (ref: RefObject, whenHovered: boolean = false): State => { + if (process.env.NODE_ENV === 'development') { + if ((typeof ref !== 'object') || (typeof ref.current === 'undefined')) { + throw new TypeError('useMouse expects a single ref argument.'); + } + } + const frame = useRef(0); - const [active, setActive] = useToggle(false); + const isHovered = useHoverDirty(ref, whenHovered); const [state, setState] = useState({ docX: 0, docY: 0, @@ -26,23 +32,6 @@ const useMouse = (ref: RefObject, whenHovered: boolean = false): St elW: 0, }); - useEffect(() => { - const enterHandler = () => setActive(true) - const leaveHandler = () => setActive(false) - - if (whenHovered && ref && ref.current) { - ref.current.addEventListener("mouseenter", enterHandler, false); - ref.current.addEventListener("mouseleave", leaveHandler, false); - } - - return () => { - if (whenHovered && ref && ref.current) { - ref.current.removeEventListener("mouseenter", enterHandler); - ref.current.removeEventListener("mouseleave", leaveHandler); - } - }; - }, [whenHovered, ref]); - useEffect(() => { const moveHandler = (event: MouseEvent) => { cancelAnimationFrame(frame.current); @@ -67,17 +56,17 @@ const useMouse = (ref: RefObject, whenHovered: boolean = false): St }); } - if (active || !whenHovered) { + if (isHovered || !whenHovered) { document.addEventListener('mousemove', moveHandler); } return () => { - if (active || !whenHovered) { + if (isHovered || !whenHovered) { cancelAnimationFrame(frame.current); document.removeEventListener('mousemove', moveHandler); } }; - }, [active, whenHovered, ref]) + }, [isHovered, whenHovered, ref]) return state; }