aboutsummaryrefslogtreecommitdiff
path: root/Hotline/State/AppState.swift
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)
  }
}