@@ -6,8 +6,8 @@ import androidx.lifecycle.viewModelScope
66import com.threegap.bitnagil.domain.emotion.usecase.FetchTodayEmotionUseCase
77import com.threegap.bitnagil.domain.emotion.usecase.GetEmotionChangeEventFlowUseCase
88import com.threegap.bitnagil.domain.onboarding.usecase.GetOnBoardingRecommendRoutineEventFlowUseCase
9- import com.threegap.bitnagil.domain.routine.model.RoutineCompletion
109import com.threegap.bitnagil.domain.routine.model.RoutineCompletionInfo
10+ import com.threegap.bitnagil.domain.routine.model.RoutineCompletionInfos
1111import com.threegap.bitnagil.domain.routine.usecase.FetchWeeklyRoutinesUseCase
1212import com.threegap.bitnagil.domain.routine.usecase.RoutineCompletionUseCase
1313import com.threegap.bitnagil.domain.user.usecase.FetchUserProfileUseCase
@@ -103,7 +103,7 @@ class HomeViewModel @Inject constructor(
103103 }
104104
105105 is HomeIntent .OnSubRoutineCompletionToggle -> {
106- updateSubRoutine(state, intent.routineId, intent.subRoutineId , intent.isCompleted)
106+ updateSubRoutine(state, intent.routineId, intent.subRoutineIndex , intent.isCompleted)
107107 }
108108
109109 is HomeIntent .LoadTodayEmotion -> {
@@ -201,8 +201,7 @@ class HomeViewModel @Inject constructor(
201201 viewModelScope.launch {
202202 fetchWeeklyRoutinesUseCase(startDate, endDate).fold(
203203 onSuccess = { routines ->
204- val routinesUiModel = routines.toUiModel()
205- sendIntent(HomeIntent .LoadWeeklyRoutines (routinesUiModel))
204+ sendIntent(HomeIntent .LoadWeeklyRoutines (routines.toUiModel()))
206205 sendIntent(HomeIntent .UpdateLoading (false ))
207206 },
208207 onFailure = { error ->
@@ -237,11 +236,11 @@ class HomeViewModel @Inject constructor(
237236 processRoutineToggleChanges(originalState, predictedUpdatedState)
238237 }
239238
240- fun toggleSubRoutineCompletion (routineId : String , subRoutineId : String , isCompleted : Boolean ) {
239+ fun toggleSubRoutineCompletion (routineId : String , subRoutineIndex : Int , isCompleted : Boolean ) {
241240 val originalState = container.stateFlow.value
242- sendIntent(HomeIntent .OnSubRoutineCompletionToggle (routineId, subRoutineId , isCompleted))
241+ sendIntent(HomeIntent .OnSubRoutineCompletionToggle (routineId, subRoutineIndex , isCompleted))
243242
244- val predictedUpdatedState = updateSubRoutine(originalState, routineId, subRoutineId , isCompleted)
243+ val predictedUpdatedState = updateSubRoutine(originalState, routineId, subRoutineIndex , isCompleted)
245244 processRoutineToggleChanges(originalState, predictedUpdatedState)
246245 }
247246
@@ -278,11 +277,10 @@ class HomeViewModel @Inject constructor(
278277 val routineIndex = routinesForDate.indexOfFirst { it.routineId == routineId }
279278 if (routineIndex == - 1 ) return @updateRoutinesForDate false
280279
281- val updatedRoutine = routinesForDate[routineIndex].copy(
282- isCompleted = isCompleted,
283- subRoutines = routinesForDate[routineIndex].subRoutines.map { subRoutine ->
284- subRoutine.copy(isCompleted = isCompleted)
285- },
280+ val routine = routinesForDate[routineIndex]
281+ val updatedRoutine = routine.copy(
282+ routineCompleteYn = isCompleted,
283+ subRoutineCompleteYn = routine.subRoutineCompleteYn.map { isCompleted },
286284 )
287285
288286 routinesForDate[routineIndex] = updatedRoutine
@@ -293,27 +291,34 @@ class HomeViewModel @Inject constructor(
293291 private fun updateSubRoutine (
294292 state : HomeState ,
295293 routineId : String ,
296- subRoutineId : String ,
294+ subRoutineIndex : Int ,
297295 isCompleted : Boolean ,
298296 ): HomeState {
299297 return updateRoutinesForDate(state) { routinesForDate ->
300298 val routineIndex = routinesForDate.indexOfFirst { it.routineId == routineId }
301299 if (routineIndex == - 1 ) return @updateRoutinesForDate false
302300
303301 val routine = routinesForDate[routineIndex]
304- val updatedSubRoutines = routine.subRoutines.map { subRoutine ->
305- if (subRoutine.subRoutineId == subRoutineId) {
306- subRoutine.copy(isCompleted = isCompleted)
307- } else {
308- subRoutine
302+
303+ if (subRoutineIndex < 0 || subRoutineIndex >= routine.subRoutineNames.size) {
304+ return @updateRoutinesForDate false
305+ }
306+
307+ val updatedSubRoutineCompleteYn = routine.subRoutineCompleteYn.toMutableList().apply {
308+ if (subRoutineIndex < size) {
309+ this [subRoutineIndex] = isCompleted
309310 }
310311 }
311312
312- val routineCompleted = if (isCompleted) updatedSubRoutines.all { it.isCompleted } else false
313+ val routineCompleted = if (isCompleted) {
314+ updatedSubRoutineCompleteYn.all { it }
315+ } else {
316+ false
317+ }
313318
314319 val updatedRoutine = routine.copy(
315- subRoutines = updatedSubRoutines ,
316- isCompleted = routineCompleted,
320+ subRoutineCompleteYn = updatedSubRoutineCompleteYn ,
321+ routineCompleteYn = routineCompleted,
317322 )
318323
319324 routinesForDate[routineIndex] = updatedRoutine
@@ -326,12 +331,13 @@ class HomeViewModel @Inject constructor(
326331 updateLogic : (MutableList <RoutineUiModel >) -> Boolean ,
327332 ): HomeState {
328333 val dateKey = state.selectedDate.toString()
329- val routinesForDate = state.routines.routinesByDate [dateKey]?.toMutableList() ? : return state
334+ val routinesForDate = state.routines.routines [dateKey]?.routineList ?.toMutableList() ? : return state
330335
331336 if (! updateLogic(routinesForDate)) return state
332337
333- val updatedRoutinesByDate = state.routines.routinesByDate.toMutableMap()
334- updatedRoutinesByDate[dateKey] = routinesForDate
338+ val updatedRoutinesByDate = state.routines.routines.toMutableMap()
339+ val dayRoutines = updatedRoutinesByDate[dateKey] ? : return state
340+ updatedRoutinesByDate[dateKey] = dayRoutines.copy(routineList = routinesForDate)
335341
336342 return state.copy(routines = RoutinesUiModel (updatedRoutinesByDate))
337343 }
@@ -342,39 +348,25 @@ class HomeViewModel @Inject constructor(
342348 date : LocalDate ,
343349 ): List <RoutineCompletionInfo > {
344350 val dateKey = date.toString()
345- val originalRoutineList = originalRoutines.routinesByDate [dateKey] ? : emptyList()
346- val updatedRoutineList = updatedRoutines.routinesByDate [dateKey] ? : emptyList()
351+ val originalRoutineList = originalRoutines.routines [dateKey]?.routineList ? : emptyList()
352+ val updatedRoutineList = updatedRoutines.routines [dateKey]?.routineList ? : emptyList()
347353
348354 return buildList {
349355 updatedRoutineList.forEach { updatedRoutine ->
350356 val originalRoutine = originalRoutineList.find { it.routineId == updatedRoutine.routineId }
351357
352- if (originalRoutine?.isCompleted != updatedRoutine.isCompleted) {
358+ val hasMainRoutineChanged = originalRoutine?.routineCompleteYn != updatedRoutine.routineCompleteYn
359+ val hasSubRoutinesChanged = originalRoutine?.subRoutineCompleteYn != updatedRoutine.subRoutineCompleteYn
360+
361+ if (hasMainRoutineChanged || hasSubRoutinesChanged) {
353362 add(
354363 RoutineCompletionInfo (
355- routineType = updatedRoutine.routineType,
356364 routineId = updatedRoutine.routineId,
357- historySeq = updatedRoutine.historySeq ,
358- isCompleted = updatedRoutine.isCompleted ,
365+ routineCompleteYn = updatedRoutine.routineCompleteYn ,
366+ subRoutineCompleteYn = updatedRoutine.subRoutineCompleteYn ,
359367 ),
360368 )
361369 }
362-
363- updatedRoutine.subRoutines.forEach { updatedSubRoutine ->
364- val originalSubRoutine = originalRoutine?.subRoutines
365- ?.find { it.subRoutineId == updatedSubRoutine.subRoutineId }
366-
367- if (originalSubRoutine?.isCompleted != updatedSubRoutine.isCompleted) {
368- add(
369- RoutineCompletionInfo (
370- routineType = updatedSubRoutine.routineType,
371- routineId = updatedSubRoutine.subRoutineId,
372- historySeq = updatedSubRoutine.historySeq,
373- isCompleted = updatedSubRoutine.isCompleted,
374- ),
375- )
376- }
377- }
378370 }
379371 }
380372 }
@@ -385,9 +377,8 @@ class HomeViewModel @Inject constructor(
385377
386378 if (unsyncedChanges.isEmpty()) return
387379
388- val syncRequest = RoutineCompletion (
389- performedDate = dateKey,
390- routineCompletions = unsyncedChanges.toList(),
380+ val syncRequest = RoutineCompletionInfos (
381+ routineCompletionInfos = unsyncedChanges.toList(),
391382 )
392383
393384 routineCompletionUseCase(syncRequest).fold(
0 commit comments