"use client"; import { useState, useCallback } from "react"; import { parseKisRealtimeIndexTick, type KisRealtimeIndexTick, } from "@/features/dashboard/utils/kis-index-realtime.utils"; import { useKisWebSocket } from "@/features/kis-realtime/hooks/useKisWebSocket"; import type { KisRuntimeCredentials } from "@/features/settings/store/use-kis-runtime-store"; const INDEX_TR_ID = "H0UPCNT0"; const KOSPI_SYMBOL = "0001"; const KOSDAQ_SYMBOL = "1001"; interface UseMarketRealtimeResult { realtimeIndices: Record; isConnected: boolean; hasReceivedTick: boolean; isPending: boolean; lastTickAt: string | null; } /** * @description 코스피/코스닥 실시간 지수 웹소켓 구독 상태를 관리합니다. * @param credentials KIS 인증 정보(하위 호환 파라미터) * @param isVerified KIS 연결 인증 여부 * @returns 실시간 지수 맵/연결 상태/수신 대기 상태 * @remarks UI 흐름: DashboardContainer -> useMarketRealtime -> MarketSummary/StatusHeader 렌더링 반영 * @see features/dashboard/components/DashboardContainer.tsx 지수 데이터 통합 및 상태 전달 */ export function useMarketRealtime( _credentials: KisRuntimeCredentials | null, // 하위 호환성을 위해 남겨둠 (실제로는 스토어 사용) isVerified: boolean, // 하위 호환성을 위해 남겨둠 ): UseMarketRealtimeResult { const [realtimeIndices, setRealtimeIndices] = useState< Record >({}); const [lastTickAt, setLastTickAt] = useState(null); const handleMessage = useCallback((data: string) => { const tick = parseKisRealtimeIndexTick(data); if (tick) { setLastTickAt(new Date().toISOString()); setRealtimeIndices((prev) => ({ ...prev, [tick.symbol]: tick, })); } }, []); // KOSPI 구독 const { isConnected: isKospiConnected } = useKisWebSocket({ symbol: KOSPI_SYMBOL, trId: INDEX_TR_ID, onMessage: handleMessage, enabled: isVerified, }); // KOSDAQ 구독 const { isConnected: isKosdaqConnected } = useKisWebSocket({ symbol: KOSDAQ_SYMBOL, trId: INDEX_TR_ID, onMessage: handleMessage, enabled: isVerified, }); const hasReceivedTick = Object.keys(realtimeIndices).length > 0; const isPending = isVerified && (isKospiConnected || isKosdaqConnected) && !hasReceivedTick; return { realtimeIndices, isConnected: isKospiConnected || isKosdaqConnected, hasReceivedTick, isPending, lastTickAt, }; }