Skip to content

Commit 5000a6c

Browse files
committed
Feat: 루틴리스트 화면 네비게이션 로직 추가
- 루틴 수정, 작성 화면 연결
1 parent dc7494d commit 5000a6c

6 files changed

Lines changed: 90 additions & 18 deletions

File tree

app/src/main/java/com/threegap/bitnagil/MainNavHost.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,11 @@ fun MainNavHost(
121121
},
122122
navigateToRoutineList = { selectedDate ->
123123
navigator.navController.navigate(
124-
Route.RoutineList(selectedDate = selectedDate)
124+
Route.RoutineList(selectedDate = selectedDate),
125125
) {
126126
launchSingleTop = true
127127
}
128-
}
128+
},
129129
)
130130
}
131131

domain/src/main/java/com/threegap/bitnagil/domain/routine/model/Routine.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.threegap.bitnagil.domain.routine.model
22

3+
import java.time.LocalTime
4+
import java.time.format.DateTimeFormatter
5+
import java.util.Locale
6+
37
data class Routine(
48
val routineId: String,
59
val routineName: String,
@@ -10,4 +14,19 @@ data class Routine(
1014
val subRoutineNames: List<String>,
1115
val subRoutineCompleteYn: List<Boolean>,
1216
val recommendedRoutineType: RecommendedRoutineType?,
13-
)
17+
) {
18+
private val koreanLocale = Locale.KOREAN
19+
private val executionTimeFormatter12 = DateTimeFormatter.ofPattern("a h:mm", koreanLocale)
20+
21+
val formattedExecutionTime: String =
22+
try {
23+
val time = LocalTime.parse(executionTime)
24+
if (time == LocalTime.MIDNIGHT) {
25+
"하루종일"
26+
} else {
27+
time.format(executionTimeFormatter12)
28+
}
29+
} catch (e: Exception) {
30+
"시간 미정"
31+
}
32+
}

