wip
This commit is contained in:
parent
3fc0be729e
commit
822c4fe749
|
@ -10,7 +10,6 @@ enum AppAction: Codable {
|
|||
case rostersAction(_ action: RostersAction)
|
||||
case chatsAction(_ action: ChatsAction)
|
||||
case conversationAction(_ action: ConversationAction)
|
||||
case messagesAction(_ action: MessagesAction)
|
||||
case sharingAction(_ action: SharingAction)
|
||||
case fileAction(_ action: FileAction)
|
||||
}
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
enum MessagesAction: Codable {
|
||||
case currentConversationMessagesUpdated(messages: [Message])
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
import Foundation
|
||||
|
||||
enum XMPPAction: Codable {
|
||||
case clientConnectionChanged(jid: String, state: ConnectionStatus)
|
||||
case xmppMessageReceived(Message)
|
||||
|
@ -10,4 +12,6 @@ enum XMPPAction: Codable {
|
|||
case xmppSharingUploadFailed(msgId: String, reason: String)
|
||||
case xmppSharingUploadSuccess(msgId: String, attachmentRemotePath: String)
|
||||
case serverFeaturesLoaded(jid: String, features: [String])
|
||||
|
||||
case xmppLoadArchivedMessages(jid: String, to: String?, fromDate: Date)
|
||||
}
|
||||
|
|
|
@ -488,7 +488,7 @@ private extension DatabaseMiddleware {
|
|||
} receiveValue: { messages in
|
||||
// messages
|
||||
DispatchQueue.main.async {
|
||||
store.dispatch(.messagesAction(.currentConversationMessagesUpdated(messages: messages)))
|
||||
store.dispatch(.conversationAction(.messagesUpdated(messages: messages)))
|
||||
}
|
||||
}
|
||||
.store(in: &conversationCancellables)
|
||||
|
|
|
@ -4,11 +4,24 @@ import Foundation
|
|||
final class MessagesMiddleware {
|
||||
static let shared = MessagesMiddleware()
|
||||
|
||||
func middleware(state _: AppState, action: AppAction) -> AnyPublisher<AppAction, Never> {
|
||||
func middleware(state: AppState, action: AppAction) -> AnyPublisher<AppAction, Never> {
|
||||
switch action {
|
||||
case .messagesAction(.currentConversationMessagesUpdated(let messages)):
|
||||
return Just(.conversationAction(.messagesUpdated(messages: messages)))
|
||||
.eraseToAnyPublisher()
|
||||
case .conversationAction(.makeConversationActive(let chat, let roster)):
|
||||
return Future<AppAction, Never> { 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 oldestMessageDate = state.conversationsState.currentMessages.first?.date ?? Date()
|
||||
let archivesRequestDate = Calendar.current.date(byAdding: .day, value: -7, to: oldestMessageDate) ?? Date()
|
||||
promise(.success(.xmppAction(.xmppLoadArchivedMessages(jid: currentClient.bareJid, to: roster?.bareJid, fromDate: archivesRequestDate))))
|
||||
} 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()
|
||||
|
|
|
@ -129,6 +129,13 @@ final class XMPPMiddleware {
|
|||
}
|
||||
.eraseToAnyPublisher()
|
||||
|
||||
case .xmppAction(.xmppLoadArchivedMessages(let jid, let to, let fromDate)):
|
||||
return Future<AppAction, Never> { [weak self] promise in
|
||||
self?.service.requestArchivedMessages(jid: jid, to: to, fromDate: fromDate)
|
||||
promise(.success(.info("XMPPMiddleware: archived messages requested for \(jid) from \(fromDate)")))
|
||||
}
|
||||
.eraseToAnyPublisher()
|
||||
|
||||
default:
|
||||
return Empty().eraseToAnyPublisher()
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ extension AppState {
|
|||
case .startAction(let action):
|
||||
StartState.reducer(state: &state.startState, action: action)
|
||||
|
||||
case .databaseAction, .xmppAction, .fileAction, .info, .messagesAction:
|
||||
case .databaseAction, .xmppAction, .fileAction, .info:
|
||||
break // this actions are processed by other middlewares
|
||||
|
||||
case .accountsAction(let action):
|
||||
|
|
|
@ -250,4 +250,19 @@ final class XMPPService: ObservableObject {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func requestArchivedMessages(jid: String, to: String?, fromDate: Date) {
|
||||
guard let client = getClient(for: jid) else {
|
||||
return
|
||||
}
|
||||
client.module(.mam).queryItems(componentJid: JID(jid), with: JID(to), start: fromDate, end: Date(), queryId: UUID().uuidString) { result in
|
||||
switch result {
|
||||
case .success(let response):
|
||||
print("MAM response: \(response)")
|
||||
|
||||
case .failure(let error):
|
||||
print("MAM error: \(error)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,4 +43,7 @@ enum Const {
|
|||
|
||||
// Size for attachment preview
|
||||
static let attachmentPreviewSize = UIScreen.main.bounds.width * 0.5
|
||||
|
||||
// Lenght in days for MAM request
|
||||
static let mamRequestLength = 7
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue