Skip to content
Snippets Groups Projects
Commit 2bd04721 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Fetch file transfers in ChatFeature

parent 41cc0515
No related branches found
No related tags found
2 merge requests!124File transfers example,!102Release 1.0.0
...@@ -115,31 +115,50 @@ public let chatReducer = Reducer<ChatState, ChatAction, ChatEnvironment> ...@@ -115,31 +115,50 @@ public let chatReducer = Reducer<ChatState, ChatAction, ChatEnvironment>
let myContactId = try env.messenger.e2e.tryGet().getContact().getId() let myContactId = try env.messenger.e2e.tryGet().getContact().getId()
state.myContactId = myContactId state.myContactId = myContactId
let queryChat: XXModels.Message.Query.Chat let queryChat: XXModels.Message.Query.Chat
let receivedFileTransfersQuery: XXModels.FileTransfer.Query
let sentFileTransfersQuery: XXModels.FileTransfer.Query
switch state.id { switch state.id {
case .contact(let contactId): case .contact(let contactId):
queryChat = .direct(myContactId, contactId) queryChat = .direct(myContactId, contactId)
receivedFileTransfersQuery = .init(
contactId: contactId,
isIncoming: true
)
sentFileTransfersQuery = .init(
contactId: myContactId,
isIncoming: false
)
} }
let query = XXModels.Message.Query(chat: queryChat) let messagesQuery = XXModels.Message.Query(chat: queryChat)
return try env.db().fetchMessagesPublisher(query) return Publishers.CombineLatest3(
.assertNoFailure() try env.db().fetchMessagesPublisher(messagesQuery),
.map { messages in try env.db().fetchFileTransfersPublisher(receivedFileTransfersQuery),
messages.compactMap { message in try env.db().fetchFileTransfersPublisher(sentFileTransfersQuery)
guard let id = message.id else { return nil } )
return ChatState.Message( .map { messages, receivedFileTransfers, sentFileTransfers in
id: id, (messages, receivedFileTransfers + sentFileTransfers)
date: message.date, }
senderId: message.senderId, .assertNoFailure()
text: message.text, .map { messages, fileTransfers in
status: message.status messages.compactMap { message in
) guard let id = message.id else { return nil }
} return ChatState.Message(
id: id,
date: message.date,
senderId: message.senderId,
text: message.text,
status: message.status,
fileTransfer: fileTransfers.first { $0.id == message.fileTransferId }
)
} }
.map { IdentifiedArrayOf<ChatState.Message>(uniqueElements: $0) } }
.map(ChatAction.didFetchMessages) .removeDuplicates()
.subscribe(on: env.bgQueue) .map { IdentifiedArrayOf<ChatState.Message>(uniqueElements: $0) }
.receive(on: env.mainQueue) .map(ChatAction.didFetchMessages)
.eraseToEffect() .subscribe(on: env.bgQueue)
.cancellable(id: FetchEffectId.self, cancelInFlight: true) .receive(on: env.mainQueue)
.eraseToEffect()
.cancellable(id: FetchEffectId.self, cancelInFlight: true)
} catch { } catch {
state.failure = error.localizedDescription state.failure = error.localizedDescription
return .none return .none
......
...@@ -21,6 +21,8 @@ final class ChatFeatureTests: XCTestCase { ...@@ -21,6 +21,8 @@ final class ChatFeatureTests: XCTestCase {
var didFetchMessagesWithQuery: [XXModels.Message.Query] = [] var didFetchMessagesWithQuery: [XXModels.Message.Query] = []
let messagesPublisher = PassthroughSubject<[XXModels.Message], Error>() let messagesPublisher = PassthroughSubject<[XXModels.Message], Error>()
var didFetchFileTransfersWithQuery: [XXModels.FileTransfer.Query] = []
let fileTransfersPublisher = PassthroughSubject<[XXModels.FileTransfer], Error>()
store.environment.mainQueue = .immediate store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate store.environment.bgQueue = .immediate
...@@ -39,6 +41,10 @@ final class ChatFeatureTests: XCTestCase { ...@@ -39,6 +41,10 @@ final class ChatFeatureTests: XCTestCase {
didFetchMessagesWithQuery.append(query) didFetchMessagesWithQuery.append(query)
return messagesPublisher.eraseToAnyPublisher() return messagesPublisher.eraseToAnyPublisher()
} }
db.fetchFileTransfersPublisher.run = { query in
didFetchFileTransfersWithQuery.append(query)
return fileTransfersPublisher.eraseToAnyPublisher()
}
return db return db
} }
...@@ -49,7 +55,25 @@ final class ChatFeatureTests: XCTestCase { ...@@ -49,7 +55,25 @@ final class ChatFeatureTests: XCTestCase {
XCTAssertNoDifference(didFetchMessagesWithQuery, [ XCTAssertNoDifference(didFetchMessagesWithQuery, [
.init(chat: .direct(myContactId, contactId)) .init(chat: .direct(myContactId, contactId))
]) ])
XCTAssertNoDifference(didFetchFileTransfersWithQuery, [
.init(contactId: contactId, isIncoming: true),
.init(contactId: myContactId, isIncoming: false),
])
let receivedFileTransfer = FileTransfer(
id: "file-transfer-1-id".data(using: .utf8)!,
contactId: contactId,
name: "file-transfer-1-name",
type: "file-transfer-1-type",
isIncoming: true
)
let sentFileTransfer = FileTransfer(
id: "file-transfer-2-id".data(using: .utf8)!,
contactId: myContactId,
name: "file-transfer-2-name",
type: "file-transfer-2-type",
isIncoming: false
)
messagesPublisher.send([ messagesPublisher.send([
.init( .init(
id: nil, id: nil,
...@@ -69,7 +93,8 @@ final class ChatFeatureTests: XCTestCase { ...@@ -69,7 +93,8 @@ final class ChatFeatureTests: XCTestCase {
date: Date(timeIntervalSince1970: 1), date: Date(timeIntervalSince1970: 1),
status: .received, status: .received,
isUnread: false, isUnread: false,
text: "Message 1" text: "Message 1",
fileTransferId: receivedFileTransfer.id
), ),
.init( .init(
id: 2, id: 2,
...@@ -79,9 +104,14 @@ final class ChatFeatureTests: XCTestCase { ...@@ -79,9 +104,14 @@ final class ChatFeatureTests: XCTestCase {
date: Date(timeIntervalSince1970: 2), date: Date(timeIntervalSince1970: 2),
status: .sent, status: .sent,
isUnread: false, isUnread: false,
text: "Message 2" text: "Message 2",
fileTransferId: sentFileTransfer.id
), ),
]) ])
fileTransfersPublisher.send([
receivedFileTransfer,
sentFileTransfer,
])
let expectedMessages = IdentifiedArrayOf<ChatState.Message>(uniqueElements: [ let expectedMessages = IdentifiedArrayOf<ChatState.Message>(uniqueElements: [
.init( .init(
...@@ -89,14 +119,16 @@ final class ChatFeatureTests: XCTestCase { ...@@ -89,14 +119,16 @@ final class ChatFeatureTests: XCTestCase {
date: Date(timeIntervalSince1970: 1), date: Date(timeIntervalSince1970: 1),
senderId: contactId, senderId: contactId,
text: "Message 1", text: "Message 1",
status: .received status: .received,
fileTransfer: receivedFileTransfer
), ),
.init( .init(
id: 2, id: 2,
date: Date(timeIntervalSince1970: 2), date: Date(timeIntervalSince1970: 2),
senderId: myContactId, senderId: myContactId,
text: "Message 2", text: "Message 2",
status: .sent status: .sent,
fileTransfer: sentFileTransfer
), ),
]) ])
...@@ -105,6 +137,7 @@ final class ChatFeatureTests: XCTestCase { ...@@ -105,6 +137,7 @@ final class ChatFeatureTests: XCTestCase {
} }
messagesPublisher.send(completion: .finished) messagesPublisher.send(completion: .finished)
fileTransfersPublisher.send(completion: .finished)
} }
func testStartFailure() { func testStartFailure() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment