feat(creator): 채널 홈 ViewModel을 추가한다

This commit is contained in:
2026-06-13 17:20:06 +09:00
parent a355838039
commit 3027934295
3 changed files with 391 additions and 0 deletions

View File

@@ -176,6 +176,7 @@ import kr.co.vividnext.sodalive.user.UserViewModel
import kr.co.vividnext.sodalive.user.find_password.FindPasswordViewModel
import kr.co.vividnext.sodalive.user.login.LoginViewModel
import kr.co.vividnext.sodalive.user.signup.SignUpViewModel
import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelHomeViewModel
import kr.co.vividnext.sodalive.v2.creator.channel.data.CreatorChannelHomeApi
import kr.co.vividnext.sodalive.v2.creator.channel.data.CreatorChannelHomeRepository
import kr.co.vividnext.sodalive.v2.main.MainV2ViewModel
@@ -407,6 +408,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
viewModel { DmChatRoomViewModel(get()) }
viewModel { HomeCreatorRankingViewModel(get()) }
viewModel { HomeRecommendationViewModel(get()) }
viewModel { CreatorChannelHomeViewModel(get()) }
viewModel { PushNotificationListViewModel(get()) }
viewModel { CharacterTabViewModel(get()) }
viewModel { CharacterDetailViewModel(get()) }

View File

@@ -0,0 +1,141 @@
package kr.co.vividnext.sodalive.v2.creator.channel
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.creator.channel.data.CreatorChannelHomeRepository
import kr.co.vividnext.sodalive.v2.creator.channel.model.CreatorChannelHomeUiState
import kr.co.vividnext.sodalive.v2.creator.channel.model.toUiContent
class CreatorChannelHomeViewModel(
private val repository: CreatorChannelHomeRepository
) : BaseViewModel() {
private val _homeStateLiveData = MutableLiveData<CreatorChannelHomeUiState>()
val homeStateLiveData: LiveData<CreatorChannelHomeUiState>
get() = _homeStateLiveData
private val _toastLiveData = MutableLiveData<ToastMessage?>()
val toastLiveData: LiveData<ToastMessage?>
get() = _toastLiveData
private val _chatRoomIdLiveData = MutableLiveData<CreatorChannelEvent<Long>>()
val chatRoomIdLiveData: LiveData<CreatorChannelEvent<Long>>
get() = _chatRoomIdLiveData
private var isFollowInProgress = false
private var isCreateChatRoomInProgress = false
fun loadHome(creatorId: Long) {
if (creatorId <= 0) return
_homeStateLiveData.value = CreatorChannelHomeUiState.Loading
compositeDisposable.add(
repository.getHome(creatorId = creatorId, token = authToken())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
val data = it.data
if (it.success && data != null) {
_homeStateLiveData.value = data.toUiContent()
} else {
showUnknownError(it.message)
}
},
{
it.message?.let { message -> Logger.e(message) }
showUnknownError(it.message)
}
)
)
}
fun follow(follow: Boolean, notify: Boolean) {
val content = _homeStateLiveData.value as? CreatorChannelHomeUiState.Content ?: return
if (isFollowInProgress) return
isFollowInProgress = true
compositeDisposable.add(
repository.followCreator(
creatorId = content.header.creatorId,
follow = follow,
notify = notify,
token = authToken()
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
isFollowInProgress = false
if (it.success) {
_homeStateLiveData.value = content.copy(
header = content.header.copy(isFollow = follow, isNotify = notify)
)
} else {
showUnknownErrorToast()
}
},
{
isFollowInProgress = false
it.message?.let { message -> Logger.e(message) }
showUnknownErrorToast()
}
)
)
}
fun createChatRoom(characterId: Long) {
if (characterId <= 0 || isCreateChatRoomInProgress) return
isCreateChatRoomInProgress = true
compositeDisposable.add(
repository.createChatRoom(characterId = characterId, token = authToken())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
isCreateChatRoomInProgress = false
val data = it.data
if (it.success && data != null) {
_chatRoomIdLiveData.value = CreatorChannelEvent(data.chatRoomId)
} else {
showUnknownErrorToast()
}
},
{
isCreateChatRoomInProgress = false
it.message?.let { message -> Logger.e(message) }
showUnknownErrorToast()
}
)
)
}
private fun showUnknownError(message: String?) {
_homeStateLiveData.value = CreatorChannelHomeUiState.Error(message = message)
showUnknownErrorToast()
}
private fun showUnknownErrorToast() {
_toastLiveData.value = ToastMessage(resId = R.string.common_error_unknown)
}
private fun authToken(): String = "Bearer ${SharedPreferenceManager.token}"
}
class CreatorChannelEvent<out T>(private val value: T) {
private var consumed: Boolean = false
fun consume(): T? {
if (consumed) return null
consumed = true
return value
}
}