feat(creator): 채널 신고 차단 동작을 연결한다

This commit is contained in:
2026-06-16 17:27:13 +09:00
parent e8bd31454e
commit b2878e42ea
3 changed files with 104 additions and 3 deletions

View File

@@ -463,7 +463,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
factory { DmChatRepository(api = get(), realtimeClient = get()) } factory { DmChatRepository(api = get(), realtimeClient = get()) }
factory { HomeCreatorRankingRepository(get()) } factory { HomeCreatorRankingRepository(get()) }
factory { HomeRecommendationRepository(get()) } factory { HomeRecommendationRepository(get()) }
factory { CreatorChannelHomeRepository(api = get(), userRepository = get(), talkApi = get()) } factory { CreatorChannelHomeRepository(api = get(), userRepository = get(), talkApi = get(), reportRepository = get()) }
factory { CharacterTabRepository(get()) } factory { CharacterTabRepository(get()) }
factory { CharacterDetailRepository(get(), get()) } factory { CharacterDetailRepository(get(), get()) }
factory { CharacterGalleryRepository(get()) } factory { CharacterGalleryRepository(get()) }

View File

@@ -7,6 +7,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.common.ToastMessage 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.data.CreatorChannelHomeRepository
@@ -48,7 +49,7 @@ class CreatorChannelHomeViewModel(
{ {
val data = it.data val data = it.data
if (it.success && data != null) { if (it.success && data != null) {
_homeStateLiveData.value = data.toUiContent() _homeStateLiveData.value = data.toUiContent(currentMemberId = SharedPreferenceManager.userId)
} else { } else {
showUnknownError(it.message) showUnknownError(it.message)
} }
@@ -84,6 +85,11 @@ class CreatorChannelHomeViewModel(
_homeStateLiveData.value = content.copy( _homeStateLiveData.value = content.copy(
header = content.header.copy(isFollow = follow, isNotify = notify) header = content.header.copy(isFollow = follow, isNotify = notify)
) )
if (!follow) {
_toastLiveData.value = CreatorChannelEvent(
ToastMessage(resId = R.string.creator_channel_unfollow_success)
)
}
} else { } else {
showUnknownErrorToast() showUnknownErrorToast()
} }
@@ -125,6 +131,78 @@ class CreatorChannelHomeViewModel(
) )
} }
fun blockUser() {
val content = _homeStateLiveData.value as? CreatorChannelHomeUiState.Content ?: return
compositeDisposable.add(
repository.blockUser(content.header.creatorId, authToken())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.success) {
_toastLiveData.value = CreatorChannelEvent(
ToastMessage(resId = R.string.creator_channel_block_success)
)
} else {
showUnknownErrorToast()
}
},
{
it.message?.let { message -> Logger.e(message) }
showUnknownErrorToast()
}
)
)
}
fun reportUser(reason: String) {
val content = _homeStateLiveData.value as? CreatorChannelHomeUiState.Content ?: return
compositeDisposable.add(
repository.reportUser(content.header.creatorId, reason, authToken())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.success) {
showReportSubmittedToast()
} else {
showUnknownErrorToast()
}
},
{
it.message?.let { message -> Logger.e(message) }
showUnknownErrorToast()
}
)
)
}
fun reportProfile() {
val content = _homeStateLiveData.value as? CreatorChannelHomeUiState.Content ?: return
val reason = SodaLiveApplicationHolder.get().getString(R.string.dialog_member_profile_report_profile)
compositeDisposable.add(
repository.reportProfile(content.header.creatorId, reason, authToken())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.success) {
showReportSubmittedToast()
} else {
showUnknownErrorToast()
}
},
{
it.message?.let { message -> Logger.e(message) }
showUnknownErrorToast()
}
)
)
}
private fun showUnknownError(message: String?) { private fun showUnknownError(message: String?) {
_homeStateLiveData.value = CreatorChannelHomeUiState.Error(message = message) _homeStateLiveData.value = CreatorChannelHomeUiState.Error(message = message)
showUnknownErrorToast() showUnknownErrorToast()
@@ -134,6 +212,10 @@ class CreatorChannelHomeViewModel(
_toastLiveData.value = CreatorChannelEvent(ToastMessage(resId = R.string.common_error_unknown)) _toastLiveData.value = CreatorChannelEvent(ToastMessage(resId = R.string.common_error_unknown))
} }
private fun showReportSubmittedToast() {
_toastLiveData.value = CreatorChannelEvent(ToastMessage(resId = R.string.character_comment_report_submitted))
}
private fun authToken(): String = "Bearer ${SharedPreferenceManager.token}" private fun authToken(): String = "Bearer ${SharedPreferenceManager.token}"
} }

View File

@@ -2,12 +2,16 @@ package kr.co.vividnext.sodalive.v2.creator.channel.data
import kr.co.vividnext.sodalive.chat.talk.TalkApi import kr.co.vividnext.sodalive.chat.talk.TalkApi
import kr.co.vividnext.sodalive.chat.talk.room.CreateChatRoomRequest import kr.co.vividnext.sodalive.chat.talk.room.CreateChatRoomRequest
import kr.co.vividnext.sodalive.report.ReportRepository
import kr.co.vividnext.sodalive.report.ReportRequest
import kr.co.vividnext.sodalive.report.ReportType
import kr.co.vividnext.sodalive.user.UserRepository import kr.co.vividnext.sodalive.user.UserRepository
class CreatorChannelHomeRepository( class CreatorChannelHomeRepository(
private val api: CreatorChannelHomeApi, private val api: CreatorChannelHomeApi,
private val userRepository: UserRepository, private val userRepository: UserRepository,
private val talkApi: TalkApi private val talkApi: TalkApi,
private val reportRepository: ReportRepository
) { ) {
fun getHome(creatorId: Long, token: String) = api.getHome( fun getHome(creatorId: Long, token: String) = api.getHome(
creatorId = creatorId, creatorId = creatorId,
@@ -30,4 +34,19 @@ class CreatorChannelHomeRepository(
authHeader = token, authHeader = token,
request = CreateChatRoomRequest(characterId) request = CreateChatRoomRequest(characterId)
) )
fun blockUser(userId: Long, token: String) = userRepository.memberBlock(
userId = userId,
token = token
)
fun reportUser(userId: Long, reason: String, token: String) = reportRepository.report(
request = ReportRequest(ReportType.USER, reason, reportedMemberId = userId),
token = token
)
fun reportProfile(userId: Long, reason: String, token: String) = reportRepository.report(
request = ReportRequest(ReportType.PROFILE, reason, reportedMemberId = userId),
token = token
)
} }