/** * TrackerMap * Copyright (C) 2021-2022 Iván Ávalos , Henoch Ojeda * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import Foundation import WhirlyGlobe import shared class UnitsViewModel: ObservableObject { @Inject var unitsController: UnitsController @Inject var geofenceController: GeofencesController let mainScope = MainScope.companion.createMainScope() enum UnitsDisplayMode { case map case list } class Camera { let point: MaplyCoordinate? let height: Float? init(_ point: MaplyCoordinate? = nil, height: Float? = nil) { self.point = point self.height = height } } @Published var searchQuery = "" { didSet { unitsDisplayMode = .list search(query: searchQuery) } } @Published var isEditing = false @Published var unitsDisplayMode: UnitsDisplayMode = .list @Published var units: [UnitInformation] = [] { didSet { markers = units.compactMap(Marker.companion.fromUnit) } } @Published var markers: [Marker] = [] @Published var selectedUnit: UnitInformation? = nil { didSet { if let unit = selectedUnit { selectedMarker = Marker.companion.fromUnit(unit: unit) } else { selectedMarker = nil } } } @Published var selectedMarker: Marker? = nil @Published var mapLayerType: MapLayer = .companion.defaultLayer @Published var geofences: [Int: Geofence] = [:] @Published var camera: Camera = Camera() init() { unitsController.fetchUnits(scope: mainScope) setupObservers() } deinit { MainScope.companion.cancelScope(scope: mainScope) } private func setupObservers() { let unitsCollector = Collector<[UnitInformation]>(callback: setUnits) unitsController.displayedUnitsFlow.collect(collector: unitsCollector) { unit, error in } let geofencesCollector = Collector<[Int: Geofence]>(callback: setGeofences) geofenceController.geofencesFlow.collect(collector: geofencesCollector) { unit, error in } } private func setUnits(units: [UnitInformation]) { print("Positions") self.units = units } private func setGeofences(geofences: [Int: Geofence]) { self.geofences = geofences } func selectUnitWith(position id: Int32?) { if id == nil { print("Deselecting unit") selectedUnit = nil return } print("Selecting unit with position id: \(id ?? 0)") if let unit = units.first(where: { Int32(truncating: $0.position?.id ?? 0) == id }) { selectedUnit = unit } } func toggleDisplayMode() { switch unitsDisplayMode { case .map: unitsDisplayMode = .list case .list: unitsDisplayMode = .map } } func search(query: String) { unitsController.search(query: query) } }