feat(creator): 채널 홈 ViewModel을 추가한다
This commit is contained in:
@@ -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()) }
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user