aboutsummaryrefslogtreecommitdiff
path: root/Hotline/State/AppState.swift
diff options
context:
space:
mode:
authorDustin Mierau <dustin@mierau.me>2025-11-08 22:40:58 -0800
committerDustin Mierau <dustin@mierau.me>2025-11-08 22:40:58 -0800
commit6cfa1db09055a3b4ea64d3586a0b439d13498db6 (patch)
treec272f453ec023f055222aa036114409a84ace96c /Hotline/State/AppState.swift
parent2caf86e633c1a121c8e23d068ac817ed8e80f6a7 (diff)
Fixing cancel transfer from transfer window. Transfer window ux improvements.
Diffstat (limited to 'Hotline/State/AppState.swift')
-rw-r--r--Hotline/State/AppState.swift29
1 files changed, 29 insertions, 0 deletions
diff --git a/Hotline/State/AppState.swift b/Hotline/State/AppState.swift
index 3aadf08..2d7820b 100644
--- a/Hotline/State/AppState.swift
+++ b/Hotline/State/AppState.swift
@@ -24,6 +24,8 @@ final class AppState {
/// All active transfers across all servers
/// Transfers persist even if you disconnect from the server
var transfers: [TransferInfo] = []
+
+ @ObservationIgnored private var transferClients: [UUID: HotlineTransferClient] = [:]
/// Track download tasks by reference number for cancellation
@ObservationIgnored private var transferTasks: [UUID: Task<Void, Never>] = [:]
@@ -46,6 +48,11 @@ final class AppState {
task.cancel()
self.transferTasks.removeValue(forKey: id)
}
+
+ if let client = self.transferClients[id] {
+ client.cancel()
+ self.transferClients.removeValue(forKey: id)
+ }
// Remove from transfers list
self.transfers.remove(at: transferIndex)
@@ -58,10 +65,25 @@ final class AppState {
task.cancel()
}
self.transferTasks.removeAll()
+
+ for (_, client) in self.transferClients {
+ client.cancel()
+ }
+ self.transferClients.removeAll()
// Clear transfers
self.transfers.removeAll()
}
+
+ /// Remove all completed transfers
+ @MainActor
+ func sweepTransfers() {
+ for t in self.transfers {
+ if t.done {
+ self.cancelTransfer(id: t.id)
+ }
+ }
+ }
/// Register a transfer task
@MainActor
@@ -69,9 +91,16 @@ final class AppState {
self.transferTasks[transferID] = task
}
+ @MainActor
+ func registerTransferTask(_ task: Task<Void, Never>, transferID: UUID, client: HotlineTransferClient) {
+ self.transferTasks[transferID] = task
+ self.transferClients[transferID] = client
+ }
+
/// Unregister a download task (called on completion/failure)
@MainActor
func unregisterTransferTask(for transferID: UUID) {
self.transferTasks.removeValue(forKey: transferID)
+ self.transferClients.removeValue(forKey: transferID)
}
}