35 lines
857 B
TypeScript
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]);
|
|
}
|