feat(live-room): 채팅창 얼리기 기능을 추가한다
채팅 입력 제어와 룸 상태 동기화를 통합해 지연 입장자도 동일 상태를 적용한다.
This commit is contained in:
@@ -185,6 +185,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
@Published var remainingNoChattingTime = 0
|
||||
|
||||
@Published var isActiveRoulette = false
|
||||
@Published var isChatFrozen = false
|
||||
|
||||
@Published var isShowRouletteSettings = false
|
||||
|
||||
@@ -281,6 +282,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
var bigHeartParticleTimer: DispatchSourceTimer?
|
||||
|
||||
var isAvailableLikeHeart = false
|
||||
private var isSettingChatFreeze = false
|
||||
|
||||
private var blockedMemberIdList = Set<Int>()
|
||||
|
||||
@@ -308,6 +310,14 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
v2vAgentId != nil
|
||||
}
|
||||
|
||||
var isChatFrozenForCurrentUser: Bool {
|
||||
guard let liveRoomInfo = liveRoomInfo else {
|
||||
return false
|
||||
}
|
||||
|
||||
return isChatFrozen && liveRoomInfo.creatorId != UserDefaults.int(forKey: .userId)
|
||||
}
|
||||
|
||||
func stopV2VTranslationIfJoined(clearCaptionText: Bool = true) {
|
||||
guard isV2VJoined else { return }
|
||||
stopV2VTranslation(clearCaptionText: clearCaptionText)
|
||||
@@ -591,6 +601,9 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
let decoded = try jsonDecoder.decode(ApiResponse<GetRoomInfoResponse>.self, from: responseData)
|
||||
|
||||
if let data = decoded.data, decoded.success {
|
||||
let previousIsChatFrozen = self.isChatFrozen
|
||||
let syncedIsChatFrozen = data.isChatFrozen ?? false
|
||||
|
||||
self.liveRoomInfo = data
|
||||
self.updateV2VAvailability(roomInfo: data)
|
||||
|
||||
@@ -599,6 +612,12 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
}
|
||||
|
||||
self.isActiveRoulette = data.isActiveRoulette
|
||||
self.isChatFrozen = syncedIsChatFrozen
|
||||
|
||||
if syncedIsChatFrozen && !previousIsChatFrozen {
|
||||
self.appendChatFreezeStatusMessage(isChatFrozen: true)
|
||||
}
|
||||
|
||||
self.isLoading = true
|
||||
|
||||
let rtcState = self.agora.getRtcConnectionState()
|
||||
@@ -670,7 +689,10 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
|
||||
func sendMessage(chatMessage: String, onSuccess: @escaping () -> Void) {
|
||||
DispatchQueue.main.async {[unowned self] in
|
||||
if isNoChatting {
|
||||
if isChatFrozenForCurrentUser {
|
||||
self.popupContent = I18n.LiveRoom.chatFreezeBlockedMessage
|
||||
self.isShowPopup = true
|
||||
} else if isNoChatting {
|
||||
self.popupContent = "\(remainingNoChattingTime)초 동안 채팅하실 수 없습니다"
|
||||
self.isShowPopup = true
|
||||
} else if chatMessage.count > 0 {
|
||||
@@ -1883,6 +1905,74 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
func setChatFreeze(isChatFrozen: Bool) {
|
||||
guard let liveRoomInfo = liveRoomInfo,
|
||||
liveRoomInfo.creatorId == UserDefaults.int(forKey: .userId),
|
||||
!isSettingChatFreeze else {
|
||||
return
|
||||
}
|
||||
|
||||
isSettingChatFreeze = true
|
||||
|
||||
repository.setChatFreeze(roomId: liveRoomInfo.roomId, isChatFrozen: isChatFrozen)
|
||||
.sink { [unowned self] result in
|
||||
switch result {
|
||||
case .finished:
|
||||
DEBUG_LOG("finish")
|
||||
|
||||
case .failure(let error):
|
||||
ERROR_LOG(error.localizedDescription)
|
||||
self.isSettingChatFreeze = false
|
||||
self.errorMessage = I18n.Common.commonError
|
||||
self.isShowErrorPopup = true
|
||||
}
|
||||
} receiveValue: { [unowned self] response in
|
||||
self.isSettingChatFreeze = false
|
||||
let responseData = response.data
|
||||
|
||||
do {
|
||||
let jsonDecoder = JSONDecoder()
|
||||
let decoded = try jsonDecoder.decode(ApiResponseWithoutData.self, from: responseData)
|
||||
|
||||
if decoded.success {
|
||||
self.isChatFrozen = isChatFrozen
|
||||
self.appendChatFreezeStatusMessage(isChatFrozen: isChatFrozen)
|
||||
self.invalidateChat()
|
||||
|
||||
self.agora.sendRawMessageToGroup(
|
||||
rawMessage: LiveRoomChatRawMessage(
|
||||
type: .TOGGLE_CHAT_FREEZE,
|
||||
message: "",
|
||||
can: 0,
|
||||
donationMessage: "",
|
||||
isActiveRoulette: nil,
|
||||
isChatFrozen: isChatFrozen
|
||||
)
|
||||
)
|
||||
} else {
|
||||
if let message = decoded.message {
|
||||
self.errorMessage = message
|
||||
} else {
|
||||
self.errorMessage = I18n.Common.commonError
|
||||
}
|
||||
|
||||
self.isShowErrorPopup = true
|
||||
}
|
||||
} catch {
|
||||
self.errorMessage = I18n.Common.commonError
|
||||
self.isShowErrorPopup = true
|
||||
}
|
||||
}
|
||||
.store(in: &subscription)
|
||||
}
|
||||
|
||||
private func appendChatFreezeStatusMessage(isChatFrozen: Bool) {
|
||||
let statusMessage = isChatFrozen
|
||||
? I18n.LiveRoom.chatFreezeOnStatusMessage
|
||||
: I18n.LiveRoom.chatFreezeOffStatusMessage
|
||||
messages.append(LiveRoomJoinChat(nickname: "", statusMessage: statusMessage))
|
||||
}
|
||||
|
||||
func showRoulette() {
|
||||
if let liveRoomInfo = liveRoomInfo, !isLoading {
|
||||
@@ -2858,6 +2948,16 @@ extension LiveRoomViewModel: AgoraRtmClientDelegate {
|
||||
self.totalDonationCan += decoded.can
|
||||
} else if decoded.type == .TOGGLE_ROULETTE && decoded.isActiveRoulette != nil {
|
||||
self.isActiveRoulette = decoded.isActiveRoulette!
|
||||
} else if decoded.type == .TOGGLE_CHAT_FREEZE && decoded.isChatFrozen != nil {
|
||||
if Int(publisher) == self.liveRoomInfo?.creatorId {
|
||||
self.isChatFrozen = decoded.isChatFrozen!
|
||||
|
||||
if Int(publisher) != UserDefaults.int(forKey: .userId) {
|
||||
self.appendChatFreezeStatusMessage(isChatFrozen: self.isChatFrozen)
|
||||
}
|
||||
} else {
|
||||
DEBUG_LOG("Ignore TOGGLE_CHAT_FREEZE from non-creator publisher=\(publisher)")
|
||||
}
|
||||
} else if decoded.type == .EDIT_ROOM_INFO || decoded.type == .SET_MANAGER {
|
||||
self.getRoomInfo()
|
||||
} else if decoded.type == .HEART_DONATION {
|
||||
|
||||
Reference in New Issue
Block a user