diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift index c94ba3f830..ae9e09b138 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIFileView.swift @@ -69,19 +69,12 @@ struct CIFileView: View { return false } - private func fileSizeValid() -> Bool { - if let file = file { - return file.fileSize <= getMaxFileSize(file.fileProtocol) - } - return false - } - private func fileAction() { logger.debug("CIFileView fileAction") if let file = file { switch (file.fileStatus) { case .rcvInvitation: - if fileSizeValid() { + if fileSizeValid(file) { Task { logger.debug("CIFileView fileAction - in .rcvInvitation, in Task") if let user = m.currentUser { @@ -143,7 +136,7 @@ struct CIFileView: View { case .sndCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10) case .sndError: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10) case .rcvInvitation: - if fileSizeValid() { + if fileSizeValid(file) { fileIcon("arrow.down.doc.fill", color: .accentColor) } else { fileIcon("doc.fill", color: .orange, innerIcon: "exclamationmark", innerIconSize: 12) @@ -201,6 +194,13 @@ struct CIFileView: View { } } +func fileSizeValid(_ file: CIFile?) -> Bool { + if let file = file { + return file.fileSize <= getMaxFileSize(file.fileProtocol) + } + return false +} + func saveCryptoFile(_ fileSource: CryptoFile) { if let cfArgs = fileSource.cryptoArgs { let url = getAppFilePath(fileSource.filePath) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 5500b0c6e7..45819851f0 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -785,11 +785,15 @@ struct ChatView: View { } else { menu.append(saveFileAction(fileSource)) } + } else if let file = ci.file, case .rcvInvitation = file.fileStatus, fileSizeValid(file) { + menu.append(downloadFileAction(file)) } if ci.meta.editable && !mc.isVoice && !live { menu.append(editAction(ci)) } - if ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live { + if ci.meta.itemDeleted == nil + && (ci.file == nil || (fileSource != nil && fileExists)) + && !ci.isLiveDummy && !live { menu.append(forwardUIAction(ci)) } if !ci.isLiveDummy { @@ -949,7 +953,21 @@ struct ChatView: View { saveCryptoFile(fileSource) } } - + + private func downloadFileAction(_ file: CIFile) -> UIAction { + UIAction( + title: NSLocalizedString("Download", comment: "chat item action"), + image: UIImage(systemName: "arrow.down.doc") + ) { _ in + Task { + logger.debug("ChatView downloadFileAction, in Task") + if let user = m.currentUser { + await receiveFile(user: user, fileId: file.fileId) + } + } + } + } + private func editAction(_ ci: ChatItem) -> UIAction { UIAction( title: NSLocalizedString("Edit", comment: "chat item action"), diff --git a/apps/ios/SimpleXChat/APITypes.swift b/apps/ios/SimpleXChat/APITypes.swift index e27e280e40..f33bdfbdd8 100644 --- a/apps/ios/SimpleXChat/APITypes.swift +++ b/apps/ios/SimpleXChat/APITypes.swift @@ -1721,6 +1721,7 @@ public enum ChatErrorType: Decodable { case inlineFileProhibited(fileId: Int64) case invalidQuote case invalidForward + case forwardNoFile case invalidChatItemUpdate case invalidChatItemDelete case hasCurrentCall