fix(live-room): 방장 종료 후 오래된 룸 정보 오류 노출을 막는다
This commit is contained in:
@@ -287,6 +287,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
private var blockedMemberIdList = Set<Int>()
|
||||
|
||||
private var hasInvokedJoinChannel = false
|
||||
private var hasDetectedHostOffline = false
|
||||
private var v2vMessageAssembler = V2vMessageAssembler()
|
||||
private var v2vAgentId: String?
|
||||
private var v2vSourceLanguage: String?
|
||||
@@ -322,6 +323,35 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
liveRoomInfo?.creatorId == UserDefaults.int(forKey: .userId)
|
||||
}
|
||||
|
||||
private func shouldSuppressMissingRoomInfoError(_ message: String?) -> Bool {
|
||||
let ignorableLiveRoomNotFoundMessages: Set<String> = [
|
||||
"해당하는 라이브의 정보가 없습니다.",
|
||||
"Live session information not found.",
|
||||
"該当するライブの情報がありません。"
|
||||
]
|
||||
|
||||
guard let message, ignorableLiveRoomNotFoundMessages.contains(message) else {
|
||||
return false
|
||||
}
|
||||
|
||||
return liveRoomInfo != nil
|
||||
|| hasInvokedJoinChannel
|
||||
|| hasDetectedHostOffline
|
||||
|| AppState.shared.roomId == 0
|
||||
}
|
||||
|
||||
private func shouldRefreshRoomInfoOnMemberLeave(memberId: Int) -> Bool {
|
||||
guard let liveRoomInfo = liveRoomInfo else {
|
||||
return false
|
||||
}
|
||||
|
||||
guard !hasDetectedHostOffline else {
|
||||
return false
|
||||
}
|
||||
|
||||
return liveRoomInfo.creatorId != memberId
|
||||
}
|
||||
|
||||
func stopV2VTranslationIfJoined(clearCaptionText: Bool = true) {
|
||||
guard isV2VJoined else { return }
|
||||
stopV2VTranslation(clearCaptionText: clearCaptionText)
|
||||
@@ -616,6 +646,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
let previousIsChatFrozen = self.isChatFrozen
|
||||
let syncedIsChatFrozen = data.isChatFrozen ?? false
|
||||
|
||||
self.hasDetectedHostOffline = false
|
||||
self.liveRoomInfo = data
|
||||
self.updateV2VAvailability(roomInfo: data)
|
||||
|
||||
@@ -662,13 +693,17 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
onSuccess(nickname)
|
||||
}
|
||||
} else {
|
||||
if let message = decoded.message {
|
||||
self.errorMessage = message
|
||||
if self.shouldSuppressMissingRoomInfoError(decoded.message) {
|
||||
DEBUG_LOG("Suppress stale getRoomInfo error during live-room teardown: \(decoded.message ?? "")")
|
||||
} else {
|
||||
self.errorMessage = I18n.Common.commonError
|
||||
if let message = decoded.message {
|
||||
self.errorMessage = message
|
||||
} else {
|
||||
self.errorMessage = I18n.Common.commonError
|
||||
}
|
||||
|
||||
self.isShowErrorPopup = true
|
||||
}
|
||||
|
||||
self.isShowErrorPopup = true
|
||||
}
|
||||
|
||||
self.isLoading = false
|
||||
@@ -2973,12 +3008,13 @@ extension LiveRoomViewModel: AgoraRtcEngineDelegate {
|
||||
|
||||
if uid == UInt(creatorId) {
|
||||
// 라이브 종료
|
||||
self.hasDetectedHostOffline = true
|
||||
self.deInitAgoraEngine()
|
||||
self.liveRoomInfo = nil
|
||||
AppState.shared.errorMessage = I18n.LiveRoom.liveEndedMessage
|
||||
AppState.shared.isShowErrorPopup = true
|
||||
AppState.shared.roomId = 0
|
||||
} else {
|
||||
} else if self.shouldRefreshRoomInfoOnMemberLeave(memberId: Int(uid)) {
|
||||
// get room info
|
||||
self.getRoomInfo()
|
||||
}
|
||||
@@ -3265,7 +3301,7 @@ extension LiveRoomViewModel: AgoraRtmClientDelegate {
|
||||
}
|
||||
}
|
||||
} else if eventType == .remoteLeaveChannel {
|
||||
if let liveRoomInfo = liveRoomInfo, liveRoomInfo.creatorId != Int(memberId)! {
|
||||
if shouldRefreshRoomInfoOnMemberLeave(memberId: Int(memberId)!) {
|
||||
getRoomInfo()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user