From ba6616c81acaaeb68fc8009679ec8559cb9822d4 Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 22 Jun 2026 22:06:58 +0900 Subject: [PATCH] =?UTF-8?q?fix(creator):=20=ED=9B=84=EC=9B=90=20empty=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A5=BC=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreatorChannelDonationViewModel.kt | 30 ++++++++++++++----- .../CreatorChannelDonationViewModelTest.kt | 19 ++++++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt index dae33b98..c992e8e4 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModel.kt @@ -123,10 +123,19 @@ class CreatorChannelDonationViewModel( } fun consumeActionToastMessage() { - val content = _donationStateLiveData.value as? CreatorChannelDonationUiState.Content ?: return - if (content.actionToastMessage == null) return - - _donationStateLiveData.value = content.copy(actionToastMessage = null) + when (val state = _donationStateLiveData.value) { + is CreatorChannelDonationUiState.Empty -> { + if (state.actionToastMessage != null) { + _donationStateLiveData.value = state.copy(actionToastMessage = null) + } + } + is CreatorChannelDonationUiState.Content -> { + if (state.actionToastMessage != null) { + _donationStateLiveData.value = state.copy(actionToastMessage = null) + } + } + else -> Unit + } } fun consumeDonationSuccessEvent(): Boolean { @@ -188,8 +197,11 @@ class CreatorChannelDonationViewModel( } private fun setActionToastMessage(message: String?) { - val content = _donationStateLiveData.value as? CreatorChannelDonationUiState.Content ?: return - _donationStateLiveData.value = content.copy(actionToastMessage = message) + when (val state = _donationStateLiveData.value) { + is CreatorChannelDonationUiState.Empty -> _donationStateLiveData.value = state.copy(actionToastMessage = message) + is CreatorChannelDonationUiState.Content -> _donationStateLiveData.value = state.copy(actionToastMessage = message) + else -> Unit + } } private fun CreatorChannelDonationTabResponse.toContentState( @@ -220,7 +232,11 @@ class CreatorChannelDonationViewModel( sealed interface CreatorChannelDonationUiState { data object Loading : CreatorChannelDonationUiState - data class Empty(val donationCount: Int, val isOwner: Boolean) : CreatorChannelDonationUiState + data class Empty( + val donationCount: Int, + val isOwner: Boolean, + val actionToastMessage: String? = null + ) : CreatorChannelDonationUiState data class Error(val message: String?) : CreatorChannelDonationUiState data class Content( val donationCount: Int, diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt index ea38ca74..e012e2e3 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationViewModelTest.kt @@ -133,6 +133,25 @@ class CreatorChannelDonationViewModelTest { assertEquals(0, SharedPreferenceManager.can) } + @Test + fun `Empty 상태에서 채널 후원 실패는 action toast message를 emit하고 consume한다`() { + stubGetDonations(response = Single.just(ApiResponse(true, donationResponse(donationCount = 0, ids = emptyList()), null))) + whenever(repository.postChannelDonation(100L, 50, false, "응원", "Bearer test-token")).thenReturn( + Single.just(ApiResponse(false, Any(), "후원 실패")) + ) + viewModel.loadDonations(100L, isOwner = false) + + viewModel.postChannelDonation(can = 50, isSecret = false, message = "응원") + + val state = viewModel.donationStateLiveData.requireValue() as CreatorChannelDonationUiState.Empty + assertEquals("후원 실패", state.actionToastMessage) + + viewModel.consumeActionToastMessage() + + val consumed = viewModel.donationStateLiveData.requireValue() as CreatorChannelDonationUiState.Empty + assertEquals(null, consumed.actionToastMessage) + } + private fun stubGetDonations( page: Int = 0, response: Single>