From ba036672547ba1488412391ff12c402ed46cc68f Mon Sep 17 00:00:00 2001 From: caarlosdamian Date: Sat, 3 Feb 2024 23:39:12 -0600 Subject: [PATCH] refactor(hooks): added useTimer hook to useDebounce hook and useDoubleClick hook to remove unnecesary repeated code. --- src/hooks/useDebounce.ts | 24 +++++++++--------------- src/hooks/useDoubleClick.ts | 21 ++++++--------------- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/src/hooks/useDebounce.ts b/src/hooks/useDebounce.ts index 872ef51..9afe6df 100644 --- a/src/hooks/useDebounce.ts +++ b/src/hooks/useDebounce.ts @@ -1,27 +1,21 @@ -import { useEffect, useRef } from 'react'; +import { useEffect } from 'react'; +import { useTimer } from './useTimer'; export const useDebounce = ( - callback: (...args: T) => any, + callback: (...args: T) => void, delay: number ) => { - const callbackRef = useRef(null); + const { setTimer, clearTimer } = useTimer(); useEffect(() => { return () => { - if (callbackRef.current) { - clearTimeout(callbackRef.current); - } + clearTimer(); }; - }, []); + }, [clearTimer]); - const debouncedCallback = (...rest: T) => { - if (callbackRef.current) { - clearTimeout(callbackRef.current); - } - - callbackRef.current = setTimeout(() => { - callback(...rest); - }, delay); + const debouncedCallback = (...args: T) => { + clearTimer(); + setTimer(() => callback(...args), delay); }; return debouncedCallback; diff --git a/src/hooks/useDoubleClick.ts b/src/hooks/useDoubleClick.ts index 6cfeef6..8dac2d7 100644 --- a/src/hooks/useDoubleClick.ts +++ b/src/hooks/useDoubleClick.ts @@ -1,4 +1,5 @@ -import { useCallback, useRef, MouseEvent } from 'react'; +import { useCallback, MouseEvent } from 'react'; +import { useTimer } from './useTimer'; type ClickCallback = (event: MouseEvent) => any | void; @@ -7,27 +8,17 @@ export const useDoubleClick = ( click: ClickCallback, timeout = 250 ) => { - const clickTimeout = useRef | undefined>( - undefined - ); - - const clearClickTimeout = () => { - if (clickTimeout.current !== undefined) { - clearTimeout(clickTimeout.current); - clickTimeout.current = undefined; - } - }; + const { clearTimer, setTimer } = useTimer(); return useCallback( (event: MouseEvent) => { - clearClickTimeout(); + clearTimer(); if (click && event.detail === 1) { - clickTimeout.current = setTimeout(() => { - click(event); - }, timeout); + setTimer(() => click(event), timeout); } if (event.detail % 2 === 0) { doubleClick(event); + setTimer(() => doubleClick(event), timeout); } }, [click, doubleClick, timeout]