커뮤니티 댓글, 팬토크, 콘텐츠 댓글

- 프로필 이미지 터치시 차단, 신고가 가능한 유저 프로필 표시
This commit is contained in:
2024-09-07 01:28:50 +09:00
parent 1b8d65c3ea
commit 1f36d8ef25
17 changed files with 546 additions and 8 deletions

View File

@@ -0,0 +1,12 @@
package kr.co.vividnext.sodalive.user
import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName
@Keep
data class GetMemberProfileResponse(
@SerializedName("memberId") val memberId: Long,
@SerializedName("nickname") val nickname: String,
@SerializedName("profileImageUrl") val profileImageUrl: String,
@SerializedName("isBlocked") val isBlocked: Boolean
)

View File

@@ -26,6 +26,7 @@ import retrofit2.http.Multipart
import retrofit2.http.POST
import retrofit2.http.PUT
import retrofit2.http.Part
import retrofit2.http.Path
import retrofit2.http.Query
interface UserApi {
@@ -157,4 +158,10 @@ interface UserApi {
fun getBlockedMemberIdList(
@Header("Authorization") authHeader: String
): Single<ApiResponse<List<Long>>>
@GET("/member/profile/{id}")
fun getMemberProfile(
@Path("id") id: Long,
@Header("Authorization") authHeader: String
): Single<ApiResponse<GetMemberProfileResponse>>
}

View File

@@ -124,4 +124,9 @@ class UserRepository(private val userApi: UserApi) {
)
fun getBlockedMemberIdList(token: String) = userApi.getBlockedMemberIdList(authHeader = token)
fun getMemberProfile(
id: Long,
token: String
) = userApi.getMemberProfile(id = id, authHeader = token)
}

View File

@@ -0,0 +1,165 @@
package kr.co.vividnext.sodalive.user
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.base.BaseViewModel
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.report.ReportRepository
import kr.co.vividnext.sodalive.report.ReportRequest
import kr.co.vividnext.sodalive.report.ReportType
class UserViewModel(
private val repository: UserRepository,
private val reportRepository: ReportRepository
) : BaseViewModel() {
private val _memberProfile = MutableLiveData<GetMemberProfileResponse>()
val memberProfile: LiveData<GetMemberProfileResponse>
get() = _memberProfile
private var _isLoading = MutableLiveData(false)
val isLoading: LiveData<Boolean>
get() = _isLoading
private val _toastLiveData = MutableLiveData<String?>()
val toastLiveData: LiveData<String?>
get() = _toastLiveData
fun getMemberProfile(id: Long, onSuccess: () -> Unit) {
_isLoading.value = true
compositeDisposable.add(
repository.getMemberProfile(
id = id,
token = "Bearer ${SharedPreferenceManager.token}"
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
_isLoading.value = false
if (it.success && it.data != null) {
_memberProfile.value = it.data!!
onSuccess()
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
)
}
}
},
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
)
}
)
)
}
fun memberBlock(memberId: Long, onSuccess: () -> Unit) {
_isLoading.value = true
compositeDisposable.add(
repository.memberBlock(
userId = memberId,
token = "Bearer ${SharedPreferenceManager.token}"
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
_isLoading.value = false
if (it.success) {
_toastLiveData.postValue("차단하였습니다.")
onSuccess()
} else {
val message = it.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
_toastLiveData.postValue(message)
}
},
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
}
)
)
}
fun memberUnBlock(memberId: Long, onSuccess: () -> Unit) {
_isLoading.value = true
compositeDisposable.add(
repository.memberUnBlock(
userId = memberId,
token = "Bearer ${SharedPreferenceManager.token}"
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
_isLoading.value = false
if (it.success) {
_toastLiveData.postValue("차단이 해제 되었습니다.")
onSuccess()
} else {
val message = it.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
_toastLiveData.postValue(message)
}
},
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
}
)
)
}
fun report(
type: ReportType,
userId: Long,
reason: String = "프로필 신고",
onSuccess: () -> Unit
) {
_isLoading.value = true
val request = ReportRequest(type, reason, reportedMemberId = userId)
compositeDisposable.add(
reportRepository.report(
request = request,
token = "Bearer ${SharedPreferenceManager.token}"
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.message != null) {
_toastLiveData.postValue(it.message)
} else {
_toastLiveData.postValue(
"신고가 접수되었습니다."
)
}
_isLoading.value = false
onSuccess()
},
{
_isLoading.value = false
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("신고가 접수되었습니다.")
onSuccess()
}
)
)
}
}