From 37dc3cd24a1291aeb1117b457adf6200008cdc6c Mon Sep 17 00:00:00 2001 From: klaus Date: Mon, 8 Jun 2026 17:41:25 +0900 Subject: [PATCH] =?UTF-8?q?feat(home):=20=ED=81=AC=EB=A6=AC=EC=97=90?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=9E=AD=ED=82=B9=20ViewModel=EC=9D=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/home/HomeCreatorRankingViewModel.kt | 70 +++++++++++++++++++ .../home/model/HomeCreatorRankingUiState.kt | 17 +++++ 2 files changed, 87 insertions(+) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeCreatorRankingViewModel.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeCreatorRankingUiState.kt diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeCreatorRankingViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeCreatorRankingViewModel.kt new file mode 100644 index 00000000..e2fa96e4 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/HomeCreatorRankingViewModel.kt @@ -0,0 +1,70 @@ +package kr.co.vividnext.sodalive.v2.main.home + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.orhanobut.logger.Logger +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.schedulers.Schedulers +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.base.BaseViewModel +import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.common.ToastMessage +import kr.co.vividnext.sodalive.v2.main.home.data.HomeCreatorRankingRepository +import kr.co.vividnext.sodalive.v2.main.home.model.HomeCreatorRankingUiState +import kr.co.vividnext.sodalive.v2.main.home.model.toCreatorRankingItems + +class HomeCreatorRankingViewModel( + private val repository: HomeCreatorRankingRepository +) : BaseViewModel() { + + private val _rankingStateLiveData = MutableLiveData() + val rankingStateLiveData: LiveData + get() = _rankingStateLiveData + + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData + get() = _toastLiveData + + private val _isLoading = MutableLiveData(false) + val isLoading: LiveData + get() = _isLoading + + fun loadCreatorRankings() { + _isLoading.value = true + _rankingStateLiveData.value = HomeCreatorRankingUiState.Loading + + compositeDisposable.add( + repository.getCreatorRankings(token = authToken()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + _isLoading.value = false + val data = it.data + if (it.success && data != null) { + val items = data.toCreatorRankingItems() + _rankingStateLiveData.value = if (items.isEmpty()) { + HomeCreatorRankingUiState.Empty + } else { + HomeCreatorRankingUiState.Content(items = items) + } + } else { + showUnknownError(it.message) + } + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + showUnknownError(it.message) + } + ) + ) + } + + private fun showUnknownError(message: String?) { + _rankingStateLiveData.value = HomeCreatorRankingUiState.Error(message = message) + _toastLiveData.postValue(ToastMessage(resId = R.string.common_error_unknown)) + } + + private fun authToken(): String = "Bearer ${SharedPreferenceManager.token}" +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeCreatorRankingUiState.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeCreatorRankingUiState.kt new file mode 100644 index 00000000..8501ef46 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/home/model/HomeCreatorRankingUiState.kt @@ -0,0 +1,17 @@ +package kr.co.vividnext.sodalive.v2.main.home.model + +import kr.co.vividnext.sodalive.v2.widget.creatorranking.CreatorRankingItem + +sealed interface HomeCreatorRankingUiState { + data object Loading : HomeCreatorRankingUiState + + data class Content( + val items: List + ) : HomeCreatorRankingUiState + + data object Empty : HomeCreatorRankingUiState + + data class Error( + val message: String? = null + ) : HomeCreatorRankingUiState +}