커뮤니티 댓글, 팬토크, 콘텐츠 댓글
- 프로필 이미지 터치시 차단, 신고가 가능한 유저 프로필 표시
This commit is contained in:
13
SodaLive/Sources/User/GetMemberProfileResponse.swift
Normal file
13
SodaLive/Sources/User/GetMemberProfileResponse.swift
Normal file
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// GetMemberProfileResponse.swift
|
||||
// SodaLive
|
||||
//
|
||||
// Created by klaus on 9/7/24.
|
||||
//
|
||||
|
||||
struct GetMemberProfileResponse: Decodable {
|
||||
let memberId: Int
|
||||
let nickname: String
|
||||
let profileImageUrl: String
|
||||
let isBlocked: Bool
|
||||
}
|
@@ -33,6 +33,7 @@ enum UserApi {
|
||||
case checkNickname(nickname: String)
|
||||
case changeNickname(request: ProfileUpdateRequest)
|
||||
case updateIdfa(request: IdfaUpdateRequest)
|
||||
case getMemberProfile(memberId: Int)
|
||||
}
|
||||
|
||||
extension UserApi: TargetType {
|
||||
@@ -80,10 +81,10 @@ extension UserApi: TargetType {
|
||||
|
||||
case .creatorUnFollow:
|
||||
return "/member/creator/unfollow"
|
||||
|
||||
|
||||
case .getBlockedMemberIdList:
|
||||
return "/member/block/id"
|
||||
|
||||
|
||||
case .getBlockedMemberList, .memberBlock:
|
||||
return "/member/block"
|
||||
|
||||
@@ -107,6 +108,9 @@ extension UserApi: TargetType {
|
||||
|
||||
case .updateIdfa:
|
||||
return "/member/adid/update"
|
||||
|
||||
case .getMemberProfile(let memberId):
|
||||
return "/member/profile/\(memberId)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,7 +120,7 @@ extension UserApi: TargetType {
|
||||
.profileImageUpdate:
|
||||
return .post
|
||||
|
||||
case .searchUser, .getMypage, .getMemberInfo, .getMyProfile, .getChangeNicknamePrice, .checkNickname, .getBlockedMemberList, .getBlockedMemberIdList:
|
||||
case .searchUser, .getMypage, .getMemberInfo, .getMyProfile, .getChangeNicknamePrice, .checkNickname, .getBlockedMemberList, .getBlockedMemberIdList, .getMemberProfile:
|
||||
return .get
|
||||
|
||||
case .updatePushToken, .profileUpdate, .changeNickname, .updateIdfa:
|
||||
@@ -141,7 +145,7 @@ extension UserApi: TargetType {
|
||||
case .getMypage, .getMyProfile, .getMemberInfo:
|
||||
return .requestParameters(parameters: ["container" : "ios"], encoding: URLEncoding.queryString)
|
||||
|
||||
case .logout, .logoutAllDevice, .getChangeNicknamePrice, .getBlockedMemberIdList:
|
||||
case .logout, .logoutAllDevice, .getChangeNicknamePrice, .getBlockedMemberIdList, .getMemberProfile:
|
||||
return .requestPlain
|
||||
|
||||
case .notification(let request):
|
||||
|
@@ -120,4 +120,8 @@ final class UserRepository {
|
||||
func updateIdfa(request: IdfaUpdateRequest) -> AnyPublisher<Response, MoyaError> {
|
||||
return api.requestPublisher(.updateIdfa(request: request))
|
||||
}
|
||||
|
||||
func getMemberProfile(memberId: Int) -> AnyPublisher<Response, MoyaError> {
|
||||
return api.requestPublisher(.getMemberProfile(memberId: memberId))
|
||||
}
|
||||
}
|
||||
|
192
SodaLive/Sources/User/UserViewModel.swift
Normal file
192
SodaLive/Sources/User/UserViewModel.swift
Normal file
@@ -0,0 +1,192 @@
|
||||
//
|
||||
// UserViewModel.swift
|
||||
// SodaLive
|
||||
//
|
||||
// Created by klaus on 9/7/24.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Moya
|
||||
import Combine
|
||||
|
||||
final class UserViewModel: ObservableObject {
|
||||
private let repository = UserRepository()
|
||||
private let reportRepository = ReportRepository()
|
||||
private var subscription = Set<AnyCancellable>()
|
||||
|
||||
@Published var isLoading = false
|
||||
@Published var errorMessage = ""
|
||||
@Published var isShowPopup = false
|
||||
|
||||
@Published var memberId = 0
|
||||
@Published var nickname = ""
|
||||
@Published var dismissDialog = false
|
||||
|
||||
@Published var isShowUesrBlockConfirm = false
|
||||
@Published var isShowUesrReportView = false
|
||||
@Published var isShowProfileReportConfirm = false
|
||||
|
||||
@Published var memberProfile: GetMemberProfileResponse?
|
||||
|
||||
func getMemberProfile(memberId: Int) {
|
||||
isLoading = true
|
||||
|
||||
repository.getMemberProfile(memberId: memberId)
|
||||
.sink { result in
|
||||
switch result {
|
||||
case .finished:
|
||||
DEBUG_LOG("finish")
|
||||
case .failure(let error):
|
||||
ERROR_LOG(error.localizedDescription)
|
||||
}
|
||||
} receiveValue: { [unowned self] response in
|
||||
let responseData = response.data
|
||||
|
||||
do {
|
||||
let jsonDecoder = JSONDecoder()
|
||||
let decoded = try jsonDecoder.decode(ApiResponse<GetMemberProfileResponse>.self, from: responseData)
|
||||
|
||||
if let data = decoded.data, decoded.success {
|
||||
self.memberProfile = data
|
||||
self.memberId = data.memberId
|
||||
self.nickname = data.nickname
|
||||
} else {
|
||||
if let message = decoded.message {
|
||||
self.errorMessage = message
|
||||
} else {
|
||||
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
|
||||
}
|
||||
|
||||
self.isShowPopup = true
|
||||
}
|
||||
} catch {
|
||||
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
|
||||
self.isShowPopup = true
|
||||
}
|
||||
|
||||
self.isLoading = false
|
||||
}
|
||||
.store(in: &subscription)
|
||||
}
|
||||
|
||||
func memberBlock() {
|
||||
isLoading = true
|
||||
repository.memberBlock(userId: memberId)
|
||||
.sink { result in
|
||||
switch result {
|
||||
case .finished:
|
||||
DEBUG_LOG("finish")
|
||||
case .failure(let error):
|
||||
ERROR_LOG(error.localizedDescription)
|
||||
}
|
||||
} receiveValue: { [unowned self] response in
|
||||
self.isLoading = false
|
||||
let responseData = response.data
|
||||
|
||||
do {
|
||||
let jsonDecoder = JSONDecoder()
|
||||
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
|
||||
|
||||
if decoded.success {
|
||||
self.errorMessage = "차단하였습니다."
|
||||
self.dismissDialog = true
|
||||
|
||||
self.memberId = 0
|
||||
self.nickname = ""
|
||||
} else {
|
||||
if let message = decoded.message {
|
||||
self.errorMessage = message
|
||||
} else {
|
||||
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
|
||||
}
|
||||
}
|
||||
|
||||
self.isShowPopup = true
|
||||
} catch {
|
||||
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
|
||||
self.isShowPopup = true
|
||||
}
|
||||
}
|
||||
.store(in: &subscription)
|
||||
}
|
||||
|
||||
func memberUnBlock() {
|
||||
isLoading = true
|
||||
repository.memberUnBlock(userId: memberId)
|
||||
.sink { result in
|
||||
switch result {
|
||||
case .finished:
|
||||
DEBUG_LOG("finish")
|
||||
case .failure(let error):
|
||||
ERROR_LOG(error.localizedDescription)
|
||||
}
|
||||
} receiveValue: { [unowned self] response in
|
||||
self.isLoading = false
|
||||
let responseData = response.data
|
||||
|
||||
do {
|
||||
let jsonDecoder = JSONDecoder()
|
||||
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
|
||||
|
||||
if decoded.success {
|
||||
self.errorMessage = "차단이 해제 되었습니다."
|
||||
self.dismissDialog = true
|
||||
|
||||
self.memberId = 0
|
||||
self.nickname = ""
|
||||
} else {
|
||||
if let message = decoded.message {
|
||||
self.errorMessage = message
|
||||
} else {
|
||||
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
|
||||
}
|
||||
}
|
||||
|
||||
self.isShowPopup = true
|
||||
} catch {
|
||||
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
|
||||
self.isShowPopup = true
|
||||
}
|
||||
}
|
||||
.store(in: &subscription)
|
||||
}
|
||||
|
||||
func report(type: ReportType, reason: String = "프로필 신고") {
|
||||
isLoading = true
|
||||
|
||||
let request = ReportRequest(type: type, reason: reason, reportedMemberId: memberId, cheersId: nil, audioContentId: nil)
|
||||
reportRepository.report(request: request)
|
||||
.sink { result in
|
||||
switch result {
|
||||
case .finished:
|
||||
DEBUG_LOG("finish")
|
||||
case .failure(let error):
|
||||
ERROR_LOG(error.localizedDescription)
|
||||
}
|
||||
} receiveValue: { [unowned self] response in
|
||||
self.isLoading = false
|
||||
let responseData = response.data
|
||||
|
||||
self.memberId = 0
|
||||
self.nickname = ""
|
||||
self.dismissDialog = true
|
||||
|
||||
do {
|
||||
let jsonDecoder = JSONDecoder()
|
||||
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
|
||||
|
||||
if let message = decoded.message {
|
||||
self.errorMessage = message
|
||||
} else {
|
||||
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
|
||||
}
|
||||
|
||||
self.isShowPopup = true
|
||||
} catch {
|
||||
self.errorMessage = "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
|
||||
self.isShowPopup = true
|
||||
}
|
||||
}
|
||||
.store(in: &subscription)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user