diff --git a/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift b/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift index 2ffc377..fa59594 100644 --- a/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift +++ b/SodaLive/Sources/Live/Room/LiveRoomViewModel.swift @@ -212,7 +212,12 @@ final class LiveRoomViewModel: NSObject, ObservableObject { } } } - @Published var heartNicknameList = [String]() + @Published var heartNicknameList = [(nickname: String, duration: TimeInterval)]() + + // HEART_DONATION/BIG_HEART_DONATION 메시지 표시 시간 제어 + private let heartDonationDisplayDuration: TimeInterval = 1.5 + private let bigHeartDonationDisplayDuration: TimeInterval = 3.0 + private var currentHeartMessageDuration: TimeInterval = 1.5 private var menuId = 0 @Published var menu = "" @@ -956,7 +961,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject { .store(in: &subscription) } - func shareRoom() { + func shareRoom() { if let liveRoomInfo = self.liveRoomInfo { let params = [ "af_dp": "voiceon://", @@ -1969,10 +1974,10 @@ final class LiveRoomViewModel: NSObject, ObservableObject { agora.sendRawMessageToGroup(rawMessage: donationRawMessage) { [unowned self] _, error in if error == nil { let (nickname, _) = self.getUserNicknameAndProfileUrl(accountId: UserDefaults.int(forKey: .userId)) - self.addHeartMessage(nickname: nickname) + self.addHeartMessage(nickname: nickname, type: messageType) totalHeartCount += heartCount - + if messageType == .BIG_HEART_DONATION { // 로컬 발신: 수신 알림 직후 즉시 폭발 연출만 보이고, // 물 채움(1초)은 발신 측에서는 생략 @@ -2054,18 +2059,22 @@ final class LiveRoomViewModel: NSObject, ObservableObject { } } - private func addHeartMessage(nickname: String) { + private func addHeartMessage(nickname: String, type: LiveRoomChatRawMessage.LiveRoomChatRawMessageType = .HEART_DONATION) { + let duration: TimeInterval = (type == .BIG_HEART_DONATION) ? bigHeartDonationDisplayDuration : heartDonationDisplayDuration if heartNickname != nil { - self.heartNicknameList.append(nickname) + self.heartNicknameList.append((nickname: nickname, duration: duration)) } else { + self.currentHeartMessageDuration = duration self.heartNickname = nickname } } private func showNextHeartMessage() { - DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { - if let nextHeartNickname = self.heartNicknameList.first { - self.heartNickname = nextHeartNickname + let delay = currentHeartMessageDuration + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { + if let next = self.heartNicknameList.first { + self.currentHeartMessageDuration = next.duration + self.heartNickname = next.nickname self.heartNicknameList.removeFirst() } else { self.heartNickname = nil @@ -2091,7 +2100,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject { heartTimer?.cancel() heartTimer = nil } - + private func addBigHeartAnimation() { // 로컬 발신 직후 1회는 원격 물 채움 연출을 생략하고 바로 폭발만 실행 if suppressNextRemoteWaterFill { @@ -2516,11 +2525,11 @@ extension LiveRoomViewModel: AgoraRtmClientDelegate { } else if decoded.type == .EDIT_ROOM_INFO || decoded.type == .SET_MANAGER { self.getRoomInfo() } else if decoded.type == .HEART_DONATION { - self.addHeartMessage(nickname: nickname) + self.addHeartMessage(nickname: nickname, type: .HEART_DONATION) self.totalHeartCount += decoded.can self.addHeart() } else if decoded.type == .BIG_HEART_DONATION { - self.addHeartMessage(nickname: nickname) + self.addHeartMessage(nickname: nickname, type: .BIG_HEART_DONATION) self.totalHeartCount += decoded.can self.addBigHeartAnimation() }