/** * 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 WhirlyGlobeMaplyComponent 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] = [] @Published var selectedUnit: UnitInformation? = 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 toggleDisplayMode() { switch unitsDisplayMode { case .map: unitsDisplayMode = .list case .list: unitsDisplayMode = .map } } func search(query: String) { unitsController.search(query: query) } }