134 lines
3.4 KiB
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.updateVehicleIfExists(dto: self.vehicle)
|
|
}
|
|
}
|
|
|
|
// 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)
|
|
}
|
|
}
|