stacker.news/components/use-debounce-callback.js

24 lines
668 B
JavaScript
Raw Normal View History

2023-10-06 01:33:14 +00:00
import { useCallback, useEffect, useState } from 'react'
export function debounce (fn, time) {
let timeoutId
return wrapper
function wrapper (...args) {
if (timeoutId) {
clearTimeout(timeoutId)
}
timeoutId = setTimeout(() => {
timeoutId = null
fn(...args)
}, time)
// return a function that clears the timeout for use in useEffect cleanup
return () => clearTimeout(timeoutId)
}
}
export default function useDebounceCallback (fn, time, deps = []) {
const [args, setArgs] = useState([])
useEffect(debounce(() => fn(...args), time), [fn, time, args, ...deps])
return useCallback((...args) => setArgs(args), [])
}