diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift index 1b9376b5db..233e82efb9 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift @@ -12,6 +12,8 @@ import SimpleXChat struct CIFileView: View { @EnvironmentObject var m: ChatModel @EnvironmentObject var theme: AppTheme + @StateObject var documentController = DocumentController() + let file: CIFile? let edited: Bool var smallViewSize: CGFloat? @@ -114,7 +116,7 @@ struct CIFileView: View { case .rcvComplete: logger.debug("CIFileView fileAction - in .rcvComplete") if let fileSource = getLoadedFileSource(file) { - saveCryptoFile(fileSource) + saveOrOpenCryptoFile(fileSource, documentController) } case let .rcvError(rcvFileError): logger.debug("CIFileView fileAction - in .rcvError") @@ -125,12 +127,12 @@ struct CIFileView: View { case .sndStored: logger.debug("CIFileView fileAction - in .sndStored") if file.fileProtocol == .local, let fileSource = getLoadedFileSource(file) { - saveCryptoFile(fileSource) + saveOrOpenCryptoFile(fileSource, documentController) } case .sndComplete: logger.debug("CIFileView fileAction - in .sndComplete") if let fileSource = getLoadedFileSource(file) { - saveCryptoFile(fileSource) + saveOrOpenCryptoFile(fileSource, documentController) } case let .sndError(sndFileError): logger.debug("CIFileView fileAction - in .sndError") @@ -225,6 +227,24 @@ struct CIFileView: View { } } +class DocumentController: NSObject, ObservableObject, UIDocumentInteractionControllerDelegate { + let controller = UIDocumentInteractionController() + func presentDocument(url: URL) { + controller.delegate = self + controller.url = url + controller.presentOptionsMenu(from: .zero, in: rootController().view, animated: true) +// controller.presentPreview(animated: true) + } + + private func rootController() -> UIViewController { + (UIApplication.shared.connectedScenes.compactMap { ($0 as! UIWindowScene).keyWindow }.last?.rootViewController)! + } + + func documentInteractionControllerViewControllerForPreview(_: UIDocumentInteractionController) -> UIViewController { + return rootController() + } +} + func fileSizeValid(_ file: CIFile?) -> Bool { if let file = file { return file.fileSize <= getMaxFileSize(file.fileProtocol) @@ -232,7 +252,7 @@ func fileSizeValid(_ file: CIFile?) -> Bool { return false } -func saveCryptoFile(_ fileSource: CryptoFile) { +func saveOrOpenCryptoFile(_ fileSource: CryptoFile, _ documentController: DocumentController? = nil) { if let cfArgs = fileSource.cryptoArgs { let url = getAppFilePath(fileSource.filePath) let tempUrl = getTempFilesDirectory().appendingPathComponent(fileSource.filePath) @@ -240,8 +260,12 @@ func saveCryptoFile(_ fileSource: CryptoFile) { do { try decryptCryptoFile(fromPath: url.path, cryptoArgs: cfArgs, toPath: tempUrl.path) await MainActor.run { - showShareSheet(items: [tempUrl]) { - removeFile(tempUrl) + if let documentController { + documentController.presentDocument(url: tempUrl) + } else { + showShareSheet(items: [tempUrl]) { + removeFile(tempUrl) + } } } } catch { @@ -252,7 +276,11 @@ func saveCryptoFile(_ fileSource: CryptoFile) { } } else { let url = getAppFilePath(fileSource.filePath) - showShareSheet(items: [url]) + if let documentController { + documentController.presentDocument(url: url) + } else { + showShareSheet(items: [url]) + } } } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 8ce0c50849..3e6573a5cd 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -1961,7 +1961,7 @@ struct ChatView: View { func saveButton(file: CryptoFile) -> Button { Button { - saveCryptoFile(file) + saveOrOpenCryptoFile(file) } label: { Label( NSLocalizedString("Save", comment: "chat item action"),