diff --git a/src/hooks/useDelayFlag.ts b/src/hooks/useDelayFlag.ts new file mode 100644 index 0000000..ff1f9f7 --- /dev/null +++ b/src/hooks/useDelayFlag.ts @@ -0,0 +1,47 @@ +import { useState, useEffect, useRef } from 'react'; +import { PositiveInteger } from '../types/number'; + +export const useDelayFlag = ( + flag: boolean, + delayTime?: PositiveInteger +): boolean => { + const startTimeRef = useRef(0); + const [delayFlag, setDelayFlag] = useState(false); + + const initializeFlag = () => { + startTimeRef.current = Date.now(); + setDelayFlag(true); + }; + + const resetFlag = () => { + setDelayFlag(false); + }; + + useEffect(() => { + let timeoutId: NodeJS.Timeout | null = null; + + const delayFlag = () => { + const elapsedTime = Date.now() - startTimeRef.current; + const remainingTime = (delayTime || 1000) - elapsedTime; + + if (remainingTime > 0) { + timeoutId = setTimeout(resetFlag, remainingTime); + } else { + resetFlag(); + } + }; + + if (flag) { + initializeFlag(); + } else if (startTimeRef.current) { + delayFlag(); + } + + return () => { + if (timeoutId) clearTimeout(timeoutId); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [flag]); + + return delayFlag; +}; diff --git a/src/types/number.ts b/src/types/number.ts new file mode 100644 index 0000000..2c07857 --- /dev/null +++ b/src/types/number.ts @@ -0,0 +1,6 @@ +export type PositiveInteger = `${T}` extends + | `-${string}` + | `${string}.${string}` + | '0' + ? never + : T;