mirror of
https://github.com/linsa-io/linsa.git
synced 2026-03-18 15:23:59 +01:00
35 lines
879 B
TypeScript
35 lines
879 B
TypeScript
import { useRef, useCallback } from "react"
|
|
|
|
export function useThrottle<T extends (...args: any[]) => void>(
|
|
callback: T,
|
|
delay: number,
|
|
): (...args: Parameters<T>) => void {
|
|
const lastRan = useRef(Date.now())
|
|
const timeoutRef = useRef<NodeJS.Timeout | null>(null)
|
|
|
|
return useCallback(
|
|
(...args: Parameters<T>) => {
|
|
const handler = () => {
|
|
if (Date.now() - lastRan.current >= delay) {
|
|
callback(...args)
|
|
lastRan.current = Date.now()
|
|
} else {
|
|
if (timeoutRef.current) {
|
|
clearTimeout(timeoutRef.current)
|
|
}
|
|
timeoutRef.current = setTimeout(
|
|
() => {
|
|
callback(...args)
|
|
lastRan.current = Date.now()
|
|
},
|
|
delay - (Date.now() - lastRan.current),
|
|
)
|
|
}
|
|
}
|
|
|
|
handler()
|
|
},
|
|
[callback, delay],
|
|
)
|
|
}
|