diff options
Diffstat (limited to 'Hotline/Models/FilePreview.swift')
| -rw-r--r-- | Hotline/Models/FilePreview.swift | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/Hotline/Models/FilePreview.swift b/Hotline/Models/FilePreview.swift index 3a1d225..d558c4c 100644 --- a/Hotline/Models/FilePreview.swift +++ b/Hotline/Models/FilePreview.swift @@ -8,6 +8,12 @@ enum FilePreviewState: Equatable { case failed } +enum FilePreviewType: Equatable { + case unknown + case image + case text +} + @Observable final class FilePreview: HotlineFileClientDelegate { @ObservationIgnored let info: PreviewFileInfo @@ -16,10 +22,30 @@ final class FilePreview: HotlineFileClientDelegate { var state: FilePreviewState = .unloaded var progress: Double = 0.0 - #if os(macOS) - var image: NSImage? + var data: Data? = nil + + #if os(iOS) + var image: UIImage? = nil + #elseif os(macOS) + var image: NSImage? = nil #endif + var text: String? = nil + var styledText: NSAttributedString? = nil + + var previewType: FilePreviewType { + let fileExtension = (info.name as NSString).pathExtension + if let fileType = UTType(filenameExtension: fileExtension) { + if fileType.isSubtype(of: .image) { + return .image + } + else if fileType.isSubtype(of: .text) { + return .text + } + } + return .unknown + } + init(info: PreviewFileInfo) { self.info = info @@ -62,16 +88,25 @@ final class FilePreview: HotlineFileClientDelegate { func hotlineFileDownloadedData(client: HotlineFileClient, reference: UInt32, data: Data) { self.state = .loaded + self.data = data - let fileExtension = (info.name as NSString).pathExtension - if let fileType = UTType(filenameExtension: fileExtension) { - if fileType.isSubtype(of: .image) { - #if os(iOS) -// self.image = UIImage(data: data) - #elseif os(macOS) - self.image = NSImage(data: data) - #endif + switch self.previewType { + case .image: + #if os(iOS) + self.image = UIImage(data: data) + #elseif os(macOS) + self.image = NSImage(data: data) + #endif + case .text: + let encoding: UInt = NSString.stringEncoding(for: data, convertedString: nil, usedLossyConversion: nil) + if encoding != 0 { + self.text = String(data: data, encoding: String.Encoding(rawValue: encoding)) + } + else { + self.text = String(data: data, encoding: .utf8) } + case .unknown: + return } } } |