import FeatureSwitchState from "./FeatureSwitchState" import { ElementStorage } from "../ElementStorage" import { Changes } from "../Osm/Changes" import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig" import { UIEventSource } from "../UIEventSource" import Loc from "../../Models/Loc" import { BBox } from "../BBox" import { QueryParameters } from "../Web/QueryParameters" import { LocalStorageSource } from "../Web/LocalStorageSource" import { Utils } from "../../Utils" import ChangeToElementsActor from "../Actors/ChangeToElementsActor" import PendingChangesUploader from "../Actors/PendingChangesUploader" /** * The part of the state keeping track of where the elements, loading them, configuring the feature pipeline etc */ export default class ElementsState extends FeatureSwitchState { /** The mapping from id -> UIEventSource */ public allElements: ElementStorage = new ElementStorage() /** The latest element that was selected */ public readonly selectedElement = new UIEventSource(undefined, "Selected element") /** * The map location: currently centered lat, lon and zoom */ public readonly locationControl = new UIEventSource(undefined, "locationControl") /** * The current visible extent of the screen */ public readonly currentBounds = new UIEventSource(undefined) constructor(layoutToUse: LayoutConfig) { super(layoutToUse) function localStorageSynced( key: string, deflt: number, docs: string ): UIEventSource { const localStorage = LocalStorageSource.Get(key) const previousValue = localStorage.data const src = UIEventSource.asFloat( QueryParameters.GetQueryParameter(key, "" + deflt, docs).syncWith(localStorage) ) if (src.data === deflt) { const prev = Number(previousValue) if (!isNaN(prev)) { src.setData(prev) } } return src } // -- Location control initialization const zoom = localStorageSynced( "z", layoutToUse?.startZoom ?? 1, "The initial/current zoom level" ) const lat = localStorageSynced( "lat", layoutToUse?.startLat ?? 0, "The initial/current latitude" ) const lon = localStorageSynced( "lon", layoutToUse?.startLon ?? 0, "The initial/current longitude of the app" ) this.locationControl.setData({ zoom: Utils.asFloat(zoom.data), lat: Utils.asFloat(lat.data), lon: Utils.asFloat(lon.data), }) this.locationControl.addCallback((latlonz) => { // Sync the location controls zoom.setData(latlonz.zoom) lat.setData(latlonz.lat) lon.setData(latlonz.lon) }) } }