You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/client/shared/hooks/useInterval.ts

42 lines
842 B
TypeScript

import { useCallback, useEffect, useRef } from 'react';
import { useUpdateRef } from './useUpdateRef';
export function useInterval(
fn: () => void,
delay: number | undefined,
options?: {
immediate?: boolean;
}
) {
const immediate = options?.immediate;
const fnRef = useUpdateRef(fn);
const timerRef = useRef<number>();
useEffect(() => {
if (typeof delay !== 'number' || delay < 0) {
return;
}
if (immediate) {
fnRef.current();
}
timerRef.current = window.setInterval(() => {
fnRef.current();
}, delay);
return () => {
if (timerRef.current) {
window.clearInterval(timerRef.current);
}
};
}, [delay]);
const clear = useCallback(() => {
if (timerRef.current) {
window.clearInterval(timerRef.current);
}
}, []);
return clear;
}