aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Models/TransferInfo.swift
diff options
context:
space:
mode:
authorRuben Beltran del Rio <git@r.bdr.sh>2025-11-27 23:38:04 +0100
committerRuben Beltran del Rio <git@r.bdr.sh>2025-11-27 23:38:04 +0100
commit213710bf5bd6413c747bf126db50816ef5de5a6e (patch)
tree912f8cf87955a08077c92fea8ad934f50b7ab975 /Hotline/Models/TransferInfo.swift
parentf466b21dc02f78c984ba6748e703f6780a7a0db4 (diff)
parent6a95b53616a4abfa306ddce43151cf4fefbd20ed (diff)
Merge remote-tracking branch 'upstream/main'
Diffstat (limited to 'Hotline/Models/TransferInfo.swift')
-rw-r--r--Hotline/Models/TransferInfo.swift87
1 files changed, 78 insertions, 9 deletions
diff --git a/Hotline/Models/TransferInfo.swift b/Hotline/Models/TransferInfo.swift
index 8aacf1d..eb0ce7f 100644
--- a/Hotline/Models/TransferInfo.swift
+++ b/Hotline/Models/TransferInfo.swift
@@ -2,27 +2,53 @@ import SwiftUI
@Observable
class TransferInfo: Identifiable, Equatable, Hashable {
- var id: UInt32
-
+ var id: UUID = UUID()
+
+ var referenceNumber: UInt32
var title: String
var size: UInt
- var progress: Double = 0.0
- var timeRemaining: TimeInterval = 0.0
+
+ // Status
var completed: Bool = false
var failed: Bool = false
+ var cancelled: Bool = false
+ var done: Bool {
+ self.completed || self.failed || self.cancelled
+ }
+
+ var progress: Double = 0.0
+ var speed: Double? = nil
+ var timeRemaining: TimeInterval? = nil
+
+ var isUpload: Bool = false
+ var isDownload: Bool {
+ get { !self.isUpload }
+ set { self.isUpload = !newValue }
+ }
+
+ // Folder transfers
+ var isFolder: Bool = false
+ var folderName: String? = nil
+ var fileName: String? = nil
- // For file based transfers (i.e. not previews)
+ // Server association - tracks which HotlineState this transfer belongs to
+ var serverID: UUID
+ var serverName: String?
+
+ // For file based transfers
var fileURL: URL? = nil
- var progressCallback: ((TransferInfo, Double) -> Void)? = nil
- var downloadCallback: ((TransferInfo, URL) -> Void)? = nil
+ var progressCallback: ((TransferInfo) -> Void)? = nil
+ var downloadCallback: ((TransferInfo) -> Void)? = nil
var uploadCallback: ((TransferInfo) -> Void)? = nil
var previewCallback: ((TransferInfo, Data) -> Void)? = nil
- init(id: UInt32, title: String, size: UInt) {
- self.id = id
+ init(reference: UInt32, title: String, size: UInt, serverID: UUID, serverName: String? = nil) {
+ self.referenceNumber = reference
self.title = title
self.size = size
+ self.serverID = serverID
+ self.serverName = serverName
}
static func == (lhs: TransferInfo, rhs: TransferInfo) -> Bool {
@@ -32,4 +58,47 @@ class TransferInfo: Identifiable, Equatable, Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(self.id)
}
+
+// var formatSize(_ bytes: UInt) -> String {
+// let formatter = ByteCountFormatter()
+// formatter.countStyle = .file
+// formatter.allowedUnits = [.useKB, .useMB, .useGB]
+// return formatter.string(fromByteCount: Int64(bytes))
+// }
+
+ var displaySize: String {
+ let formatter = ByteCountFormatter()
+ formatter.countStyle = .file
+ formatter.allowedUnits = [.useKB, .useMB, .useGB]
+ return formatter.string(fromByteCount: Int64(self.size))
+ }
+
+ var displaySpeed: String? {
+ guard let speed = self.speed else {
+ return nil
+ }
+
+ let formatter = ByteCountFormatter()
+ formatter.countStyle = .file
+ formatter.allowedUnits = [.useKB, .useMB, .useGB]
+ return "\(formatter.string(fromByteCount: Int64(speed)))/s"
+ }
+
+ var displayTimeRemaining: String? {
+ guard let timeRemaining = self.timeRemaining else {
+ return nil
+ }
+
+ if timeRemaining < 60 {
+ return "\(Int(timeRemaining))s"
+ } else if timeRemaining < 3600 {
+ let minutes = Int(timeRemaining / 60)
+ let secs = Int(timeRemaining.truncatingRemainder(dividingBy: 60))
+ return "\(minutes)m \(secs)s"
+ } else {
+ let hours = Int(timeRemaining / 3600)
+ let minutes = Int((timeRemaining.truncatingRemainder(dividingBy: 3600)) / 60)
+ return "\(hours)h \(minutes)m"
+ }
+ }
}