Files
featherVoice/TUIKit/TUIRoomKit/Source/View/ViewModel/RaiseHandApplicationNotificationViewModel.swift

105 lines
4.1 KiB
Swift
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// RaiseHandApplicationNotificationViewModel.swift
// TUIRoomKit
//
// Created by janejntang on 2024/5/16.
//
import Foundation
import RTCRoomEngine
protocol RaiseHandApplicationNotificationViewModelResponder: AnyObject {
func showRaiseHandApplicationNotificationView(userId: String, userName: String, count: Int)
func hideRaiseHandApplicationNotificationView()
}
class RaiseHandApplicationNotificationViewModel: NSObject {
var delayDisappearanceTime = 5.0
lazy var userId: String? = {
return inviteSeatList.last?.userId
}()
lazy var userName: String? = {
return inviteSeatList.last?.userName
}()
lazy var applicationCount: Int? = {
return inviteSeatList.count
}()
weak var responder: RaiseHandApplicationNotificationViewModelResponder?
var inviteSeatList: [RequestEntity] {
EngineManager.shared.store.inviteSeatList
}
lazy var isShownRaiseHandApplicationNotificationView: Bool = {
return getShownRequestEntity() != nil
}()
override init() {
super.init()
subscribeEngine()
}
private func subscribeEngine() {
EngineEventCenter.shared.subscribeEngine(event: .onRequestReceived, observer: self)
EngineEventCenter.shared.subscribeEngine(event: .onDeletedTakeSeatRequest, observer: self)
EngineEventCenter.shared.subscribeUIEvent(key: .TUIRoomKitService_RenewSeatList, responder: self)
}
private func unsubscribeEngine() {
EngineEventCenter.shared.unsubscribeEngine(event: .onRequestReceived, observer: self)
EngineEventCenter.shared.unsubscribeEngine(event: .onDeletedTakeSeatRequest, observer: self)
EngineEventCenter.shared.unsubscribeUIEvent(key: .TUIRoomKitService_RenewSeatList, responder: self)
}
private func getShownRequestEntity() -> RequestEntity? {
let currentTime = Date().timeIntervalSince1970
guard let lastItem = inviteSeatList.last else { return nil }
if delayDisappearanceTime > 0, currentTime - lastItem.timestamp > delayDisappearanceTime {
return nil
} else {
return lastItem
}
}
func checkRaiseHandApplicationAction() {
RoomRouter.shared.presentPopUpViewController(viewType: .raiseHandApplicationListViewType, height: 720.scale375Height(), backgroundColor: UIColor(0x22262E))
}
deinit {
unsubscribeEngine()
}
}
extension RaiseHandApplicationNotificationViewModel: RoomEngineEventResponder {
func onEngineEvent(name: EngineEventCenter.RoomEngineEvent, param: [String : Any]?) {
switch name {
case .onRequestReceived:
guard let request = param?["request"] as? TUIRequest else { return }
guard request.requestAction == .takeSeat else { return }
self.userId = request.userId
self.userName = request.userName
responder?.showRaiseHandApplicationNotificationView(userId: request.userId, userName: request.userName, count: inviteSeatList.count)
case .onDeletedTakeSeatRequest:
guard let userId = param?["userId"] as? String else { return }
guard userId == self.userId else { return }
let requestItem = getShownRequestEntity()
self.userId = requestItem?.userId
self.userName = requestItem?.userName
if let requestItem = requestItem {
responder?.showRaiseHandApplicationNotificationView(userId: requestItem.userId, userName: requestItem.userName, count: inviteSeatList.count)
} else {
responder?.hideRaiseHandApplicationNotificationView()
}
default: break
}
}
}
extension RaiseHandApplicationNotificationViewModel: RoomKitUIEventResponder {
func onNotifyUIEvent(key: EngineEventCenter.RoomUIEvent, Object: Any?, info: [AnyHashable : Any]?) {
if key == .TUIRoomKitService_RenewSeatList {
guard let requestItem = getShownRequestEntity() else { return }
responder?.showRaiseHandApplicationNotificationView(userId: requestItem.userId, userName: requestItem.userName, count: inviteSeatList.count)
}
}
}