diff --git a/Sources/ChatFeature/Helpers/CellConfigurator.swift b/Sources/ChatFeature/Helpers/CellConfigurator.swift index 709235138e4a3e946f585d031a37e4a68234da06..c59050a9221da32149bda8432c69d9271f08a0b7 100644 --- a/Sources/ChatFeature/Helpers/CellConfigurator.swift +++ b/Sources/ChatFeature/Helpers/CellConfigurator.swift @@ -236,7 +236,13 @@ extension CellFactory { Bubbler.build(imageBubble: cell.leftView, with: item, with: ft) cell.canReply = false cell.performReply = {} - cell.leftView.imageView.image = UIImage(data: ft.data!) + + if let data = ft.data { + cell.leftView.imageView.image = UIImage(data: data) + } else { + cell.leftView.imageView.image = Asset.transferImagePlaceholder.image + } + return cell } ) diff --git a/Sources/Integration/Client.swift b/Sources/Integration/Client.swift index 28ed1a64808e94ce1acc8e733bba0bd0feb8e4e9..7d53fb7efaf8ebe3b4f6485bc38dd101ce8960e5 100644 --- a/Sources/Integration/Client.swift +++ b/Sources/Integration/Client.swift @@ -22,6 +22,7 @@ public class Client { var messages: AnyPublisher<Message, Never> { messagesSubject.eraseToAnyPublisher() } var requests: AnyPublisher<Contact, Never> { requestsSubject.eraseToAnyPublisher() } var events: AnyPublisher<BackendEvent, Never> { eventsSubject.eraseToAnyPublisher() } + var transfers: AnyPublisher<FileTransfer, Never> { transfersSubject.eraseToAnyPublisher() } var requestsSent: AnyPublisher<Contact, Never> { requestsSentSubject.eraseToAnyPublisher() } var confirmations: AnyPublisher<Contact, Never> { confirmationsSubject.eraseToAnyPublisher() } var groupRequests: AnyPublisher<(Group, [Data], String?), Never> { groupRequestsSubject.eraseToAnyPublisher() } diff --git a/Sources/Integration/Implementations/TransferManager.swift b/Sources/Integration/Implementations/TransferManager.swift index 6b161800da918ec3d2a83097570bcf098a8e01cd..8c38a91fcc20eb289d83d0a62d9efb71592f2554 100644 --- a/Sources/Integration/Implementations/TransferManager.swift +++ b/Sources/Integration/Implementations/TransferManager.swift @@ -47,9 +47,7 @@ extension BindingsFileTransfer: TransferManagerInterface { callback(completed, sent, arrived, total, error) } - guard let file = FileManager.retrieve(name: url.lastPathComponent, type: url.pathExtension) else { - fatalError() - } + guard let file = try? Data(contentsOf: url) else { fatalError() } return try send( url.lastPathComponent, diff --git a/Sources/Integration/Session/Session+Chat.swift b/Sources/Integration/Session/Session+Chat.swift index a0835167e5debbaf34986bcfa80eea3af2c2d2ef..34af6aa2cdc262a589abefa40e8f6e14436ad6a7 100644 --- a/Sources/Integration/Session/Session+Chat.swift +++ b/Sources/Integration/Session/Session+Chat.swift @@ -40,10 +40,12 @@ extension Session { DispatchQueue.global().async { [weak self] in guard let self = self else { return } - var tid: Data! + var tid: Data? do { tid = try manager.uploadFile(url: url, to: contact.id) { completed, send, arrived, total, error in + guard let tid = tid else { return } + if completed { self.endTransferWith(tid: tid) } else { @@ -55,8 +57,23 @@ extension Session { } } + guard let tid = tid else { return } + let content = url.pathExtension == "m4a" ? "a voice message" : "an image" + let transfer = FileTransfer( + id: tid, + contactId: contact.id, + name: url.deletingPathExtension().lastPathComponent, + type: url.pathExtension, + data: try? Data(contentsOf: url), + progress: 0.0, + isIncoming: false, + createdAt: Date() + ) + + _ = try? self.dbManager.saveFileTransfer(transfer) + let message = Message( networkId: nil, senderId: self.client.bindings.myId, diff --git a/Sources/Integration/Session/Session.swift b/Sources/Integration/Session/Session.swift index 8758ff86ca9683f7013499c6b38aaabf72de8faa..2899e4025dcf140dc4ad4b7969dd02fbd62fc06b 100644 --- a/Sources/Integration/Session/Session.swift +++ b/Sources/Integration/Session/Session.swift @@ -404,5 +404,29 @@ public final class Session: SessionType { )) } }.store(in: &cancellables) + + client.transfers + .sink { [unowned self] in + _ = try? dbManager.saveFileTransfer($0) + + let content = $0.type == "m4a" ? "a voice message" : "an image" + + let message = Message( + networkId: $0.id, + senderId: $0.contactId, + recipientId: myId, + groupId: nil, + date: $0.createdAt, + status: .receiving, + isUnread: true, + text: "Sent you \(content)", + replyMessageId: nil, + roundURL: nil, + fileTransferId: $0.id + ) + + _ = try? dbManager.saveMessage(message) + } + .store(in: &cancellables) } }