feat(live-room): BIG_HEART_DONATION 하트 메시지 3초 표시

HEART_DONATION은 기존 1.5초 유지. heartNicknameList를 (nickname,duration) 큐로 변경해 개별 표시시간을 저장. addHeartMessage(nickname:type:) 도입 및 호출부 수정. showNextHeartMessage가 현재 항목의 duration으로 전환 예약하도록 변경.
This commit is contained in:
Yu Sung
2025-11-06 17:35:31 +09:00
parent 0134a5286f
commit 6e3a1e1869

View File

@@ -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()
}