AutoCat/AutoCat/Screens/ReportScreen/ReportViewModel.swift

134 lines
3.4 KiB
Swift

//
// ReportViewModel.swift
// AutoCat
//
// Created by Selim Mustafaev on 16.11.2024.
// Copyright © 2024 Selim Mustafaev. All rights reserved.
//
import AutoCatCore
import SwiftUI
@MainActor
@Observable
class ReportViewModel: ACHudContainer {
let apiService: ApiServiceProtocol
let storageService: StorageServiceProtocol
let settingsService: SettingsServiceProtocol
var coordinator: ReportCoordinator?
let isPersistent: Bool
var vehicle: VehicleDto
var hud: ACHud?
var plateNumber: String {
if vehicle.outdated, let current = vehicle.currentNumber {
"\(vehicle.number) (\(current))"
} else {
vehicle.number
}
}
var steerignWheelPosition: String {
vehicle.isRightWheel == true
? NSLocalizedString("Right", comment: "")
: NSLocalizedString("Left", comment: "")
}
var isJapanese: String {
vehicle.isJapanese == true
? NSLocalizedString("Yes", comment: "")
: NSLocalizedString("No", comment: "")
}
var showDebugInfo: Bool {
settingsService.showDebugInfo
}
var shareLink: URL? {
guard let jwt = try? JWT<EmptyPayload>.generate(for: vehicle.getNumber()) else {
return nil
}
return URL(string: Constants.reportLinkBaseURL + "?token=" + jwt)
}
init(apiService: ApiServiceProtocol,
storageService: StorageServiceProtocol,
settingsService: SettingsServiceProtocol,
vehicle: VehicleDto,
isPersistent: Bool) {
self.apiService = apiService
self.storageService = storageService
self.settingsService = settingsService
self.vehicle = vehicle
self.isPersistent = isPersistent
}
func onAppear() async {
if isPersistent {
await loadVehicle()
}
}
func loadVehicle() async {
do {
vehicle = try await storageService.loadVehicle(number: vehicle.getNumber())
} catch {
hud = .error(error)
}
}
func showAlert(text: String, status: DebugInfoStatus) {
switch status {
case .success: showSuccess(text: text)
case .warning: showWarning(text: text)
case .error: showError(text: text)
}
}
func checkGB() async {
await wrapWithToast {
self.vehicle = try await self.apiService.checkVehicleGb(by: self.vehicle.getNumber())
try await self.storageService.updateVehicle(dto: self.vehicle, policy: .ifExists)
}
}
// MARK: Open detail screens
func openEvents() {
Task {
if let vehicle = await coordinator?.openEvents(vehicle: vehicle) {
self.vehicle = vehicle
}
}
}
func openOsago() {
coordinator?.openOsago(contracts: vehicle.osagoContracts)
}
func openOwners() {
coordinator?.openOwners(ownerships: vehicle.ownershipPeriods)
}
func openPhotoGallery() {
coordinator?.openPhotos(vehicle.photos)
}
func openNotes() {
Task {
if let vehicle = await coordinator?.openNotes(vehicle: vehicle) {
self.vehicle = vehicle
}
}
}
func openAds() {
coordinator?.openAds(vehicle.ads)
}
}