import Combine import Foundation final class ArchivedMessagesMiddleware { static let shared = ArchivedMessagesMiddleware() func middleware(state _: AppState, action: AppAction) -> AnyPublisher { switch action { // case .conversationAction(.messagesUpdated(let messages)): // if state.conversationsState.archivedMessagesRequested { // return Empty().eraseToAnyPublisher() // } else { // guard let chat = state.conversationsState.currentChat else { // return Empty().eraseToAnyPublisher() // } // return Deferred { // Future { promise in // if let currentClient = state.accountsState.accounts.first(where: { $0.bareJid == chat.account }) { // let features = state.accountsState.discoFeatures[currentClient.bareJid] ?? [] // if features.map({ $0.xep }).contains("XEP-0313") { // let roster = state.conversationsState.currentRoster // let date = self.archivesRequestDate(from: messages) // promise(.success(.xmppAction(.xmppLoadArchivedMessages(jid: currentClient.bareJid, to: roster?.bareJid, fromDate: date)))) // } else { // promise(.success(.info("MessageMiddleware: XEP-0313 not supported for client \(currentClient.bareJid)"))) // } // } else { // promise(.success(.info("MessageMiddleware: No client found for account \(chat.account), probably some error here"))) // } // } // } // .eraseToAnyPublisher() // } default: return Empty().eraseToAnyPublisher() } } } private extension ArchivedMessagesMiddleware { func archivesRequestDate(from messages: [Message]) -> Date { if let lastDate = messages.first?.date { return lastDate } else { return Calendar.current.date(byAdding: .day, value: -Const.mamRequestDaysLength, to: Date()) ?? Date() } } }