/** * Card Management Modals Hook * * CEO 대시보드 카드/가지급금 관리 섹션 (cm1-cm4) 모달 데이터 관리 * * cm1: 카드 사용액 상세 → CardTransactionDashboard API * cm2: 가지급금 상세 → LoanDashboard API * cm3: 법인세 예상 가중 → TaxSimulation API (corporate_tax) * cm4: 대표자 종합세 예상 가중 → TaxSimulation API (income_tax) */ import { useState, useCallback } from 'react'; import { fetchCardTransactionDashboard, fetchLoanDashboard, fetchTaxSimulation, } from '@/lib/api/dashboard/endpoints'; import type { CardDashboardDetailApiResponse, LoanDashboardApiResponse, TaxSimulationApiResponse, } from '@/lib/api/dashboard/types'; // ============================================ // 타입 정의 // ============================================ /** 카드 ID 타입 */ export type CardManagementCardId = 'cm1' | 'cm2' | 'cm3' | 'cm4'; /** 모달 데이터 반환 타입 */ export interface CardManagementModalData { cm1Data?: CardDashboardDetailApiResponse | null; cm2Data?: LoanDashboardApiResponse | null; cm3Data?: TaxSimulationApiResponse | null; cm4Data?: TaxSimulationApiResponse | null; } /** Hook 반환 타입 */ export interface UseCardManagementModalsReturn { /** cm1: 카드 사용액 상세 데이터 */ cm1Data: CardDashboardDetailApiResponse | null; /** cm2: 가지급금 상세 데이터 */ cm2Data: LoanDashboardApiResponse | null; /** cm3: 법인세 시뮬레이션 데이터 */ cm3Data: TaxSimulationApiResponse | null; /** cm4: 소득세 시뮬레이션 데이터 (cm3와 동일 소스, 다른 표시) */ cm4Data: TaxSimulationApiResponse | null; /** 로딩 상태 */ loading: boolean; /** 에러 메시지 */ error: string | null; /** 특정 카드의 모달 데이터 조회 - 데이터 직접 반환 */ fetchModalData: (cardId: CardManagementCardId) => Promise; /** 모든 카드 데이터 조회 */ fetchAllData: () => Promise; /** 데이터 초기화 */ clearData: (cardId?: CardManagementCardId) => void; } // ============================================ // Hook 구현 // ============================================ /** * 카드/가지급금 관리 섹션 모달 데이터 관리 Hook * * @example * const { cm1Data, cm2Data, loading, fetchModalData } = useCardManagementModals(); * * // 카드 클릭 시 * await fetchModalData('cm1'); */ export function useCardManagementModals(): UseCardManagementModalsReturn { // 각 카드별 데이터 상태 const [cm1Data, setCm1Data] = useState(null); const [cm2Data, setCm2Data] = useState(null); const [cm3Data, setCm3Data] = useState(null); const [cm4Data, setCm4Data] = useState(null); // 공통 상태 const [loading, setLoading] = useState(false); const [error, setError] = useState(null); /** * cm1: 카드 사용액 상세 데이터 조회 * @returns 조회된 데이터 (실패 시 null) */ const fetchCm1Data = useCallback(async (): Promise => { try { const response = await fetchCardTransactionDashboard(); if (response.success && response.data) { setCm1Data(response.data); return response.data; } else { throw new Error(response.message || '카드 거래 데이터 조회 실패'); } } catch (err) { const errorMessage = err instanceof Error ? err.message : '카드 거래 데이터 조회 실패'; console.error('[useCardManagementModals] cm1 error:', err); throw new Error(errorMessage); } }, []); /** * cm2: 가지급금 상세 데이터 조회 * @returns 조회된 데이터 (실패 시 null) */ const fetchCm2Data = useCallback(async (): Promise => { try { const response = await fetchLoanDashboard(); if (response.success && response.data) { setCm2Data(response.data); return response.data; } else { throw new Error(response.message || '가지급금 데이터 조회 실패'); } } catch (err) { const errorMessage = err instanceof Error ? err.message : '가지급금 데이터 조회 실패'; console.error('[useCardManagementModals] cm2 error:', err); throw new Error(errorMessage); } }, []); /** * cm3 & cm4: 세금 시뮬레이션 데이터 조회 * cm3은 법인세 (corporate_tax), cm4는 소득세 (income_tax) 사용 * @returns 조회된 데이터 (실패 시 null) */ const fetchTaxData = useCallback(async (): Promise => { try { const response = await fetchTaxSimulation(); if (response.success && response.data) { // cm3, cm4 모두 같은 데이터 소스 사용 (표시만 다름) setCm3Data(response.data); setCm4Data(response.data); return response.data; } else { throw new Error(response.message || '세금 시뮬레이션 데이터 조회 실패'); } } catch (err) { const errorMessage = err instanceof Error ? err.message : '세금 시뮬레이션 데이터 조회 실패'; console.error('[useCardManagementModals] tax simulation error:', err); throw new Error(errorMessage); } }, []); /** * 특정 카드의 모달 데이터 조회 * @returns 조회된 모달 데이터 객체 (카드 ID에 해당하는 데이터만 포함) */ const fetchModalData = useCallback( async (cardId: CardManagementCardId): Promise => { setLoading(true); setError(null); const result: CardManagementModalData = {}; try { switch (cardId) { case 'cm1': result.cm1Data = await fetchCm1Data(); break; case 'cm2': result.cm2Data = await fetchCm2Data(); break; case 'cm3': case 'cm4': { // cm3, cm4는 같은 API 사용 const taxData = await fetchTaxData(); result.cm3Data = taxData; result.cm4Data = taxData; break; } default: throw new Error(`알 수 없는 카드 ID: ${cardId}`); } } catch (err) { const errorMessage = err instanceof Error ? err.message : '데이터 조회 실패'; setError(errorMessage); } finally { setLoading(false); } return result; }, [fetchCm1Data, fetchCm2Data, fetchTaxData] ); /** * 모든 카드 데이터 조회 (초기 로드용) */ const fetchAllData = useCallback(async () => { setLoading(true); setError(null); try { // 병렬로 모든 데이터 조회 await Promise.all([fetchCm1Data(), fetchCm2Data(), fetchTaxData()]); } catch (err) { const errorMessage = err instanceof Error ? err.message : '데이터 조회 실패'; setError(errorMessage); } finally { setLoading(false); } }, [fetchCm1Data, fetchCm2Data, fetchTaxData]); /** * 데이터 초기화 */ const clearData = useCallback((cardId?: CardManagementCardId) => { if (!cardId) { // 전체 초기화 setCm1Data(null); setCm2Data(null); setCm3Data(null); setCm4Data(null); setError(null); } else { // 특정 카드만 초기화 switch (cardId) { case 'cm1': setCm1Data(null); break; case 'cm2': setCm2Data(null); break; case 'cm3': setCm3Data(null); break; case 'cm4': setCm4Data(null); break; } } }, []); return { cm1Data, cm2Data, cm3Data, cm4Data, loading, error, fetchModalData, fetchAllData, clearData, }; }