"use client"; import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; import type { KisTradingEnv } from "@/features/dashboard/types/dashboard.types"; /** * @file features/dashboard/store/use-kis-runtime-store.ts * @description KIS 키 입력/검증 상태를 zustand로 관리하고 새로고침 시 복원합니다. */ export interface KisRuntimeCredentials { appKey: string; appSecret: string; tradingEnv: KisTradingEnv; } interface KisRuntimeStoreState { // [State] 입력 폼 상태 kisTradingEnvInput: KisTradingEnv; kisAppKeyInput: string; kisAppSecretInput: string; // [State] 검증/연동 상태 verifiedCredentials: KisRuntimeCredentials | null; isKisVerified: boolean; tradingEnv: KisTradingEnv; } interface KisRuntimeStoreActions { /** * 거래 모드 입력값을 변경하고 기존 검증 상태를 무효화합니다. * @param tradingEnv 거래 모드 * @see features/dashboard/components/dashboard-main.tsx 거래 모드 버튼 onClick 이벤트 */ setKisTradingEnvInput: (tradingEnv: KisTradingEnv) => void; /** * 앱 키 입력값을 변경하고 기존 검증 상태를 무효화합니다. * @param appKey 앱 키 * @see features/dashboard/components/dashboard-main.tsx App Key onChange 이벤트 */ setKisAppKeyInput: (appKey: string) => void; /** * 앱 시크릿 입력값을 변경하고 기존 검증 상태를 무효화합니다. * @param appSecret 앱 시크릿 * @see features/dashboard/components/dashboard-main.tsx App Secret onChange 이벤트 */ setKisAppSecretInput: (appSecret: string) => void; /** * 검증 성공 상태를 저장합니다. * @param credentials 검증 완료된 키 * @param tradingEnv 현재 연동 모드 * @see features/dashboard/components/dashboard-main.tsx handleValidateKis */ setVerifiedKisSession: (credentials: KisRuntimeCredentials, tradingEnv: KisTradingEnv) => void; /** * 검증 실패 또는 입력 변경 시 검증 상태만 초기화합니다. * @see features/dashboard/components/dashboard-main.tsx handleValidateKis catch */ invalidateKisVerification: () => void; /** * 접근 폐기 시 입력값/검증값을 모두 제거합니다. * @param tradingEnv 표시용 모드 * @see features/dashboard/components/dashboard-main.tsx handleRevokeKis */ clearKisRuntimeSession: (tradingEnv: KisTradingEnv) => void; } const INITIAL_STATE: KisRuntimeStoreState = { kisTradingEnvInput: "real", kisAppKeyInput: "", kisAppSecretInput: "", verifiedCredentials: null, isKisVerified: false, tradingEnv: "real", }; export const useKisRuntimeStore = create()( persist( (set) => ({ ...INITIAL_STATE, setKisTradingEnvInput: (tradingEnv) => set({ kisTradingEnvInput: tradingEnv, verifiedCredentials: null, isKisVerified: false, }), setKisAppKeyInput: (appKey) => set({ kisAppKeyInput: appKey, verifiedCredentials: null, isKisVerified: false, }), setKisAppSecretInput: (appSecret) => set({ kisAppSecretInput: appSecret, verifiedCredentials: null, isKisVerified: false, }), setVerifiedKisSession: (credentials, tradingEnv) => set({ verifiedCredentials: credentials, isKisVerified: true, tradingEnv, }), invalidateKisVerification: () => set({ verifiedCredentials: null, isKisVerified: false, }), clearKisRuntimeSession: (tradingEnv) => set({ kisTradingEnvInput: tradingEnv, kisAppKeyInput: "", kisAppSecretInput: "", verifiedCredentials: null, isKisVerified: false, tradingEnv, }), }), { name: "autotrade-kis-runtime-store", storage: createJSONStorage(() => localStorage), partialize: (state) => ({ kisTradingEnvInput: state.kisTradingEnvInput, kisAppKeyInput: state.kisAppKeyInput, kisAppSecretInput: state.kisAppSecretInput, verifiedCredentials: state.verifiedCredentials, isKisVerified: state.isKisVerified, tradingEnv: state.tradingEnv, }), }, ), );