Skip to content

Commit 341a1eb

Browse files
committed
Feat: 루틴 당일 삭제 기능 구현
- 루틴 당일 삭제를 위한 유스케이스 및 UI 로직 추가 - RoutineUiModel 및 SubRoutineUiModel에 삭제 정보 변환 메소드 추가 - 삭제 확인 다이얼로그에서 당일 삭제 기능 연동
1 parent 7ae11c6 commit 341a1eb

File tree

5 files changed

+76
-1
lines changed

5 files changed

+76
-1
lines changed

presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ fun HomeScreenContainer(
8181
if (uiState.showDeleteConfirmDialog) {
8282
DeleteConfirmDialog(
8383
onDeleteToday = {
84+
viewModel.deleteRoutineByDay(routine)
8485
viewModel.sendIntent(HomeIntent.HideDeleteConfirmDialog)
8586
},
8687
onDeleteAll = {

presentation/src/main/java/com/threegap/bitnagil/presentation/home/HomeViewModel.kt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.lifecycle.SavedStateHandle
55
import androidx.lifecycle.viewModelScope
66
import com.threegap.bitnagil.domain.routine.model.RoutineCompletion
77
import com.threegap.bitnagil.domain.routine.model.RoutineCompletionInfo
8+
import com.threegap.bitnagil.domain.routine.usecase.DeleteRoutineByDayUseCase
89
import com.threegap.bitnagil.domain.routine.usecase.DeleteRoutineUseCase
910
import com.threegap.bitnagil.domain.routine.usecase.FetchWeeklyRoutinesUseCase
1011
import com.threegap.bitnagil.domain.routine.usecase.RoutineCompletionUseCase
@@ -15,6 +16,7 @@ import com.threegap.bitnagil.presentation.home.model.HomeState
1516
import com.threegap.bitnagil.presentation.home.model.RoutineSortType
1617
import com.threegap.bitnagil.presentation.home.model.RoutineUiModel
1718
import com.threegap.bitnagil.presentation.home.model.RoutinesUiModel
19+
import com.threegap.bitnagil.presentation.home.model.toRoutineByDayDeletion
1820
import com.threegap.bitnagil.presentation.home.model.toUiModel
1921
import com.threegap.bitnagil.presentation.home.util.getCurrentWeekDays
2022
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -35,6 +37,7 @@ class HomeViewModel @Inject constructor(
3537
private val fetchWeeklyRoutinesUseCase: FetchWeeklyRoutinesUseCase,
3638
private val routineCompletionUseCase: RoutineCompletionUseCase,
3739
private val deleteRoutineUseCase: DeleteRoutineUseCase,
40+
private val deleteRoutineByDayUseCase: DeleteRoutineByDayUseCase,
3841
) : MviViewModel<HomeState, HomeSideEffect, HomeIntent>(
3942
initState = HomeState(),
4043
savedStateHandle = savedStateHandle,
@@ -154,6 +157,30 @@ class HomeViewModel @Inject constructor(
154157
deletingRoutine = null,
155158
)
156159
}
160+
161+
is HomeIntent.DeleteRoutineByDayOptimistically -> {
162+
val dateKey = intent.performedDate
163+
val updatedRoutinesByDate = state.routines.routinesByDate.toMutableMap()
164+
val routinesForDate = updatedRoutinesByDate[dateKey]?.toMutableList()
165+
166+
if (routinesForDate != null) {
167+
updatedRoutinesByDate[dateKey] = routinesForDate.filterNot {
168+
it.routineId == intent.routineId
169+
}
170+
}
171+
172+
state.copy(
173+
routines = RoutinesUiModel(routinesByDate = updatedRoutinesByDate),
174+
showDeleteConfirmDialog = false,
175+
deletingRoutine = null,
176+
)
177+
}
178+
179+
is HomeIntent.RestoreRoutinesAfterDeleteByDayFailure -> {
180+
state.copy(routines = intent.backupRoutines)
181+
}
182+
183+
is HomeIntent.ConfirmRoutineByDayDeletion -> null
157184
}
158185
return newState
159186
}
@@ -395,4 +422,35 @@ class HomeViewModel @Inject constructor(
395422
)
396423
}
397424
}
425+
426+
fun deleteRoutineByDay(routineUiModel: RoutineUiModel) {
427+
val currentRoutines = container.stateFlow.value.routines
428+
val performedDate = container.stateFlow.value.selectedDate.toString()
429+
430+
sendIntent(
431+
HomeIntent.DeleteRoutineByDayOptimistically(
432+
routineId = routineUiModel.routineId,
433+
performedDate = performedDate,
434+
),
435+
)
436+
437+
viewModelScope.launch {
438+
val routineByDayDeletion = routineUiModel.toRoutineByDayDeletion(performedDate)
439+
440+
deleteRoutineByDayUseCase(routineByDayDeletion).fold(
441+
onSuccess = {
442+
sendIntent(
443+
HomeIntent.ConfirmRoutineByDayDeletion(
444+
routineId = routineUiModel.routineId,
445+
performedDate = performedDate,
446+
),
447+
)
448+
},
449+
onFailure = {
450+
Log.e("HomeViewModel", "루틴 삭제 실패: ${it.message}")
451+
sendIntent(HomeIntent.RestoreRoutinesAfterDeleteByDayFailure(currentRoutines))
452+
},
453+
)
454+
}
455+
}
398456
}

