diff --git a/Examples/xx-messenger/Sources/AppCore/Groups/GroupMessageHandler.swift b/Examples/xx-messenger/Sources/AppCore/Groups/GroupMessageHandler.swift new file mode 100644 index 0000000000000000000000000000000000000000..c0316957f317d3409c990baaf585f6ba516e8ab2 --- /dev/null +++ b/Examples/xx-messenger/Sources/AppCore/Groups/GroupMessageHandler.swift @@ -0,0 +1,55 @@ +import XXModels +import XXClient +import Foundation +import XXMessengerClient +import XCTestDynamicOverlay + +public struct GroupMessageHandler { + public typealias OnError = (Error) -> Void + + public var run: (@escaping OnError) -> Cancellable + + public func callAsFunction(onError: @escaping OnError) -> Cancellable { + run(onError) + } +} + +extension GroupMessageHandler { + public static func live( + messenger: Messenger, + db: DBManagerGetDB + ) -> GroupMessageHandler { + GroupMessageHandler { onError in + messenger.registerGroupChatProcessor(.init { result in + switch result { + case .success(let callback): + do { + let payload = try MessagePayload.decode(callback.decryptedMessage.payload) + try db().saveMessage(.init( + networkId: callback.decryptedMessage.messageId, + senderId: callback.decryptedMessage.senderId, + recipientId: nil, + groupId: callback.decryptedMessage.groupId, + date: Date(timeIntervalSince1970: TimeInterval(callback.decryptedMessage.timestamp) / 1_000_000_000), + status: .received, + isUnread: true, + text: payload.text, + replyMessageId: payload.replyingTo, + roundURL: callback.roundUrl + )) + } catch { + onError(error) + } + case .failure(let error): + onError(error) + } + }) + } + } +} + +extension GroupMessageHandler { + public static let unimplemented = GroupMessageHandler( + run: XCTestDynamicOverlay.unimplemented("\(Self.self)", placeholder: Cancellable {}) + ) +}