Files
featherVoice/TUIKit/TUIRoomKit/Source/Common/Components/FloatChat/Service/FloatChatService.swift
2025-08-08 10:49:36 +08:00

58 lines
1.8 KiB
Swift

//
// FloatChatService.swift
// TUIRoomKit
//
// Created by CY zhao on 2024/5/14.
//
import Foundation
import RTCRoomEngine
import ImSDK_Plus
import TUICore
#if USE_OPENCOMBINE
import OpenCombine
#else
import Combine
#endif
import Factory
class FloatChatService: NSObject {
@WeakLazyInjected(\.floatChatService) private var store: FloatChatStoreProvider?
private let imManager = {
V2TIMManager.sharedInstance()
}()
private var roomId: String? {
self.store?.selectCurrent(FloatChatSelectors.getRoomId)
}
override init() {
super.init()
imManager?.addSimpleMsgListener(listener: self)
}
func sendGroupMessage(_ message: String) -> AnyPublisher<String, Never> {
return Future<String, Never> { [weak self] promise in
guard let self = self else { return }
self.imManager?.sendGroupTextMessage(message, to: self.roomId, priority: .PRIORITY_NORMAL, succ: {
promise(.success((message)))
}, fail: { code, message in
let errorMsg = TUITool.convertIMError(Int(code), msg: message)
//TODO: show toast from store.dispatch
RoomRouter.makeToastInWindow(toast:errorMsg ?? "send message fail", duration: 2)
})
}
.eraseToAnyPublisher()
}
}
extension FloatChatService: V2TIMSimpleMsgListener {
func onRecvGroupTextMessage(_ msgID: String!, groupID: String!, sender info: V2TIMGroupMemberInfo!, text: String!) {
guard groupID == roomId else {
return
}
let user = FloatChatUser(memberInfo: info)
let floatMessage = FloatChatMessage(user: user, content: text)
store?.dispatch(action: FloatChatActions.onMessageReceived(payload: floatMessage))
}
}