Skip to content

Commit 927604f

Browse files
committed
[BOOK-482] feat: 감정 선택 & 수정 화면 에러 핸들링 추가
1 parent 9d3e7be commit 927604f

6 files changed

Lines changed: 105 additions & 23 deletions

File tree

feature/edit/src/main/kotlin/com/ninecraft/booket/feature/edit/emotion/EmotionEditPresenter.kt

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.ninecraft.booket.feature.screens.EmotionEditScreen.Result
1717
import com.ninecraft.booket.feature.screens.LoginScreen
1818
import com.ninecraft.booket.feature.screens.arguments.DetailEmotionArg
1919
import com.ninecraft.booket.feature.screens.arguments.PrimaryEmotionArg
20+
import com.orhanobut.logger.Logger
2021
import com.slack.circuit.codegen.annotations.CircuitInject
2122
import com.slack.circuit.retained.rememberRetained
2223
import com.slack.circuit.runtime.Navigator
@@ -47,6 +48,7 @@ class EmotionEditPresenter(
4748
@Composable
4849
override fun present(): EmotionEditUiState {
4950
val scope = rememberCoroutineScope()
51+
var emotionUiState by rememberRetained { mutableStateOf<EmotionUiState>(EmotionUiState.idle) }
5052
var emotionGroups by rememberRetained { mutableStateOf(persistentListOf<EmotionGroupModel>()) }
5153
var selectedEmotionCode by rememberRetained { mutableStateOf<EmotionCode?>(null) }
5254
var selectedEmotionMap by rememberRetained { mutableStateOf<Map<EmotionCode, ImmutableList<String>>>(emptyMap()) }
@@ -68,6 +70,35 @@ class EmotionEditPresenter(
6870
}
6971
}
7072

73+
fun getEmotionGroups() {
74+
scope.launch {
75+
emotionUiState = EmotionUiState.Loading
76+
emotionRepository.getEmotions()
77+
.onSuccess { result ->
78+
emotionUiState = EmotionUiState.Success
79+
emotionGroups = result.emotions.toPersistentList()
80+
selectedEmotionCode = screen.primaryEmotionCode
81+
selectedEmotionMap = mapOf(screen.primaryEmotionCode to screen.detailEmotionIds.toPersistentList())
82+
committedEmotionCode = screen.primaryEmotionCode
83+
committedEmotionMap = mapOf(screen.primaryEmotionCode to screen.detailEmotionIds.toPersistentList())
84+
}.onFailure { exception ->
85+
emotionUiState = EmotionUiState.Error(exception)
86+
87+
val handleErrorMessage = { message: String ->
88+
Logger.e(message)
89+
}
90+
91+
handleException(
92+
exception = exception,
93+
onError = handleErrorMessage,
94+
onLoginRequired = {
95+
navigator.resetRoot(LoginScreen())
96+
},
97+
)
98+
}
99+
}
100+
}
101+
71102
fun handleEvent(event: EmotionEditUiEvent) {
72103
when (event) {
73104
is EmotionEditUiEvent.OnBackClick -> {
@@ -163,27 +194,10 @@ class EmotionEditPresenter(
163194
is EmotionEditUiEvent.OnEmotionDetailBottomSheetDismiss -> {
164195
isEmotionDetailBottomSheetVisible = false
165196
}
166-
}
167-
}
168197

169-
fun getEmotionGroups() {
170-
scope.launch {
171-
emotionRepository.getEmotions()
172-
.onSuccess { result ->
173-
emotionGroups = result.emotions.toPersistentList()
174-
selectedEmotionCode = screen.primaryEmotionCode
175-
selectedEmotionMap = mapOf(screen.primaryEmotionCode to screen.detailEmotionIds.toPersistentList())
176-
committedEmotionCode = screen.primaryEmotionCode
177-
committedEmotionMap = mapOf(screen.primaryEmotionCode to screen.detailEmotionIds.toPersistentList())
178-
}.onFailure { exception ->
179-
handleException(
180-
exception = exception,
181-
onError = {},
182-
onLoginRequired = {
183-
navigator.resetRoot(LoginScreen())
184-
},
185-
)
186-
}
198+
EmotionEditUiEvent.OnRetryGetEmotions -> {
199+
getEmotionGroups()
200+
}
187201
}
188202
}
189203

@@ -192,6 +206,7 @@ class EmotionEditPresenter(
192206
}
193207

194208
return EmotionEditUiState(
209+
emotionUiState = emotionUiState,
195210
emotionGroups = emotionGroups,
196211
selectedEmotionCode = selectedEmotionCode,
197212
selectedEmotionMap = selectedEmotionMap,

feature/edit/src/main/kotlin/com/ninecraft/booket/feature/edit/emotion/EmotionEditUi.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import androidx.compose.ui.Alignment
1919
import androidx.compose.ui.Modifier
2020
import androidx.compose.ui.res.stringResource
2121
import androidx.compose.ui.unit.dp
22+
import com.ninecraft.booket.core.common.extensions.toErrorType
2223
import com.ninecraft.booket.core.designsystem.ComponentPreview
2324
import com.ninecraft.booket.core.designsystem.component.button.ReedButton
2425
import com.ninecraft.booket.core.designsystem.component.button.ReedButtonColorStyle
@@ -27,6 +28,8 @@ import com.ninecraft.booket.core.designsystem.theme.ReedTheme
2728
import com.ninecraft.booket.core.designsystem.theme.White
2829
import com.ninecraft.booket.core.ui.ReedScaffold
2930
import com.ninecraft.booket.core.ui.component.ReedBackTopAppBar
31+
import com.ninecraft.booket.core.ui.component.ReedErrorUi
32+
import com.ninecraft.booket.core.ui.component.ReedLoadingIndicator
3033
import com.ninecraft.booket.feature.edit.R
3134
import com.ninecraft.booket.feature.edit.emotion.component.EmotionDetailBottomSheet
3235
import com.ninecraft.booket.feature.edit.emotion.component.EmotionItem
@@ -58,7 +61,23 @@ internal fun EmotionEditUi(
5861
state.eventSink(EmotionEditUiEvent.OnBackClick)
5962
},
6063
)
61-
EmotionEditContent(state = state)
64+
when (state.emotionUiState) {
65+
is EmotionUiState.idle -> {}
66+
is EmotionUiState.Loading -> {
67+
ReedLoadingIndicator()
68+
}
69+
70+
is EmotionUiState.Success -> {
71+
EmotionEditContent(state = state)
72+
}
73+
74+
is EmotionUiState.Error -> {
75+
ReedErrorUi(
76+
errorType = state.emotionUiState.exception.toErrorType(),
77+
onRetryClick = { state.eventSink(EmotionEditUiEvent.OnRetryGetEmotions) },
78+
)
79+
}
80+
}
6281
}
6382
}
6483
}

