openreplay/frontend/app/hooks/useCancelableTimeout.ts

20 lines
No EOL
565 B
TypeScript

import { useRef, useEffect } from 'react'
export default function useCancelableTimeout(
onTimeout: ()=> void,
onCancel: ()=> void,
delay: number,
): [()=> void, ()=> void] {
const idRef = useRef<ReturnType<typeof setTimeout>>()
const triggerTimeout = () => {
clearTimeout(idRef.current)
idRef.current = setTimeout(onTimeout, delay)
}
const cancelTimeout = () => {
clearTimeout(idRef.current)
onCancel()
}
useEffect(() => () => clearTimeout(idRef.current), []) // auto-cancel without callback (on clean)
return [ triggerTimeout, cancelTimeout ]
}