feat: CEO 대시보드 Phase 1 API 연동 (5개 섹션)

- DailyReport, Receivable, DebtCollection, MonthlyExpense, CardManagement API 연동
- useCEODashboard Hook 추가 (병렬 API 호출)
- API → Frontend 타입 변환 함수 및 CheckPoint 생성 로직 구현
- API 실패 시 mockData fallback 패턴 적용
This commit is contained in:
2026-01-20 18:51:05 +09:00
parent 6b0ffc810b
commit 0e963c0f11
5 changed files with 1010 additions and 3 deletions

View File

@@ -1,6 +1,6 @@
'use client';
import { useState, useCallback, useEffect } from 'react';
import { useState, useCallback, useEffect, useMemo } from 'react';
import { useRouter } from 'next/navigation';
import { LayoutDashboard, Settings } from 'lucide-react';
import { ContentLoadingSpinner } from '@/components/ui/loading-spinner';
@@ -25,6 +25,7 @@ import { DEFAULT_DASHBOARD_SETTINGS } from './types';
import { ScheduleDetailModal, DetailModal } from './modals';
import { DashboardSettingsDialog } from './dialogs/DashboardSettingsDialog';
import { mockData } from './mockData';
import { useCEODashboard } from '@/hooks/useCEODashboard';
import {
getMonthlyExpenseModalConfig,
getCardManagementModalConfig,
@@ -35,8 +36,35 @@ import {
export function CEODashboard() {
const router = useRouter();
const [isLoading] = useState(false);
const [data] = useState<CEODashboardData>(mockData);
// API 데이터 Hook (Phase 1 섹션들)
const apiData = useCEODashboard({
cardManagementFallback: mockData.cardManagement,
});
// 전체 로딩 상태 (모든 API 호출 중일 때)
const isLoading = useMemo(() => {
return (
apiData.dailyReport.loading &&
apiData.receivable.loading &&
apiData.debtCollection.loading &&
apiData.monthlyExpense.loading &&
apiData.cardManagement.loading
);
}, [apiData]);
// API 데이터와 mockData를 병합 (API 우선, 실패 시 fallback)
const data = useMemo<CEODashboardData>(() => ({
...mockData,
// Phase 1 섹션들: API 데이터 우선, 실패 시 mockData fallback
dailyReport: apiData.dailyReport.data ?? mockData.dailyReport,
receivable: apiData.receivable.data ?? mockData.receivable,
debtCollection: apiData.debtCollection.data ?? mockData.debtCollection,
monthlyExpense: apiData.monthlyExpense.data ?? mockData.monthlyExpense,
cardManagement: apiData.cardManagement.data ?? mockData.cardManagement,
// Phase 2 섹션들: 아직 mockData 사용
// todayIssue, todayIssueList, entertainment, welfare, vat, calendarSchedules
}), [apiData, mockData]);
// 일정 상세 모달 상태
const [isScheduleModalOpen, setIsScheduleModalOpen] = useState(false);