kcg-monitoring/frontend/src/hooks/usePoll.ts

35 lines
857 B
TypeScript

import { useEffect, useRef, useCallback } from 'react';
/**
* 공통 폴링 훅 — 주기적으로 fetchFn을 호출하고 결과를 onData로 전달.
* enabled가 false면 폴링 중지.
*/
export function usePoll<T>(
fetchFn: () => Promise<T>,
onData: (data: T) => void,
intervalMs: number,
enabled = true,
): void {
const onDataRef = useRef(onData);
onDataRef.current = onData;
const fetchRef = useRef(fetchFn);
fetchRef.current = fetchFn;
const doFetch = useCallback(async () => {
try {
const data = await fetchRef.current();
onDataRef.current(data);
} catch {
// graceful — 기존 데이터 유지
}
}, []);
useEffect(() => {
if (!enabled) return;
doFetch();
const t = setInterval(doFetch, intervalMs);
return () => clearInterval(t);
}, [enabled, intervalMs, doFetch]);
}