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>
let myContactId = try env.messenger.e2e.tryGet().getContact().getId()
state.myContactId = myContactId
let queryChat: XXModels.Message.Query.Chat
let receivedFileTransfersQuery: XXModels.FileTransfer.Query
let sentFileTransfersQuery: XXModels.FileTransfer.Query
switch state.id {
case .contact(let contactId):
queryChat = .direct(myContactId, contactId)
receivedFileTransfersQuery = .init(
contactId: contactId,
isIncoming: true
)
sentFileTransfersQuery = .init(
contactId: myContactId,
isIncoming: false
)
}
let query = XXModels.Message.Query(chat: queryChat)
return try env.db().fetchMessagesPublisher(query)
.assertNoFailure()
.map { messages in
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
)
}
let messagesQuery = XXModels.Message.Query(chat: queryChat)
return Publishers.CombineLatest3(
try env.db().fetchMessagesPublisher(messagesQuery),
try env.db().fetchFileTransfersPublisher(receivedFileTransfersQuery),
try env.db().fetchFileTransfersPublisher(sentFileTransfersQuery)
)
.map { messages, receivedFileTransfers, sentFileTransfers in
(messages, receivedFileTransfers + sentFileTransfers)
}
.assertNoFailure()
.map { messages, fileTransfers in
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)
.subscribe(on: env.bgQueue)
.receive(on: env.mainQueue)
.eraseToEffect()
.cancellable(id: FetchEffectId.self, cancelInFlight: true)
}
.removeDuplicates()
.map { IdentifiedArrayOf<ChatState.Message>(uniqueElements: $0) }
.map(ChatAction.didFetchMessages)
.subscribe(on: env.bgQueue)
.receive(on: env.mainQueue)
.eraseToEffect()
.cancellable(id: FetchEffectId.self, cancelInFlight: true)
} catch {
state.failure = error.localizedDescription
return .none
......
......@@ -21,6 +21,8 @@ final class ChatFeatureTests: XCTestCase {
var didFetchMessagesWithQuery: [XXModels.Message.Query] = []
let messagesPublisher = PassthroughSubject<[XXModels.Message], Error>()
var didFetchFileTransfersWithQuery: [XXModels.FileTransfer.Query] = []
let fileTransfersPublisher = PassthroughSubject<[XXModels.FileTransfer], Error>()
store.environment.mainQueue = .immediate
store.environment.bgQueue = .immediate
......@@ -39,6 +41,10 @@ final class ChatFeatureTests: XCTestCase {
didFetchMessagesWithQuery.append(query)
return messagesPublisher.eraseToAnyPublisher()
}
db.fetchFileTransfersPublisher.run = { query in
didFetchFileTransfersWithQuery.append(query)
return fileTransfersPublisher.eraseToAnyPublisher()
}
return db
}
......@@ -49,7 +55,25 @@ final class ChatFeatureTests: XCTestCase {
XCTAssertNoDifference(didFetchMessagesWithQuery, [
.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([
.init(
id: nil,
......@@ -69,7 +93,8 @@ final class ChatFeatureTests: XCTestCase {
date: Date(timeIntervalSince1970: 1),
status: .received,
isUnread: false,
text: "Message 1"
text: "Message 1",
fileTransferId: receivedFileTransfer.id
),
.init(
id: 2,
......@@ -79,9 +104,14 @@ final class ChatFeatureTests: XCTestCase {
date: Date(timeIntervalSince1970: 2),
status: .sent,
isUnread: false,
text: "Message 2"
text: "Message 2",
fileTransferId: sentFileTransfer.id
),
])
fileTransfersPublisher.send([
receivedFileTransfer,
sentFileTransfer,
])
let expectedMessages = IdentifiedArrayOf<ChatState.Message>(uniqueElements: [
.init(
......@@ -89,14 +119,16 @@ final class ChatFeatureTests: XCTestCase {
date: Date(timeIntervalSince1970: 1),
senderId: contactId,
text: "Message 1",
status: .received
status: .received,
fileTransfer: receivedFileTransfer
),
.init(
id: 2,
date: Date(timeIntervalSince1970: 2),
senderId: myContactId,
text: "Message 2",
status: .sent
status: .sent,
fileTransfer: sentFileTransfer
),
])
......@@ -105,6 +137,7 @@ final class ChatFeatureTests: XCTestCase {
}
messagesPublisher.send(completion: .finished)
fileTransfersPublisher.send(completion: .finished)
}
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