presentation/src/main/java/com/threegap/bitnagil/presentation/home/component/block/SubRoutinesItem.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,3 @@ private fun SubRoutinesItemPreview() {
115115
onSubRoutineToggle = { _, _ -> },
116116
)
117117
}
118-

presentation/src/main/java/com/threegap/bitnagil/presentation/home/model/RoutineUiModel.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.threegap.bitnagil.presentation.home.model
33
import android.os.Parcelable
44
import com.threegap.bitnagil.domain.routine.model.DayOfWeek
55
import com.threegap.bitnagil.domain.routine.model.Routine
6+
import com.threegap.bitnagil.domain.routine.model.RoutineByDayDeletion
67
import com.threegap.bitnagil.domain.routine.model.RoutineType
78
import kotlinx.parcelize.Parcelize
89

@@ -33,3 +34,12 @@ fun Routine.toUiModel(): RoutineUiModel =
3334
isCompleted = this.isCompleted,
3435
routineType = this.routineType,
3536
)
37+
38+
fun RoutineUiModel.toRoutineByDayDeletion(performedDate: String): RoutineByDayDeletion =
39+
RoutineByDayDeletion(
40+
routineCompletionId = this.routineCompletionId,
41+
routineId = this.routineId,
42+
subRoutineInfosForDelete = this.subRoutines.map { it.toSubRoutineDeletionInfo() },
43+
performedDate = performedDate,
44+
historySeq = this.historySeq,
45+
)

presentation/src/main/java/com/threegap/bitnagil/presentation/home/model/SubRoutineUiModel.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.threegap.bitnagil.presentation.home.model
33
import android.os.Parcelable
44
import com.threegap.bitnagil.domain.routine.model.RoutineType
55
import com.threegap.bitnagil.domain.routine.model.SubRoutine
6+
import com.threegap.bitnagil.domain.routine.model.SubRoutineDeletionInfo
67
import kotlinx.parcelize.Parcelize
78

89
@Parcelize
@@ -28,3 +29,9 @@ fun SubRoutine.toUiModel(): SubRoutineUiModel =
2829
isModified = this.isModified,
2930
routineType = this.routineType,
3031
)
32+
33+
fun SubRoutineUiModel.toSubRoutineDeletionInfo(): SubRoutineDeletionInfo =
34+
SubRoutineDeletionInfo(
35+
routineCompletionId = this.routineCompletionId,
36+
subRoutineId = this.subRoutineId,
37+
)

0 commit comments

Comments
 (0)