feat: enhance speed and ETA display logic during pause and drop

- Keep the ETA visible even when the download is paused so the user knows how much time is left.
- When the connection drops, show the last known speed for 3 seconds. If the connection isn't restored, show '0 KiB/s' instead of 'Unknown'.
- Clear speed and ETA fields when a download is completed, queued, or canceled.
This commit is contained in:
NimBold
2026-06-11 14:12:16 +03:30
parent aa9b3aad2a
commit 99500254a1
2 changed files with 27 additions and 2 deletions
+23
View File
@@ -31,6 +31,7 @@ final class DownloadController: ObservableObject {
private var pendingNotifications: [(title: String, body: String)] = []
private var notificationDebounceTask: Task<Void, Never>?
private var lastProgressUpdateTimes: [UUID: Date] = [:]
private var speedUnknownSince: [UUID: Date] = [:]
init(settings: AppSettings) {
self.settings = settings
@@ -557,6 +558,17 @@ final class DownloadController: ObservableObject {
let isUnknown = progress.speedText.lowercased() == "unknown" || progress.speedText == "-"
if !isUnknown || $0.speedText == "-" || $0.speedText.lowercased() == "unknown" {
$0.speedText = progress.speedText
self?.speedUnknownSince[item.id] = nil
} else {
if self?.speedUnknownSince[item.id] == nil {
self?.speedUnknownSince[item.id] = Date()
}
if let since = self?.speedUnknownSince[item.id], Date().timeIntervalSince(since) > 3.0 {
$0.speedText = "0 KiB/s"
}
}
let isEtaUnknown = progress.etaText.lowercased() == "unknown" || progress.etaText == "-"
if !isEtaUnknown || $0.etaText == "-" || $0.etaText.lowercased() == "unknown" {
$0.etaText = progress.etaText
}
$0.connectionCount = progress.connectionCount
@@ -618,6 +630,17 @@ final class DownloadController: ObservableObject {
let isUnknown = progress.speedText.lowercased() == "unknown" || progress.speedText == "-"
if !isUnknown || $0.speedText == "-" || $0.speedText.lowercased() == "unknown" {
$0.speedText = progress.speedText
self?.speedUnknownSince[item.id] = nil
} else {
if self?.speedUnknownSince[item.id] == nil {
self?.speedUnknownSince[item.id] = Date()
}
if let since = self?.speedUnknownSince[item.id], Date().timeIntervalSince(since) > 3.0 {
$0.speedText = "0 KiB/s"
}
}
let isEtaUnknown = progress.etaText.lowercased() == "unknown" || progress.etaText == "-"
if !isEtaUnknown || $0.etaText == "-" || $0.etaText.lowercased() == "unknown" {
$0.etaText = progress.etaText
}
$0.connectionCount = progress.connectionCount
+4 -2
View File
@@ -199,11 +199,13 @@ struct DownloadItem: Identifiable, Codable, Equatable, Sendable {
}
var displaySpeedText: String {
status == .downloading ? speedText : "-"
if status == .completed || status == .paused || status == .queued || status == .canceled { return "-" }
return speedText
}
var displayETAText: String {
status == .downloading ? etaText : "-"
if status == .completed || status == .queued || status == .canceled { return "-" }
return etaText
}
var destinationPath: String {