Skip to content

Commit da55196

Browse files
committed
FIX: 감정 등록 중 타임아웃과 같은 에러 발생시 토스트 메세지 출력 후 이전 화면으로 이동되도록 수정
1 parent b3ea5cd commit da55196

5 files changed

Lines changed: 27 additions & 3 deletions

File tree

presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionScreen.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import androidx.activity.compose.BackHandler
44
import androidx.compose.runtime.Composable
55
import androidx.compose.runtime.collectAsState
66
import androidx.compose.runtime.getValue
7+
import androidx.compose.runtime.remember
78
import androidx.hilt.navigation.compose.hiltViewModel
89
import com.threegap.bitnagil.presentation.common.flow.collectAsEffect
10+
import com.threegap.bitnagil.presentation.common.toast.GlobalBitnagilToast
911
import com.threegap.bitnagil.presentation.emotion.component.template.EmotionRecommendRoutineScreen
1012
import com.threegap.bitnagil.presentation.emotion.component.template.SwipeEmotionSelectionScreen
1113
import com.threegap.bitnagil.presentation.emotion.model.EmotionScreenStep
@@ -25,14 +27,19 @@ fun EmotionScreenContainer(
2527
viewModel.sideEffectFlow.collectAsEffect { sideEffect ->
2628
when (sideEffect) {
2729
EmotionSideEffect.NavigateToBack -> navigateToBack()
30+
is EmotionSideEffect.ShowToast -> GlobalBitnagilToast.showWarning(sideEffect.message)
2831
}
2932
}
3033

3134
when (state.step) {
3235
EmotionScreenStep.Emotion -> SwipeEmotionSelectionScreen(
3336
state = state,
3437
onClickPreviousButton = navigateToBack,
35-
onSelectEmotion = viewModel::selectEmotion,
38+
onSelectEmotion = remember {
39+
{ emotionType ->
40+
viewModel.selectEmotion(emotionType = emotionType, minimumDelay = 1000)
41+
}
42+
},
3643
)
3744
EmotionScreenStep.RecommendRoutines -> EmotionRecommendRoutineScreen(
3845
state = state,

presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/EmotionViewModel.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionIntent
1313
import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionSideEffect
1414
import com.threegap.bitnagil.presentation.emotion.model.mvi.EmotionState
1515
import dagger.hilt.android.lifecycle.HiltViewModel
16+
import kotlinx.coroutines.delay
1617
import kotlinx.coroutines.launch
1718
import org.orbitmvi.orbit.syntax.simple.SimpleSyntax
1819
import javax.inject.Inject
@@ -103,22 +104,35 @@ class EmotionViewModel @Inject constructor(
103104
sendSideEffect(EmotionSideEffect.NavigateToBack)
104105
return null
105106
}
107+
108+
is EmotionIntent.RegisterEmotionFailure -> {
109+
sendSideEffect(EmotionSideEffect.ShowToast(intent.message))
110+
sendSideEffect(EmotionSideEffect.NavigateToBack)
111+
return null
112+
}
106113
}
107114
}
108115

109-
fun selectEmotion(emotionType: String) {
116+
fun selectEmotion(emotionType: String, minimumDelay: Long = 0) {
110117
val isLoading = stateFlow.value.isLoading
111118
if (isLoading) return
112119

113120
viewModelScope.launch {
114121
sendIntent(EmotionIntent.RegisterEmotionLoading)
122+
123+
if (minimumDelay > 0) {
124+
delay(minimumDelay)
125+
}
126+
115127
registerEmotionUseCase(emotionType = emotionType).fold(
116128
onSuccess = { emotionRecommendRoutines ->
117129
val recommendRoutines = emotionRecommendRoutines.map { EmotionRecommendRoutineUiModel.fromEmotionRecommendRoutine(it) }
118130
sendIntent(EmotionIntent.RegisterEmotionSuccess(recommendRoutines))
119131
},
120132
onFailure = {
121-
// todo 실패 케이스 정의되면 처리
133+
sendIntent(
134+
EmotionIntent.RegisterEmotionFailure(message = it.message ?: "에러가 발생했습니다. 잠시 후 시도해주세요."),
135+
)
122136
},
123137
)
124138
}

presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/component/template/SwipeEmotionSelectionScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ private fun EmotionPager(
316316
pageSpacing = pageSpacing,
317317
contentPadding = PaddingValues(horizontal = contentPadding),
318318
verticalAlignment = Alignment.Top,
319+
userScrollEnabled = enabled,
319320
) { page ->
320321
val itemIndex = page % emotions.size
321322
EmotionPagerItem(

presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionIntent.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ sealed class EmotionIntent : MviIntent {
88
data class EmotionListLoadSuccess(val emotionTypeUiModels: List<EmotionUiModel>) : EmotionIntent()
99
data class RegisterEmotionSuccess(val recommendRoutines: List<EmotionRecommendRoutineUiModel>) : EmotionIntent()
1010
data object RegisterEmotionLoading : EmotionIntent()
11+
data class RegisterEmotionFailure(val message: String) : EmotionIntent()
1112
data object RegisterRecommendRoutinesLoading : EmotionIntent()
1213
data object RegisterRecommendRoutinesSuccess : EmotionIntent()
1314
data object RegisterRecommendRoutinesFailure : EmotionIntent()

presentation/src/main/java/com/threegap/bitnagil/presentation/emotion/model/mvi/EmotionSideEffect.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 class EmotionSideEffect : MviSideEffect {
66
data object NavigateToBack : EmotionSideEffect()
7+
data class ShowToast(val message: String) : EmotionSideEffect()
78
}

0 commit comments

Comments
 (0)