field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

TeraDiagnosticsStore.swift (1693B)


      1 import Foundation
      2 import RadrootsKit
      3 
      4 @MainActor
      5 final class TeraDiagnosticsStore: ObservableObject {
      6   @Published var preparedExport: RadrootsPreparedExportDocument?
      7   @Published private(set) var isPreparing = false
      8   @Published private(set) var message: String?
      9 
     10   private let coordinator: TeraLifecycleCoordinator
     11   private var activeExport: RadrootsPreparedExportDocument?
     12 
     13   init(coordinator: TeraLifecycleCoordinator) {
     14     self.coordinator = coordinator
     15   }
     16 
     17   func prepare(snapshot: TeraRuntimeSnapshot, bundle: Bundle = .main) async {
     18     guard !isPreparing, preparedExport == nil, activeExport == nil else { return }
     19     isPreparing = true
     20     message = nil
     21     defer { isPreparing = false }
     22     do {
     23       let export = try await coordinator.prepareDiagnostics(
     24         snapshot: snapshot,
     25         appVersion: bundle.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
     26           ?? "0",
     27         appBuild: bundle.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "0",
     28         phase: "running"
     29       )
     30       activeExport = export
     31       preparedExport = export
     32     } catch {
     33       activeExport = nil
     34       preparedExport = nil
     35       message = TeraUserMessages.text(.diagnosticsPrepareFailed)
     36     }
     37   }
     38 
     39   func completeExport(_ result: Result<RadrootsExportDocumentResult, Error>) {
     40     let export = activeExport
     41     activeExport = nil
     42     preparedExport = nil
     43     switch result {
     44     case .success:
     45       message = TeraUserMessages.text(.diagnosticsExportSucceeded)
     46     case .failure:
     47       message = TeraUserMessages.text(.diagnosticsExportFailed)
     48     }
     49     guard let export else { return }
     50     Task { await coordinator.releaseDiagnostics(export) }
     51   }
     52 }