feature/edit/src/main/kotlin/com/ninecraft/booket/feature/edit/emotion/EmotionEditUiState.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
package com.ninecraft.booket.feature.edit.emotion
22

3+
import androidx.compose.runtime.Immutable
34
import com.ninecraft.booket.core.model.EmotionCode
45
import com.ninecraft.booket.core.model.EmotionGroupModel
56
import com.slack.circuit.runtime.CircuitUiEvent
67
import com.slack.circuit.runtime.CircuitUiState
78
import kotlinx.collections.immutable.ImmutableList
89
import kotlinx.collections.immutable.persistentListOf
910

11+
@Immutable
12+
sealed interface EmotionUiState {
13+
data object idle : EmotionUiState
14+
data object Loading : EmotionUiState
15+
data object Success : EmotionUiState
16+
data class Error(val exception: Throwable) : EmotionUiState
17+
}
18+
1019
data class EmotionEditUiState(
20+
val emotionUiState: EmotionUiState = EmotionUiState.idle,
1121
val isEditButtonEnabled: Boolean = false,
1222
val emotionGroups: ImmutableList<EmotionGroupModel> = persistentListOf(),
1323
val selectedEmotionCode: EmotionCode? = null,
@@ -27,4 +37,5 @@ sealed interface EmotionEditUiEvent : CircuitUiEvent {
2737
data object OnEmotionDetailSkipped : EmotionEditUiEvent
2838
data object OnEmotionDetailBottomSheetDismiss : EmotionEditUiEvent
2939
data object OnEditButtonClick : EmotionEditUiEvent
40+
data object OnRetryGetEmotions : EmotionEditUiEvent
3041
}

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterPresenter.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class RecordRegisterPresenter(
6767
override fun present(): RecordRegisterUiState {
6868
val scope = rememberCoroutineScope()
6969
var isLoading by rememberRetained { mutableStateOf(false) }
70+
var emotionUiState by rememberRetained { mutableStateOf<EmotionUiState>(EmotionUiState.idle) }
7071
var sideEffect by rememberRetained { mutableStateOf<RecordRegisterSideEffect?>(null) }
7172
var currentStep by rememberRetained { mutableStateOf(RecordStep.QUOTE) }
7273
val recordPageState = rememberTextFieldState()
@@ -153,13 +154,16 @@ class RecordRegisterPresenter(
153154

154155
fun getEmotionGroups() {
155156
scope.launch {
157+
emotionUiState = EmotionUiState.Loading
156158
emotionRepository.getEmotions()
157159
.onSuccess { result ->
160+
emotionUiState = EmotionUiState.Success
158161
emotionGroups = result.emotions.toPersistentList()
159162
}.onFailure { exception ->
163+
emotionUiState = EmotionUiState.Error(exception)
164+
160165
val handleErrorMessage = { message: String ->
161166
Logger.e(message)
162-
sideEffect = RecordRegisterSideEffect.ShowToast(message)
163167
}
164168

165169
handleException(
@@ -291,6 +295,10 @@ class RecordRegisterPresenter(
291295
navigator.delayedPop()
292296
}
293297
}
298+
299+
RecordRegisterUiEvent.OnRetryGetEmotions -> {
300+
getEmotionGroups()
301+
}
294302
}
295303
}
296304

@@ -308,6 +316,7 @@ class RecordRegisterPresenter(
308316

309317
return RecordRegisterUiState(
310318
isLoading = isLoading,
319+
emotionUiState = emotionUiState,
311320
currentStep = currentStep,
312321
recordPageState = recordPageState,
313322
recordSentenceState = recordSentenceState,

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ import androidx.compose.ui.res.painterResource
1818
import androidx.compose.ui.res.stringResource
1919
import androidx.compose.ui.unit.dp
2020
import com.ninecraft.booket.core.common.extensions.preventMultiTouch
21+
import com.ninecraft.booket.core.common.extensions.toErrorType
2122
import com.ninecraft.booket.core.designsystem.DevicePreview
2223
import com.ninecraft.booket.core.designsystem.RecordStep
2324
import com.ninecraft.booket.core.designsystem.component.RecordProgressBar
2425
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
2526
import com.ninecraft.booket.core.designsystem.theme.White
2627
import com.ninecraft.booket.core.ui.component.ReedBackTopAppBar
2728
import com.ninecraft.booket.core.ui.component.ReedDialog
29+
import com.ninecraft.booket.core.ui.component.ReedErrorUi
2830
import com.ninecraft.booket.core.ui.component.ReedLoadingIndicator
2931
import com.ninecraft.booket.feature.record.R
3032
import com.ninecraft.booket.feature.record.step_v2.EmotionStepV2
@@ -75,7 +77,23 @@ internal fun RecordRegisterUi(
7577
}
7678

7779
RecordStep.EMOTION -> {
78-
EmotionStepV2(state = state)
80+
when (state.emotionUiState) {
81+
is EmotionUiState.idle -> {}
82+
is EmotionUiState.Loading -> {
83+
ReedLoadingIndicator()
84+
}
85+
86+
is EmotionUiState.Success -> {
87+
EmotionStepV2(state = state)
88+
}
89+
90+
is EmotionUiState.Error -> {
91+
ReedErrorUi(
92+
errorType = state.emotionUiState.exception.toErrorType(),
93+
onRetryClick = { state.eventSink(RecordRegisterUiEvent.OnRetryGetEmotions) },
94+
)
95+
}
96+
}
7997
}
8098
}
8199
}

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUiState.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,17 @@ import kotlinx.collections.immutable.ImmutableList
1111
import kotlinx.collections.immutable.persistentListOf
1212
import java.util.UUID
1313

14+
@Immutable
15+
sealed interface EmotionUiState {
16+
data object idle : EmotionUiState
17+
data object Loading : EmotionUiState
18+
data object Success : EmotionUiState
19+
data class Error(val exception: Throwable) : EmotionUiState
20+
}
21+
1422
data class RecordRegisterUiState(
1523
val isLoading: Boolean = false,
24+
val emotionUiState: EmotionUiState = EmotionUiState.idle,
1625
val currentStep: RecordStep = RecordStep.QUOTE,
1726
val recordPageState: TextFieldState = TextFieldState(),
1827
val recordSentenceState: TextFieldState = TextFieldState(),
@@ -55,4 +64,5 @@ sealed interface RecordRegisterUiEvent : CircuitUiEvent {
5564
data object OnExitDialogDismiss : RecordRegisterUiEvent
5665
data class OnRecordSavedDialogConfirm(val recordId: String) : RecordRegisterUiEvent
5766
data object OnRecordSavedDialogDismiss : RecordRegisterUiEvent
67+
data object OnRetryGetEmotions : RecordRegisterUiEvent
5868
}

0 commit comments

Comments
 (0)