@@ -30,11 +30,12 @@ final class HomeViewModel: ViewModel {
3030 let fetchRoutineResultPublisher : AnyPublisher < Bool , Never >
3131 let routinesPublisher : AnyPublisher < [ Routine ] , Never >
3232 let updateRoutineCompletionResultPublisher : AnyPublisher < Bool , Never >
33+ let allCompletedRoutineDatePublisher : AnyPublisher < [ Date ] , Never >
3334 }
3435
3536 private( set) var output : Output
3637 private var routines : [ String : [ Routine ] ] = [ : ]
37- private var routineCompleted : [ String : Bool ] = [ : ]
38+ private var routinesCompleted : [ String : Bool ] = [ : ]
3839 private let nicknameSubject = CurrentValueSubject < String , Never > ( " " )
3940 private let emotionSubject = CurrentValueSubject < Emotion ? , Never > ( nil )
4041 private let selectedDateSubject = CurrentValueSubject < Date , Never > ( . now)
@@ -43,6 +44,7 @@ final class HomeViewModel: ViewModel {
4344 private let routinesSubject = CurrentValueSubject < [ Routine ] , Never > ( [ ] )
4445 private let selectedRoutineSubject = CurrentValueSubject < Routine ? , Never > ( nil )
4546 private let updateRoutineCompletionResultSubject = PassthroughSubject < Bool , Never > ( )
47+ private let allCompletedRoutineDateSubject = CurrentValueSubject < [ Date ] , Never > ( [ ] )
4648
4749 private let calendar = Calendar . current
4850 private let today = Date ( )
@@ -67,8 +69,8 @@ final class HomeViewModel: ViewModel {
6769 routineListDatePublisher: routineListDateSubject. eraseToAnyPublisher ( ) ,
6870 fetchRoutineResultPublisher: fetchRoutineResultSubject. eraseToAnyPublisher ( ) ,
6971 routinesPublisher: routinesSubject. eraseToAnyPublisher ( ) ,
70- updateRoutineCompletionResultPublisher: updateRoutineCompletionResultSubject. eraseToAnyPublisher ( )
71- )
72+ updateRoutineCompletionResultPublisher: updateRoutineCompletionResultSubject. eraseToAnyPublisher ( ) ,
73+ allCompletedRoutineDatePublisher : allCompletedRoutineDateSubject . eraseToAnyPublisher ( ) )
7274 }
7375
7476 func action( input: Input ) {
@@ -132,10 +134,19 @@ final class HomeViewModel: ViewModel {
132134 // MARK: - 날짜
133135 private func moveWeek( by week: Int ) {
134136 let currentDate = selectedDateSubject. value
135- guard let weekStartDate = calendar. date ( byAdding: . weekOfYear, value: week, to: currentDate)
137+ guard let nextWeekDate = calendar. date ( byAdding: . weekOfYear, value: week, to: currentDate)
136138 else { return }
139+ let weekStartDate = calculateWeekStartDate ( for: nextWeekDate)
137140 selectedDateSubject. send ( weekStartDate)
138141 fetchDailyRoutine ( for: weekStartDate)
142+ fetchAllCompletedRoutine ( )
143+ }
144+
145+ // 현재 주의 첫째 날(월요일)을 계산해줍니다.
146+ private func calculateWeekStartDate( for date: Date ) -> Date {
147+ let weekday = calendar. component ( . weekday, from: date)
148+ let daysFromMonday = ( weekday == 1 ) ? 6 : weekday - 2
149+ return calendar. date ( byAdding: . day, value: - daysFromMonday, to: date) ?? date
139150 }
140151
141152 // 날짜를 선택하고 그 날에 해당하는 루틴을 불러옵니다.
@@ -144,6 +155,22 @@ final class HomeViewModel: ViewModel {
144155 fetchDailyRoutine ( for: date)
145156 }
146157
158+ private func fetchAllCompletedRoutine( ) {
159+ let selectedDate = selectedDateSubject. value
160+ let weekStartDate = calculateWeekStartDate ( for: selectedDate)
161+ var allCompletedDates : [ Date ] = [ ]
162+ for i in 0 ..< 7 {
163+ guard let date = calendar. date ( byAdding: . day, value: i, to: weekStartDate)
164+ else { continue }
165+ guard
166+ let isAllCompleted = routinesCompleted [ date. convertToString ( dateType: . yearMonthDate) ] ,
167+ isAllCompleted
168+ else { continue }
169+ allCompletedDates. append ( date)
170+ }
171+ allCompletedRoutineDateSubject. send ( allCompletedDates)
172+ }
173+
147174 // MARK: - 루틴
148175 // 루틴들을 불러옵니다. (처음에는 +-1 주, 그 이후에는 1주씩)
149176 private func fetchRoutines( ) {
@@ -163,8 +190,9 @@ final class HomeViewModel: ViewModel {
163190 let routineEntities = values. routines
164191 let allCompleted = values. allCompleted
165192 routines [ date] = routineEntities. map ( { $0. toRoutine ( ) } )
166- routineCompleted [ date] = allCompleted
193+ routinesCompleted [ date] = allCompleted
167194 }
195+ fetchAllCompletedRoutine ( )
168196 fetchRoutineResultSubject. send ( true )
169197 } catch {
170198 fetchRoutineResultSubject. send ( false )
@@ -218,6 +246,7 @@ final class HomeViewModel: ViewModel {
218246 Task {
219247 fetchRoutines ( startDate: selectedDate, endDate: selectedDate)
220248 fetchDailyRoutine ( for: selectedDate)
249+ fetchAllCompletedRoutine ( )
221250 }
222251 }
223252
0 commit comments