diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index cb2b31ae..eacb07da 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -2424,7 +2424,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate { mimeType: "audio/mp4", content: data ) - guard let payload = packet.encode() else { throw MediaSendError.encodingFailed } + guard packet.encode() != nil else { throw MediaSendError.encodingFailed } await MainActor.run { self.registerTransfer(transferId: transferId, messageID: messageID) if let peerID = targetPeer { @@ -2467,7 +2467,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate { mimeType: "image/jpeg", content: data ) - guard let payload = packet.encode() else { throw MediaSendError.encodingFailed } + guard packet.encode() != nil else { throw MediaSendError.encodingFailed } await MainActor.run { let message = self.enqueueMediaMessage(content: "[image] \(outputURL.lastPathComponent)", targetPeer: targetPeer) let messageID = message.id @@ -2514,7 +2514,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate { mimeType: self.mimeType(for: destination), content: data ) - guard let payload = packet.encode() else { + guard packet.encode() != nil else { try? FileManager.default.removeItem(at: destination) throw MediaSendError.encodingFailed } diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 564c3ab4..cb3d0d63 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -1562,20 +1562,31 @@ private enum MessageMedia { private extension ContentView { func mediaAttachment(for message: BitchatMessage) -> MessageMedia? { guard let baseDirectory = applicationFilesDirectory() else { return nil } - let basePath = baseDirectory.standardizedFileURL.path - func url(from prefix: String, subdirectory: String) -> URL? { + func url(from prefix: String, in subdirectories: [String]) -> URL? { guard message.content.hasPrefix(prefix) else { return nil } let filename = String(message.content.dropFirst(prefix.count)).trimmingCharacters(in: .whitespacesAndNewlines) guard !filename.isEmpty else { return nil } - let directory = baseDirectory.appendingPathComponent(subdirectory, isDirectory: true) - let candidate = directory.appendingPathComponent(filename) - return FileManager.default.fileExists(atPath: candidate.path) ? candidate : nil + let fm = FileManager.default + for sub in subdirectories { + let directory = baseDirectory.appendingPathComponent(sub, isDirectory: true) + let candidate = directory.appendingPathComponent(filename) + if fm.fileExists(atPath: candidate.path) { + return candidate + } + } + return nil } - if let url = url(from: "[voice] ", subdirectory: "voicenotes") { return .voice(url) } - if let url = url(from: "[image] ", subdirectory: "images") { return .image(url) } - if let url = url(from: "[file] ", subdirectory: "files") { return .file(url) } + if let url = url(from: "[voice] ", in: ["voicenotes/outgoing", "voicenotes/incoming"]) { + return .voice(url) + } + if let url = url(from: "[image] ", in: ["images/outgoing", "images/incoming"]) { + return .image(url) + } + if let url = url(from: "[file] ", in: ["files/outgoing", "files/incoming"]) { + return .file(url) + } return nil }