Files
auto-trade/features/kis-realtime/hooks/useKisWebSocket.ts

54 lines
1.6 KiB
TypeScript
Raw Normal View History

2026-02-13 12:17:35 +09:00
import { useEffect, useRef } from "react";
import { useKisWebSocketStore } from "@/features/kis-realtime/stores/kisWebSocketStore";
/**
* @file features/kis-realtime/hooks/useKisWebSocket.ts
* @description KIS .
* / .
*/
type RealtimeCallback = (data: string) => void;
interface UseKisWebSocketParams {
symbol?: string; // 종목코드 (없으면 구독 안 함)
trId?: string; // 거래 ID (예: H0STCNT0)
onMessage?: RealtimeCallback; // 데이터 수신 콜백
enabled?: boolean; // 구독 활성화 여부
}
export function useKisWebSocket({
symbol,
trId,
onMessage,
enabled = true,
}: UseKisWebSocketParams) {
const subscribeRef = useRef(useKisWebSocketStore.getState().subscribe);
const connectRef = useRef(useKisWebSocketStore.getState().connect);
const { isConnected } = useKisWebSocketStore();
2026-02-13 12:17:35 +09:00
const callbackRef = useRef(onMessage);
// 콜백 함수가 바뀌어도 재구독하지 않도록 ref 사용
useEffect(() => {
callbackRef.current = onMessage;
}, [onMessage]);
useEffect(() => {
if (!enabled || !symbol || !trId) return;
// 연결 시도 (이미 연결 중이면 스토어에서 무시됨)
connectRef.current();
2026-02-13 12:17:35 +09:00
// 구독 요청
const unsubscribe = subscribeRef.current(trId, symbol, (data) => {
2026-02-13 12:17:35 +09:00
callbackRef.current?.(data);
});
// 언마운트 시 구독 해제
return () => {
unsubscribe();
};
}, [symbol, trId, enabled]);
2026-02-13 12:17:35 +09:00
return { isConnected };
}