Skip to content

Commit a36945b

Browse files
committed
[BOOK-273] fix: 독서 기록 API 중복 호출 방지를 위한 LoadingIndicator 추가
1 parent 38c27b0 commit a36945b

File tree

4 files changed

+41
-26
lines changed

4 files changed

+41
-26
lines changed

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

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import dagger.assisted.AssistedFactory
3232
import dagger.assisted.AssistedInject
3333
import dagger.hilt.android.components.ActivityRetainedComponent
3434
import kotlinx.collections.immutable.toPersistentList
35+
import kotlinx.coroutines.delay
3536
import kotlinx.coroutines.launch
3637

3738
class RecordRegisterPresenter @AssistedInject constructor(
@@ -43,6 +44,7 @@ class RecordRegisterPresenter @AssistedInject constructor(
4344
@Composable
4445
override fun present(): RecordRegisterUiState {
4546
val scope = rememberCoroutineScope()
47+
var isLoading by rememberRetained { mutableStateOf(false) }
4648
var sideEffect by rememberRetained { mutableStateOf<RecordRegisterSideEffect?>(null) }
4749
var currentStep by rememberRetained { mutableStateOf(RecordStep.QUOTE) }
4850
val recordPageState = rememberTextFieldState()
@@ -108,33 +110,38 @@ class RecordRegisterPresenter @AssistedInject constructor(
108110
impression: String,
109111
) {
110112
scope.launch {
111-
repository.postRecord(
112-
userBookId = userBookId,
113-
pageNumber = pageNumber,
114-
quote = quote,
115-
emotionTags = emotionTags,
116-
review = impression,
117-
).onSuccess { result ->
118-
savedRecordId = result.id
119-
isRecordSavedDialogVisible = true
120-
}.onFailure { exception ->
121-
postErrorDialog(
122-
errorScope = ErrorScope.RECORD_REGISTER,
123-
exception = exception,
124-
)
125-
126-
val handleErrorMessage = { message: String ->
127-
Logger.e(message)
128-
sideEffect = RecordRegisterSideEffect.ShowToast(message)
129-
}
113+
try {
114+
isLoading = true
115+
repository.postRecord(
116+
userBookId = userBookId,
117+
pageNumber = pageNumber,
118+
quote = quote,
119+
emotionTags = emotionTags,
120+
review = impression,
121+
).onSuccess { result ->
122+
savedRecordId = result.id
123+
isRecordSavedDialogVisible = true
124+
}.onFailure { exception ->
125+
postErrorDialog(
126+
errorScope = ErrorScope.RECORD_REGISTER,
127+
exception = exception,
128+
)
129+
130+
val handleErrorMessage = { message: String ->
131+
Logger.e(message)
132+
sideEffect = RecordRegisterSideEffect.ShowToast(message)
133+
}
130134

131-
handleException(
132-
exception = exception,
133-
onError = handleErrorMessage,
134-
onLoginRequired = {
135-
navigator.resetRoot(LoginScreen)
136-
},
137-
)
135+
handleException(
136+
exception = exception,
137+
onError = handleErrorMessage,
138+
onLoginRequired = {
139+
navigator.resetRoot(LoginScreen)
140+
},
141+
)
142+
}
143+
} finally {
144+
isLoading = false
138145
}
139146
}
140147
}
@@ -259,6 +266,7 @@ class RecordRegisterPresenter @AssistedInject constructor(
259266
}
260267

261268
return RecordRegisterUiState(
269+
isLoading = isLoading,
262270
currentStep = currentStep,
263271
recordPageState = recordPageState,
264272
recordSentenceState = recordSentenceState,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.ninecraft.booket.core.designsystem.theme.ReedTheme
2424
import com.ninecraft.booket.core.designsystem.theme.White
2525
import com.ninecraft.booket.core.ui.component.ReedBackTopAppBar
2626
import com.ninecraft.booket.core.ui.component.ReedDialog
27+
import com.ninecraft.booket.core.ui.component.ReedLoadingIndicator
2728
import com.ninecraft.booket.feature.record.R
2829
import com.ninecraft.booket.feature.record.step.EmotionStep
2930
import com.ninecraft.booket.feature.record.step.ImpressionStep
@@ -80,6 +81,10 @@ internal fun RecordRegisterUi(
8081
}
8182
}
8283

84+
if (state.isLoading) {
85+
ReedLoadingIndicator()
86+
}
87+
8388
if (state.isExitDialogVisible) {
8489
ReedDialog(
8590
title = stringResource(R.string.record_exit_dialog_title),

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import kotlinx.collections.immutable.persistentListOf
1111
import java.util.UUID
1212

1313
data class RecordRegisterUiState(
14+
val isLoading: Boolean = false,
1415
val currentStep: RecordStep = RecordStep.QUOTE,
1516
val recordPageState: TextFieldState = TextFieldState(),
1617
val recordSentenceState: TextFieldState = TextFieldState(),

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/step/ImpressionStep.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import com.ninecraft.booket.core.designsystem.component.button.smallRoundedButto
4040
import com.ninecraft.booket.core.designsystem.component.textfield.ReedRecordTextField
4141
import com.ninecraft.booket.core.designsystem.theme.ReedTheme
4242
import com.ninecraft.booket.core.designsystem.theme.White
43+
import com.ninecraft.booket.core.ui.component.ReedLoadingIndicator
4344
import com.ninecraft.booket.feature.record.R
4445
import com.ninecraft.booket.feature.record.component.ImpressionGuideBottomSheet
4546
import com.ninecraft.booket.feature.record.register.RecordRegisterUiEvent

0 commit comments

Comments
 (0)