aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Models/FilePreview.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Hotline/Models/FilePreview.swift')
-rw-r--r--Hotline/Models/FilePreview.swift110
1 files changed, 71 insertions, 39 deletions
diff --git a/Hotline/Models/FilePreview.swift b/Hotline/Models/FilePreview.swift
index 552ccff..a7b183f 100644
--- a/Hotline/Models/FilePreview.swift
+++ b/Hotline/Models/FilePreview.swift
@@ -1,41 +1,73 @@
import SwiftUI
+import UniformTypeIdentifiers
-//struct FilePreview: Identifiable, Hashable {
-// let id: UUID
-//
-// let path: [String]
-// let name: String
-//
-// let type: String
-// let creator: String
-// let fileSize: UInt
-//
-// let isFolder: Bool
-// let isUnavailable: Bool
-// var expanded: Bool = false
-// var children: [FileInfo]? = nil
-//
-// init(hotlineFile: HotlineFile) {
-// self.id = UUID()
-// self.path = hotlineFile.path
-// self.name = hotlineFile.name
-// self.type = hotlineFile.type
-// self.creator = hotlineFile.creator
-// self.fileSize = UInt(hotlineFile.fileSize)
-// self.isFolder = hotlineFile.isFolder
-// self.isUnavailable = (!self.isFolder && (self.fileSize == 0))
-//
-// print(self.name, self.type, self.creator, self.isUnavailable)
-// if self.isFolder {
-// self.children = []
-// }
-// }
-//
-// static func == (lhs: FileInfo, rhs: FileInfo) -> Bool {
-// return lhs.id == rhs.id
-// }
-//
-// func hash(into hasher: inout Hasher) {
-// hasher.combine(self.id)
-// }
-//}
+enum FilePreviewState: Equatable {
+ case unloaded
+ case loading
+ case loaded
+ case failed
+}
+
+@Observable
+final class FilePreview: HotlineFileClientDelegate {
+ @ObservationIgnored let info: PreviewFileInfo
+ @ObservationIgnored var client: HotlineFileClient? = nil
+
+ var state: FilePreviewState = .unloaded
+ var progress: Double = 0.0
+
+ #if os(macOS)
+ var image: NSImage?
+ #endif
+
+ init(info: PreviewFileInfo) {
+ self.info = info
+
+ self.client = HotlineFileClient(address: info.address, port: UInt16(info.port), reference: info.id, size: UInt32(info.size), type: .preview)
+ self.client?.delegate = self
+ }
+
+ func download() {
+ self.client?.downloadToMemory()
+ }
+
+ func cancel() {
+ self.client?.cancel(deleteIncompleteFile: true)
+ }
+
+ func hotlineFileStatusChanged(client: HotlineFileClient, reference: UInt32, status: HotlineFileClientStatus, timeRemaining: TimeInterval) {
+ print("FILE STATUS CHANGED", status)
+
+ switch status {
+ case .unconnected:
+ state = .unloaded
+ progress = 0.0
+ case .connecting:
+ state = .loading
+ progress = 0.0
+ case .connected:
+ state = .loading
+ progress = 0.0
+ case .progress(let p):
+ state = .loading
+ progress = p
+ case .failed(_):
+ state = .failed
+ progress = 0.0
+ case .completed:
+ state = .loaded
+ progress = 1.0
+ }
+ }
+
+ func hotlineFileDownloadedData(client: HotlineFileClient, reference: UInt32, data: Data) {
+ self.state = .loaded
+
+ let fileExtension = (info.name as NSString).pathExtension
+ if let fileType = UTType(filenameExtension: fileExtension) {
+ if fileType.isSubtype(of: .image) {
+ self.image = NSImage(data: data)
+ }
+ }
+ }
+}