대시보드 실시간 기능 추가
This commit is contained in:
77
features/dashboard/hooks/use-market-realtime.ts
Normal file
77
features/dashboard/hooks/use-market-realtime.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
"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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user