78 lines
2.5 KiB
TypeScript
78 lines
2.5 KiB
TypeScript
"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<string, KisRealtimeIndexTick>;
|
|
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<string, KisRealtimeIndexTick>
|
|
>({});
|
|
const [lastTickAt, setLastTickAt] = useState<string | null>(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,
|
|
};
|
|
}
|