blob: 558af2ac862b61a3959a994379b68b637c7b3656 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
import SwiftUI
extension EnvironmentValues {
@Entry var appState: AppState = AppState.shared
}
@Observable
final class AppState {
static let shared = AppState()
private init() {
}
var activeHotline: HotlineState? = nil
var activeServerState: ServerState? = nil
var cloudKitReady: Bool = false
// MARK: - Transfers
/// All active transfers across all servers
/// Transfers persist even if you disconnect from the server
var transfers: [TransferInfo] = []
/// Track download tasks by reference number for cancellation
@ObservationIgnored private var transferTasks: [UUID: Task<Void, Never>] = [:]
/// Add a transfer to the transfer list
@MainActor
func addTransfer(_ transfer: TransferInfo) {
self.transfers.append(transfer)
}
/// Cancel a transfer by transfer ID
@MainActor
func cancelTransfer(id: UUID) {
guard let transferIndex = self.transfers.firstIndex(where: { $0.id == id }) else {
return
}
// Cancel the task if it exists
if let task = self.transferTasks[id] {
task.cancel()
self.transferTasks.removeValue(forKey: id)
}
// Remove from transfers list
self.transfers.remove(at: transferIndex)
}
/// Cancel all active transfers
@MainActor
func cancelAllTransfers() {
for (_, task) in self.transferTasks {
task.cancel()
}
self.transferTasks.removeAll()
// Clear transfers
self.transfers.removeAll()
}
/// Register a transfer task
@MainActor
func registerTransferTask(_ task: Task<Void, Never>, transferID: UUID) {
self.transferTasks[transferID] = task
}
/// Unregister a download task (called on completion/failure)
@MainActor
func unregisterTransferTask(for transferID: UUID) {
self.transferTasks.removeValue(forKey: transferID)
}
}
|