import { useCallback, useRef, useState } from 'react'; /** * Edge 3.2: Hook to prevent double-clicking on buttons * Disables the callback for a short period after execution to prevent rapid clicks * * @param callback - The function to protect from double-clicks * @param delay - Minimum time between executions in milliseconds (default: 500ms) * @returns Object with protected callback and isProcessing state * * @example * ```typescript * const { handleClick, isProcessing } = usePreventDoubleClick( * async () => { * await submitForm(); * }, * 1000 * ); * * * ``` */ export function usePreventDoubleClick any>( callback: T, delay: number = 500, ): { handleClick: T; isProcessing: boolean; } { const [isProcessing, setIsProcessing] = useState(false); const lastExecTimeRef = useRef(0); const handleClick = useCallback( (async (...args: Parameters) => { const currentTime = Date.now(); const timeSinceLastExec = currentTime - lastExecTimeRef.current; // Prevent execution if called too soon after last execution if (timeSinceLastExec < delay) { return; } // Prevent execution if already processing if (isProcessing) { return; } setIsProcessing(true); lastExecTimeRef.current = currentTime; try { const result = await callback(...args); return result; } finally { // Ensure minimum delay before allowing next execution setTimeout(() => { setIsProcessing(false); }, delay); } }) as T, [callback, delay, isProcessing], ); return { handleClick, isProcessing }; }