89 lines
2.1 KiB
Swift
89 lines
2.1 KiB
Swift
import Combine
|
|
import Foundation
|
|
|
|
protocol MessageSending {
|
|
func sendMessage(_ msg: String, in room: Room)
|
|
func resendMessage(message: Message, 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
|
|
}
|
|
|
|
private func sendMessageCall(_ message: MergedRoom.Message, in roomID: String) {
|
|
database.handleSendMessageRequest(message, in: roomID)
|
|
|
|
client.sendMessage(id: message._id, rid: message.rid, msg: message.msg)
|
|
.receive(on: DispatchQueue.main)
|
|
.subscribe(Subscribers.Sink { [weak self] completion in
|
|
if case .failure = completion {
|
|
self?.database.handleSendMessageError(message._id)
|
|
}
|
|
} receiveValue: { [weak self] messageResponse in
|
|
self?.database.handleSendMessageResponse(messageResponse, in: roomID)
|
|
})
|
|
}
|
|
}
|
|
|
|
extension MessageSender: MessageSending {
|
|
func sendMessage(_ msg: String, in room: Room) {
|
|
guard let rid = room.rid, let roomID = room.id else { return }
|
|
|
|
let messageID = String.random(17)
|
|
let loggedUser = server.loggedUser
|
|
|
|
let newMessage = MergedRoom.Message(
|
|
_id: messageID,
|
|
rid: rid,
|
|
msg: msg,
|
|
u: .init(
|
|
_id: loggedUser.id,
|
|
username: loggedUser.username,
|
|
name: loggedUser.name
|
|
),
|
|
ts: Date(),
|
|
attachments: nil,
|
|
t: nil,
|
|
groupable: true,
|
|
editedAt: nil,
|
|
role: nil,
|
|
comment: nil
|
|
)
|
|
|
|
sendMessageCall(newMessage, in: roomID)
|
|
}
|
|
|
|
func resendMessage(message: Message, in room: Room) {
|
|
guard let rid = room.rid, let roomID = room.id else { return }
|
|
|
|
guard let id = message.id, let msg = message.msg, let user = message.user, let userID = user.id else { return }
|
|
|
|
let newMessage = MergedRoom.Message(
|
|
_id: id,
|
|
rid: rid,
|
|
msg: msg,
|
|
u: MergedRoom.Message.User(
|
|
_id: userID,
|
|
username: user.username,
|
|
name: user.name
|
|
),
|
|
ts: Date(),
|
|
attachments: nil,
|
|
t: nil,
|
|
groupable: true,
|
|
editedAt: nil,
|
|
role: nil,
|
|
comment: nil
|
|
)
|
|
|
|
sendMessageCall(newMessage, in: roomID)
|
|
}
|
|
}
|
|
|