Add lead workflows, PDF signing, AR projects and photo gallery integration
This commit is contained in:
55
GasTankAR/Views/AR/Projects/ARProjectsViewModel.swift
Normal file
55
GasTankAR/Views/AR/Projects/ARProjectsViewModel.swift
Normal file
@ -0,0 +1,55 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user