@@ -7,8 +7,10 @@ import {
77 addPlan ,
88 deletePlan ,
99 deletePlanItem ,
10+ fetchAllPlanItems ,
1011 fetchPlans ,
1112 Plan ,
13+ PlanItem ,
1214 updatePlan ,
1315} from '@/services/plans/planManageService.service' ;
1416
@@ -30,17 +32,72 @@ const Page = () => {
3032 const [ currentPage , setCurrentPage ] = useState ( 1 ) ;
3133 const itemsPerPage = 4 ;
3234
35+ const [ stats , setStats ] = useState ( {
36+ total : 0 ,
37+ working : 0 , // 진행중
38+ completed : 0 , // 완료됨
39+ } ) ;
40+
41+ // 카드 업데이트를 위한 stats 가져오기 메서드
42+ const fetchAndCalculate = async ( uid : string ) => {
43+ try {
44+ // 1. 데이터 병렬 로드
45+ const [ fetchedPlans , fetchedItems ] = await Promise . all ( [
46+ fetchPlans ( uid ) ,
47+ fetchAllPlanItems ( uid ) ,
48+ ] ) ;
49+
50+ setPlans ( fetchedPlans ) ; // 플랜 목록 업데이트
51+
52+ // 2. 통계 계산 로직
53+ let completedCount = 0 ;
54+ let workingCount = 0 ;
55+
56+ fetchedPlans . forEach ( ( plan ) => {
57+ const myItems = fetchedItems . filter (
58+ ( item : PlanItem ) => item . planId === plan . id
59+ ) ;
60+ // ⚠️ 하위 항목이 하나라도 있는 경우에만 상태를 판별합니다.
61+ if ( myItems . length > 0 ) {
62+ const isAllChecked = myItems . every (
63+ ( item : PlanItem ) => item . isChecked
64+ ) ;
65+
66+ if ( isAllChecked ) {
67+ completedCount ++ ; // 모두 완료됨
68+ } else {
69+ workingCount ++ ; // 항목은 있는데 아직 다 완료 안 됨 -> 진행중
70+ }
71+ }
72+ } ) ;
73+
74+ // 3. 통계 State 업데이트
75+ setStats ( {
76+ total : fetchedPlans . length ,
77+ completed : completedCount ,
78+ working : workingCount ,
79+ } ) ;
80+ } catch ( err ) {
81+ console . error ( err ) ;
82+ }
83+ } ;
84+
3385 // 사용자 인증 상태 리스너 및 초기 플랜 목록 로드
3486 useEffect ( ( ) => {
3587 const unsubscribe = onAuthStateChanged ( auth , async ( currentUser ) => {
3688 setUser ( currentUser ) ;
3789
3890 if ( currentUser ) {
3991 try {
40- const fetchedPlans = await fetchPlans ( currentUser . uid ) ;
41- setPlans ( fetchedPlans ) ;
92+ const [ fetchedPlans , fetchedItems ] = await Promise . all ( [
93+ fetchPlans ( currentUser . uid ) ,
94+ fetchAllPlanItems ( currentUser . uid ) ,
95+ ] ) ;
4296
97+ setPlans ( fetchedPlans ) ;
4398 setCurrentPage ( 1 ) ;
99+
100+ await fetchAndCalculate ( currentUser . uid ) ;
44101 } catch ( err ) {
45102 console . error ( '플랜 목록 로딩 실패:' , err ) ;
46103 setPlans ( [ ] ) ;
@@ -69,6 +126,8 @@ const Page = () => {
69126 setPlans ( fetchedPlans ) ;
70127 setCurrentPage ( 1 ) ;
71128
129+ await fetchAndCalculate ( user . uid ) ;
130+
72131 setIsAdding ( false ) ; // 폼 닫기
73132 } catch ( err ) {
74133 console . error ( '플랜 추가 실패:' , err ) ;
@@ -99,6 +158,8 @@ const Page = () => {
99158 const fetchedPlans = await fetchPlans ( user . uid ) ;
100159 setPlans ( fetchedPlans ) ;
101160
161+ await fetchAndCalculate ( user . uid ) ;
162+
102163 // 페이지 조절
103164 if (
104165 currentPage > Math . ceil ( ( plans . length - 1 ) / itemsPerPage ) &&
@@ -136,6 +197,7 @@ const Page = () => {
136197 }
137198 } ;
138199
200+ // 페이지네이션 파트
139201 const totalPages = Math . ceil ( plans . length / itemsPerPage ) ;
140202 const startIndex = ( currentPage - 1 ) * itemsPerPage ;
141203 const endIndex = startIndex + itemsPerPage ;
@@ -181,7 +243,9 @@ const Page = () => {
181243 < span className = "text-text-sub text-sm font-medium" >
182244 진행중인 플랜 수
183245 </ span >
184- < span className = "text-4xl font-bold text-[#7B44C4]" > 1</ span >
246+ < span className = "text-4xl font-bold text-[#7B44C4]" >
247+ { stats . working }
248+ </ span >
185249 </ div >
186250
187251 { /* 오른쪽: 아이콘 영역 */ }
@@ -195,7 +259,9 @@ const Page = () => {
195259 < span className = "text-text-sub text-sm font-medium" >
196260 완료된 플랜 수
197261 </ span >
198- < span className = "text-4xl font-bold text-[#00841F]" > 1</ span >
262+ < span className = "text-4xl font-bold text-[#00841F]" >
263+ { stats . completed }
264+ </ span >
199265 </ div >
200266
201267 { /* 오른쪽: 아이콘 영역 */ }
@@ -237,6 +303,7 @@ const Page = () => {
237303 description = { plan . description }
238304 onDeletePlan = { handleDeletePlan }
239305 onUpdatePlan = { handleUpdatePlan }
306+ onChangeStats = { ( ) => fetchAndCalculate ( user ! . uid ) }
240307 />
241308 ) )
242309 ) : (
0 commit comments