Rocket.Chat.ReactNative/ios/RocketChat Watch App/Loaders/MessageSender.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)
}
}