56 lines
1.7 KiB
Swift
56 lines
1.7 KiB
Swift
import Foundation
|
|
import Observation
|
|
|
|
@MainActor @Observable
|
|
final class ARProjectsViewModel {
|
|
private(set) var supplied: [ARProject] = []
|
|
private(set) var custom: [ARProject] = []
|
|
private(set) var isLoading = true
|
|
var errorMessage: String?
|
|
private let service: any ARProjectsProviding
|
|
|
|
init(service: any ARProjectsProviding) {
|
|
self.service = service
|
|
}
|
|
|
|
func load() {
|
|
isLoading = true
|
|
defer { isLoading = false }
|
|
do {
|
|
let projects = try service.loadProjects()
|
|
supplied = projects.filter { $0.source == .supplied }
|
|
custom = projects.filter { $0.source == .custom }
|
|
} catch { errorMessage = error.localizedDescription }
|
|
}
|
|
|
|
func update(id: UUID, name: String, tank: Tank) -> ARProject? {
|
|
do {
|
|
let project = try service.updateProject(id: id, name: name, tank: tank)
|
|
if let index = custom.firstIndex(where: { $0.id == id }) { custom[index] = project }
|
|
return project
|
|
} catch {
|
|
errorMessage = error.localizedDescription
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func delete(id: UUID) {
|
|
do {
|
|
try service.deleteProject(id: id)
|
|
supplied.removeAll { $0.id == id }
|
|
custom.removeAll { $0.id == id }
|
|
} catch { errorMessage = error.localizedDescription }
|
|
}
|
|
|
|
func create(name: String, tank: Tank) -> ARProject? {
|
|
do {
|
|
let project = try service.createProject(name: name, tank: tank)
|
|
custom.insert(project, at: 0)
|
|
return project
|
|
} catch {
|
|
errorMessage = error.localizedDescription
|
|
return nil
|
|
}
|
|
}
|
|
}
|