Skip to content

Commit 9287a72

Browse files
committed
Feat: 홈 토스트 메시지 추가
- 루틴 완료/미완료 처리 실패 시 토스트 메시지 표시 - 감정 구슬 중복 등록 시 토스트 메시지 표시
1 parent ed5058c commit 9287a72

File tree

4 files changed

+68
-4
lines changed

4 files changed

+68
-4
lines changed

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

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import com.threegap.bitnagil.designsystem.BitnagilTheme
2626
import com.threegap.bitnagil.designsystem.R
2727
import com.threegap.bitnagil.designsystem.component.atom.BitnagilIcon
2828
import com.threegap.bitnagil.designsystem.modifier.clickableWithoutRipple
29+
import com.threegap.bitnagil.presentation.common.flow.collectAsEffect
30+
import com.threegap.bitnagil.presentation.common.toast.GlobalBitnagilToast
2931
import com.threegap.bitnagil.presentation.home.component.template.CollapsibleHomeHeader
3032
import com.threegap.bitnagil.presentation.home.component.template.DeleteConfirmDialog
3133
import com.threegap.bitnagil.presentation.home.component.template.RoutineDetailsBottomSheet
@@ -34,6 +36,7 @@ import com.threegap.bitnagil.presentation.home.component.template.RoutineSection
3436
import com.threegap.bitnagil.presentation.home.component.template.RoutineSortBottomSheet
3537
import com.threegap.bitnagil.presentation.home.component.template.WeeklyDatePicker
3638
import com.threegap.bitnagil.presentation.home.model.HomeIntent
39+
import com.threegap.bitnagil.presentation.home.model.HomeSideEffect
3740
import com.threegap.bitnagil.presentation.home.model.HomeState
3841
import com.threegap.bitnagil.presentation.home.model.RoutineUiModel
3942
import com.threegap.bitnagil.presentation.home.util.rememberCollapsibleHeaderState
@@ -48,6 +51,30 @@ fun HomeScreenContainer(
4851
) {
4952
val uiState by viewModel.stateFlow.collectAsStateWithLifecycle()
5053

54+
viewModel.sideEffectFlow.collectAsEffect { sideEffect ->
55+
when (sideEffect) {
56+
is HomeSideEffect.NavigateToRegisterRoutine -> {
57+
navigateToRegisterRoutine()
58+
}
59+
60+
is HomeSideEffect.NavigateToEmotion -> {
61+
navigateToEmotion()
62+
}
63+
64+
is HomeSideEffect.NavigateToEditRoutine -> {
65+
navigateToEditRoutine(sideEffect.routineId)
66+
}
67+
68+
is HomeSideEffect.ShowToastWithIcon -> {
69+
GlobalBitnagilToast.showCheck(sideEffect.message)
70+
}
71+
72+
is HomeSideEffect.ShowToast -> {
73+
GlobalBitnagilToast.show(sideEffect.message)
74+
}
75+
}
76+
}
77+
5178
if (uiState.routineSortBottomSheetVisible) {
5279
RoutineSortBottomSheet(
5380
currentSortType = uiState.currentSortType,
@@ -65,7 +92,7 @@ fun HomeScreenContainer(
6592
RoutineDetailsBottomSheet(
6693
routine = routine,
6794
onDismiss = { viewModel.sendIntent(HomeIntent.HideRoutineDetailsBottomSheet) },
68-
onEdit = navigateToEditRoutine,
95+
onEdit = { viewModel.sendIntent(HomeIntent.NavigateToEditRoutine(routine.routineId)) },
6996
onDelete = {
7097
if (routine.repeatDay.isEmpty()) {
7198
viewModel.deleteRoutine(routine.routineId)
@@ -117,8 +144,12 @@ fun HomeScreenContainer(
117144
onShowRoutineDetailsBottomSheet = { routine ->
118145
viewModel.sendIntent(HomeIntent.ShowRoutineDetailsBottomSheet(routine))
119146
},
120-
onRegisterRoutineClick = navigateToRegisterRoutine,
121-
onRegisterEmotionClick = navigateToEmotion,
147+
onRegisterRoutineClick = {
148+
viewModel.sendIntent(HomeIntent.OnRegisterRoutineClick)
149+
},
150+
onRegisterEmotionClick = {
151+
viewModel.sendIntent(HomeIntent.OnRegisterEmotionClick)
152+
},
122153
)
123154
}
124155

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,30 @@ class HomeViewModel @Inject constructor(
200200
is HomeIntent.LoadMyEmotion -> {
201201
state.copy(myEmotion = intent.emotion)
202202
}
203+
204+
is HomeIntent.OnRegisterEmotionClick -> {
205+
if (state.myEmotion == null) {
206+
sendSideEffect(HomeSideEffect.NavigateToEmotion)
207+
} else {
208+
sendSideEffect(HomeSideEffect.ShowToastWithIcon("선택한 감정 구슬이 이미 반영되었어요."))
209+
}
210+
null
211+
}
212+
213+
is HomeIntent.OnRegisterRoutineClick -> {
214+
sendSideEffect(HomeSideEffect.NavigateToRegisterRoutine)
215+
null
216+
}
217+
218+
is HomeIntent.RoutineToggleCompletionFailure -> {
219+
sendSideEffect(HomeSideEffect.ShowToast("루틴 완료 상태 저장에 실패했어요.\n다시 시도해 주세요."))
220+
null
221+
}
222+
223+
is HomeIntent.NavigateToEditRoutine -> {
224+
sendSideEffect(HomeSideEffect.NavigateToEditRoutine(intent.routineId))
225+
null
226+
}
203227
}
204228
return newState
205229
}
@@ -450,6 +474,7 @@ class HomeViewModel @Inject constructor(
450474
onFailure = { error ->
451475
Log.e("HomeViewModel", "루틴 동기화 실패: ${error.message}")
452476
val backupState = backupStatesByDate[dateKey] ?: return
477+
sendIntent(HomeIntent.RoutineToggleCompletionFailure)
453478
sendIntent(HomeIntent.LoadWeeklyRoutines(backupState))
454479
pendingChangesByDate.remove(dateKey)
455480
backupStatesByDate.remove(dateKey)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ sealed class HomeIntent : MviIntent {
2020
data class RestoreRoutinesAfterDeleteByDayFailure(val backupRoutines: RoutinesUiModel) : HomeIntent()
2121
data class ShowRoutineDetailsBottomSheet(val routine: RoutineUiModel) : HomeIntent()
2222
data class ShowDeleteConfirmDialog(val routine: RoutineUiModel) : HomeIntent()
23+
data class NavigateToEditRoutine(val routineId: String) : HomeIntent()
24+
data object RoutineToggleCompletionFailure : HomeIntent()
25+
data object OnRegisterEmotionClick : HomeIntent()
26+
data object OnRegisterRoutineClick : HomeIntent()
2327
data object OnPreviousWeekClick : HomeIntent()
2428
data object OnNextWeekClick : HomeIntent()
2529
data object ShowRoutineSortBottomSheet : HomeIntent()

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,9 @@ package com.threegap.bitnagil.presentation.home.model
33
import com.threegap.bitnagil.presentation.common.mviviewmodel.MviSideEffect
44

55
sealed interface HomeSideEffect : MviSideEffect {
6-
data class ProcessRoutineToggle(val originalState: HomeState) : HomeSideEffect
6+
data class ShowToast(val message: String) : HomeSideEffect
7+
data class ShowToastWithIcon(val message: String) : HomeSideEffect
8+
data class NavigateToEditRoutine(val routineId: String) : HomeSideEffect
9+
data object NavigateToRegisterRoutine : HomeSideEffect
10+
data object NavigateToEmotion : HomeSideEffect
711
}

0 commit comments

Comments
 (0)