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

97 lines
3.3 KiB
Swift
Raw Normal View History

2025-08-08 10:49:36 +08:00
//
// RaiseHandApplicationListViewModel.swift
// TUIRoomKit
//
// Created by janejntang on 2023/1/13.
// Copyright © 2023 Tencent. All rights reserved.
//
import Foundation
import RTCRoomEngine
protocol RaiseHandApplicationListViewResponder: NSObject {
func reloadApplyListView()
func makeToast(text: String)
func updatePlaceholderViewState(isShown: Bool)
func updateApplyButtonState(isEnabled: Bool)
}
class RaiseHandApplicationListViewModel: NSObject {
weak var viewResponder: RaiseHandApplicationListViewResponder? = nil
var engineManager: EngineManager {
EngineManager.shared
}
var roomInfo: TUIRoomInfo {
engineManager.store.roomInfo
}
var inviteSeatList: [RequestEntity] = []
var isPlaceholderViewShown: Bool {
return inviteSeatList.isEmpty
}
var isApplyButtonEnabled: Bool {
return !inviteSeatList.isEmpty
}
override init() {
super.init()
inviteSeatList = engineManager.store.inviteSeatList
EngineEventCenter.shared.subscribeUIEvent(key: .TUIRoomKitService_RenewSeatList, responder: self)
}
func respondAllRequest(isAgree: Bool) {
var isShownStageFullToast = false
for requestEntity in engineManager.store.inviteSeatList {
engineManager.responseRemoteRequest(requestEntity.requestId, agree: isAgree) { [weak self] in
guard let self = self else { return }
self.engineManager.store.deleteTakeSeatRequest(requestId: requestEntity.requestId)
} onError: { [weak self] code, message in
guard let self = self else { return }
guard code == .allSeatOccupied, !isShownStageFullToast else { return }
self.viewResponder?.makeToast(text: .onStageNumberReachedLimitText)
isShownStageFullToast = true
}
}
}
func respondRequest(isAgree: Bool, request: RequestEntity) {
engineManager.responseRemoteRequest(request.requestId, agree: isAgree) { [weak self] in
guard let self = self else { return }
self.engineManager.store.deleteTakeSeatRequest(requestId: request.requestId)
self.reloadApplyListView()
} onError: { [weak self] code, message in
guard let self = self else { return }
guard code == .allSeatOccupied else { return }
self.viewResponder?.makeToast(text: .onStageNumberReachedLimitText)
}
}
func reloadApplyListView() {
inviteSeatList = engineManager.store.inviteSeatList
viewResponder?.updatePlaceholderViewState(isShown: isPlaceholderViewShown)
viewResponder?.updateApplyButtonState(isEnabled: isApplyButtonEnabled)
viewResponder?.reloadApplyListView()
}
deinit {
EngineEventCenter.shared.unsubscribeUIEvent(key: .TUIRoomKitService_RenewSeatList, responder: self)
debugPrint("deinit \(self)")
}
}
extension RaiseHandApplicationListViewModel: RoomKitUIEventResponder {
func onNotifyUIEvent(key: EngineEventCenter.RoomUIEvent, Object: Any?, info: [AnyHashable : Any]?) {
if key == .TUIRoomKitService_RenewSeatList {
self.reloadApplyListView()
}
}
}
private extension String {
static var onStageNumberReachedLimitText: String {
localized("The stage is full")
}
}