diff --git a/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift b/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift index 8c5c440..e4e9ef6 100644 --- a/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift +++ b/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift @@ -189,6 +189,34 @@ final class LiveRoomViewModel: NSObject, ObservableObject { var timer: DispatchSourceTimer? + private var blockedMemberIdList = Set() + + func getBlockedMemberIdList() { + userRepository.getBlockedMemberIdList() + .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<[Int]>.self, from: responseData) + + if let data = decoded.data, decoded.success { + self.blockedMemberIdList.removeAll() + self.blockedMemberIdList.formUnion(data) + } + } catch { + } + } + .store(in: &subscription) + } + func setOriginOffset(_ offset: CGFloat) { guard !isCheckedOriginOffset else { return } self.originOffset = offset @@ -898,21 +926,21 @@ final class LiveRoomViewModel: NSObject, ObservableObject { } func kickOut() { - repository.kickOut(roomId: AppState.shared.roomId, userId: kickOutId) - .sink { result in - switch result { - case .finished: - DEBUG_LOG("finish") - case .failure(let error): - ERROR_LOG(error.localizedDescription) - } - } receiveValue: { _ in - - } - .store(in: &subscription) - - let nickname = getUserNicknameAndProfileUrl(accountId: kickOutId).nickname if UserDefaults.int(forKey: .userId) == liveRoomInfo?.creatorId { + repository.kickOut(roomId: AppState.shared.roomId, userId: kickOutId) + .sink { result in + switch result { + case .finished: + DEBUG_LOG("finish") + case .failure(let error): + ERROR_LOG(error.localizedDescription) + } + } receiveValue: { _ in + + } + .store(in: &subscription) + + let nickname = getUserNicknameAndProfileUrl(accountId: kickOutId).nickname agora.sendMessageToPeer(peerId: String(kickOutId), rawMessage: LiveRoomRequestType.KICK_OUT.rawValue.data(using: .utf8)!, completion: { [unowned self] errorCode in if errorCode == .ok { self.popupContent = "\(nickname)님을 내보냈습니다." @@ -1331,6 +1359,8 @@ final class LiveRoomViewModel: NSObject, ObservableObject { } func userBlock(onSuccess: @escaping (Int) -> Void) { + blockedMemberIdList.insert(reportUserId) + isLoading = true userRepository.memberBlock(userId: reportUserId) .sink { result in @@ -1374,6 +1404,8 @@ final class LiveRoomViewModel: NSObject, ObservableObject { } func userUnBlock() { + blockedMemberIdList.remove(reportUserId) + isLoading = true userRepository.memberUnBlock(userId: reportUserId) .sink { result in @@ -1972,11 +2004,12 @@ extension LiveRoomViewModel: AgoraRtmChannelDelegate { } catch { } } else { + let memberId = Int(member.userId) ?? 0 let chat = message.text - let rank = getUserRank(userId: Int(member.userId) ?? 0) + let rank = getUserRank(userId: memberId) - if !chat.trimmingCharacters(in: .whitespaces).isEmpty { - messages.append(LiveRoomNormalChat(userId: Int(member.userId)!, profileUrl: profileUrl, nickname: nickname, rank: rank, chat: chat)) + if !chat.trimmingCharacters(in: .whitespaces).isEmpty && !blockedMemberIdList.contains(memberId) { + messages.append(LiveRoomNormalChat(userId: memberId, profileUrl: profileUrl, nickname: nickname, rank: rank, chat: chat)) } } diff --git a/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift b/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift index 2699e9f..e2a84c6 100644 --- a/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift +++ b/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift @@ -358,6 +358,7 @@ struct LiveRoomViewV2: View { viewModel.getMemberCan() viewModel.initAgoraEngine() viewModel.getRoomInfo() + viewModel.getBlockedMemberIdList() NotificationCenter.default.addObserver( forName: UIApplication.willTerminateNotification, @@ -520,7 +521,7 @@ struct LiveRoomViewV2: View { ) Rectangle() - .foregroundColor(Color(hex: "222222")) + .foregroundColor(Color.gray22) .frame(width: screenSize().width, height: 15.3) } .ignoresSafeArea() diff --git a/SodaLive/Sources/User/UserApi.swift b/SodaLive/Sources/User/UserApi.swift index 125fdd4..010a91a 100644 --- a/SodaLive/Sources/User/UserApi.swift +++ b/SodaLive/Sources/User/UserApi.swift @@ -22,6 +22,7 @@ enum UserApi { case updatePushToken(request: PushTokenUpdateRequest) case creatorFollow(request: CreatorFollowRequest) case creatorUnFollow(request: CreatorFollowRequest) + case getBlockedMemberIdList case getBlockedMemberList(page: Int, size: Int) case memberBlock(request: MemberBlockRequest) case memberUnBlock(request: MemberBlockRequest) @@ -79,7 +80,10 @@ extension UserApi: TargetType { case .creatorUnFollow: return "/member/creator/unfollow" - + + case .getBlockedMemberIdList: + return "/member/block/id" + case .getBlockedMemberList, .memberBlock: return "/member/block" @@ -112,7 +116,7 @@ extension UserApi: TargetType { .profileImageUpdate: return .post - case .searchUser, .getMypage, .getMemberInfo, .getMyProfile, .getChangeNicknamePrice, .checkNickname, .getBlockedMemberList: + case .searchUser, .getMypage, .getMemberInfo, .getMyProfile, .getChangeNicknamePrice, .checkNickname, .getBlockedMemberList, .getBlockedMemberIdList: return .get case .updatePushToken, .profileUpdate, .changeNickname, .updateIdfa: @@ -137,7 +141,7 @@ extension UserApi: TargetType { case .getMypage, .getMyProfile, .getMemberInfo: return .requestParameters(parameters: ["container" : "ios"], encoding: URLEncoding.queryString) - case .logout, .logoutAllDevice, .getChangeNicknamePrice: + case .logout, .logoutAllDevice, .getChangeNicknamePrice, .getBlockedMemberIdList: return .requestPlain case .notification(let request): diff --git a/SodaLive/Sources/User/UserRepository.swift b/SodaLive/Sources/User/UserRepository.swift index d59e3d7..4fcb9a0 100644 --- a/SodaLive/Sources/User/UserRepository.swift +++ b/SodaLive/Sources/User/UserRepository.swift @@ -77,6 +77,10 @@ final class UserRepository { return api.requestPublisher(.creatorUnFollow(request: CreatorFollowRequest(creatorId: creatorId))) } + func getBlockedMemberIdList() -> AnyPublisher { + return api.requestPublisher(.getBlockedMemberIdList) + } + func getBlockedMemberList(page: Int, size: Int) -> AnyPublisher { return api.requestPublisher(.getBlockedMemberList(page: page, size: size)) }