50 lines
1.2 KiB
Swift
50 lines
1.2 KiB
Swift
import Combine
|
|
import Foundation
|
|
|
|
protocol MessageSending {
|
|
func sendMessage(_ msg: String, in room: Room)
|
|
func resendMessage(messageID: String, msg: String, in room: Room)
|
|
}
|
|
|
|
final class MessageSender {
|
|
@Dependency private var client: RocketChatClientProtocol
|
|
@Dependency private var database: Database
|
|
|
|
private let server: Server
|
|
|
|
init(server: Server) {
|
|
self.server = server
|
|
}
|
|
}
|
|
|
|
extension MessageSender: MessageSending {
|
|
func sendMessage(_ msg: String, in room: Room) {
|
|
let messageID = database.createTempMessage(msg: msg, in: room, for: server.loggedUser)
|
|
|
|
resendMessage(messageID: messageID, msg: msg, in: room)
|
|
}
|
|
|
|
func resendMessage(messageID: String, msg: String, in room: Room) {
|
|
guard let rid = room.id else { return }
|
|
|
|
client.sendMessage(id: messageID, rid: rid, msg: msg)
|
|
.receive(on: DispatchQueue.main)
|
|
.subscribe(Subscribers.Sink { [weak self] completion in
|
|
guard let self else { return }
|
|
|
|
if case .failure = completion {
|
|
self.database.updateMessage(messageID, status: "error")
|
|
}
|
|
} receiveValue: { [weak self] messageResponse in
|
|
guard let self else {
|
|
return
|
|
}
|
|
|
|
let message = messageResponse.message
|
|
|
|
self.database.process(updatedMessage: message, in: room)
|
|
})
|
|
}
|
|
}
|
|
|