presentation/src/main/java/com/threegap/bitnagil/presentation/routinelist/RoutineListScreen.kt

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ fun RoutineListScreenContainer(
4343
viewModel.sideEffectFlow.collectAsEffect { sideEffect ->
4444
when (sideEffect) {
4545
is RoutineListSideEffect.NavigateToBack -> navigateToBack()
46+
is RoutineListSideEffect.NavigateToWriteRoutine -> {
47+
// TODO: 네비게이션 연결하기
48+
// navigateToWriteRoutine(
49+
// routineId = sideEffect.routineId,
50+
// applyDate = sideEffect.applyDate,
51+
// )
52+
}
4653
}
4754
}
4855

@@ -59,15 +66,13 @@ fun RoutineListScreenContainer(
5966
}
6067

6168
if (uiState.editConfirmBottomSheetVisible) {
62-
EditConfirmBottomSheet(
63-
onDismissRequest = { viewModel.sendIntent(RoutineListIntent.HideEditConfirmBottomSheet) },
64-
onApplyToday = {
65-
// TODO("루틴수정으로 이동(id와 수정여부(TODAY) 넘겨주기")
66-
},
67-
onApplyTomorrow = {
68-
//TODO("루틴수정으로 이동(id와 수정여부(TOMORROW) 넘겨주기")
69-
},
70-
)
69+
uiState.selectedRoutine?.let {
70+
EditConfirmBottomSheet(
71+
onDismissRequest = { viewModel.sendIntent(RoutineListIntent.HideEditConfirmBottomSheet) },
72+
onApplyToday = { viewModel.sendIntent(RoutineListIntent.OnApplyTodayClick) },
73+
onApplyTomorrow = { viewModel.sendIntent(RoutineListIntent.OnApplyTomorrowClick) },
74+
)
75+
}
7176
}
7277

7378
RoutineListScreen(
@@ -78,8 +83,10 @@ fun RoutineListScreenContainer(
7883
onShowDeleteConfirmBottomSheet = { routine ->
7984
viewModel.sendIntent(RoutineListIntent.ShowDeleteConfirmBottomSheet(routine))
8085
},
81-
onShowEditConfirmBottomSheet = { viewModel.sendIntent(RoutineListIntent.ShowEditConfirmBottomSheet) },
82-
onRegisterRoutineClick = {},
86+
onShowEditConfirmBottomSheet = { routine ->
87+
viewModel.sendIntent(RoutineListIntent.ShowEditConfirmBottomSheet(routine))
88+
},
89+
onRegisterRoutineClick = { viewModel.sendIntent(RoutineListIntent.OnRegisterRoutineClick) },
8390
onBackClick = { viewModel.sendIntent(RoutineListIntent.NavigateToBack) },
8491
)
8592
}
@@ -89,7 +96,7 @@ private fun RoutineListScreen(
8996
uiState: RoutineListState,
9097
onDateSelect: (LocalDate) -> Unit,
9198
onShowDeleteConfirmBottomSheet: (RoutineUiModel) -> Unit,
92-
onShowEditConfirmBottomSheet: () -> Unit,
99+
onShowEditConfirmBottomSheet: (RoutineUiModel) -> Unit,
93100
onRegisterRoutineClick: () -> Unit,
94101
onBackClick: () -> Unit,
95102
modifier: Modifier = Modifier,
@@ -137,7 +144,7 @@ private fun RoutineListScreen(
137144
) { routine ->
138145
RoutineDetailsCard(
139146
routine = routine,
140-
onEditClick = { onShowEditConfirmBottomSheet() },
147+
onEditClick = { onShowEditConfirmBottomSheet(routine) },
141148
onDeleteClick = { onShowDeleteConfirmBottomSheet(routine) },
142149
)
143150
}

presentation/src/main/java/com/threegap/bitnagil/presentation/routinelist/RoutineListViewModel.kt

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,56 @@ class RoutineListViewModel @Inject constructor(
5656
)
5757
}
5858

59+
is RoutineListIntent.ShowEditConfirmBottomSheet -> {
60+
state.copy(
61+
selectedRoutine = intent.routine,
62+
editConfirmBottomSheetVisible = true,
63+
)
64+
}
65+
5966
is RoutineListIntent.HideDeleteConfirmBottomSheet -> state.copy(deleteConfirmBottomSheetVisible = false)
60-
is RoutineListIntent.ShowEditConfirmBottomSheet -> state.copy(editConfirmBottomSheetVisible = true)
6167
is RoutineListIntent.HideEditConfirmBottomSheet -> state.copy(editConfirmBottomSheetVisible = false)
6268

6369
is RoutineListIntent.NavigateToBack -> {
6470
sendSideEffect(RoutineListSideEffect.NavigateToBack)
6571
null
6672
}
73+
74+
is RoutineListIntent.OnRegisterRoutineClick -> {
75+
sendSideEffect(
76+
RoutineListSideEffect.NavigateToWriteRoutine(
77+
routineId = null,
78+
applyDate = null,
79+
),
80+
)
81+
null
82+
}
83+
84+
is RoutineListIntent.OnApplyTodayClick -> {
85+
val selectedRoutine = state.selectedRoutine
86+
if (selectedRoutine != null) {
87+
sendSideEffect(
88+
RoutineListSideEffect.NavigateToWriteRoutine(
89+
routineId = selectedRoutine.routineId,
90+
applyDate = "TODAY",
91+
),
92+
)
93+
}
94+
null
95+
}
96+
97+
is RoutineListIntent.OnApplyTomorrowClick -> {
98+
val selectedRoutine = state.selectedRoutine
99+
if (selectedRoutine != null) {
100+
sendSideEffect(
101+
RoutineListSideEffect.NavigateToWriteRoutine(
102+
routineId = selectedRoutine.routineId,
103+
applyDate = "TOMORROW",
104+
),
105+
)
106+
}
107+
null
108+
}
67109
}
68110

69111
return newState

presentation/src/main/java/com/threegap/bitnagil/presentation/routinelist/model/RoutineListIntent.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ sealed class RoutineListIntent : MviIntent {
88
data class LoadRoutines(val routines: RoutinesUiModel) : RoutineListIntent()
99
data class OnDateSelect(val date: LocalDate) : RoutineListIntent()
1010
data class ShowDeleteConfirmBottomSheet(val routine: RoutineUiModel) : RoutineListIntent()
11+
data class ShowEditConfirmBottomSheet(val routine: RoutineUiModel) : RoutineListIntent()
1112
data object HideDeleteConfirmBottomSheet : RoutineListIntent()
12-
data object ShowEditConfirmBottomSheet : RoutineListIntent()
1313
data object HideEditConfirmBottomSheet : RoutineListIntent()
1414
data object NavigateToBack : RoutineListIntent()
15+
data object OnRegisterRoutineClick : RoutineListIntent()
16+
data object OnApplyTodayClick : RoutineListIntent()
17+
data object OnApplyTomorrowClick : RoutineListIntent()
1518
}

presentation/src/main/java/com/threegap/bitnagil/presentation/routinelist/model/RoutineListSideEffect.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ import com.threegap.bitnagil.presentation.common.mviviewmodel.MviSideEffect
44

55
sealed interface RoutineListSideEffect : MviSideEffect {
66
data object NavigateToBack : RoutineListSideEffect
7+
data class NavigateToWriteRoutine(val routineId: String?, val applyDate: String?) : RoutineListSideEffect
78
}

0 commit comments

Comments
 (0)