34 lines
1010 B
Swift
34 lines
1010 B
Swift
import Foundation
|
|
import Observation
|
|
|
|
@MainActor
|
|
@Observable
|
|
final class LeadFileViewModel {
|
|
private(set) var url: URL?
|
|
private(set) var message: LocalizedStringResource?
|
|
private(set) var needsLogin = false
|
|
private(set) var allowsRetry = true
|
|
private var generation = 0
|
|
|
|
func load(using download: () async throws -> URL) async {
|
|
generation += 1
|
|
let request = generation
|
|
url = nil
|
|
message = nil
|
|
needsLogin = false
|
|
allowsRetry = true
|
|
do {
|
|
let result = try await download()
|
|
try Task.checkCancellation()
|
|
guard request == generation else { return }
|
|
url = result
|
|
} catch is CancellationError {
|
|
} catch {
|
|
guard request == generation, !Task.isCancelled else { return }
|
|
message = error.leadFileMessage
|
|
needsLogin = error as? LeadError == .unauthorized
|
|
allowsRetry = (error as? LeadError)?.allowsRetry ?? true
|
|
}
|
|
}
|
|
}
|