| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 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 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-10-22 14:01:40 +02:00
										 |  |  | export default class ElementsState extends FeatureSwitchState { | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      The mapping from id -> UIEventSource<properties> | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public allElements: ElementStorage = new ElementStorage() | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      The latest element that was selected | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public readonly selectedElement = new UIEventSource<any>(undefined, "Selected element") | 
					
						
							| 
									
										
										
										
											2021-10-22 14:01:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * The map location: currently centered lat, lon and zoom | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public readonly locationControl = new UIEventSource<Loc>(undefined, "locationControl") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * The current visible extent of the screen | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public readonly currentBounds = new UIEventSource<BBox>(undefined) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor(layoutToUse: LayoutConfig) { | 
					
						
							|  |  |  |         super(layoutToUse) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-09 19:29:51 +02:00
										 |  |  |         function localStorageSynced( | 
					
						
							|  |  |  |             key: string, | 
					
						
							|  |  |  |             deflt: number, | 
					
						
							|  |  |  |             docs: string | 
					
						
							|  |  |  |         ): UIEventSource<number> { | 
					
						
							|  |  |  |             const localStorage = LocalStorageSource.Get(key) | 
					
						
							|  |  |  |             const previousValue = localStorage.data | 
					
						
							|  |  |  |             const src = UIEventSource.asFloat( | 
					
						
							|  |  |  |                 QueryParameters.GetQueryParameter(key, "" + deflt, docs).syncWith(localStorage) | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-09 19:29:51 +02:00
										 |  |  |             if (src.data === deflt) { | 
					
						
							|  |  |  |                 const prev = Number(previousValue) | 
					
						
							|  |  |  |                 if (!isNaN(prev)) { | 
					
						
							|  |  |  |                     src.setData(prev) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-10-22 14:01:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-09 19:29:51 +02:00
										 |  |  |             return src | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-09 19:29:51 +02:00
										 |  |  |         // -- Location control initialization
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         const zoom = localStorageSynced( | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             "z", | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |             layoutToUse?.startZoom ?? 1, | 
					
						
							| 
									
										
										
										
											2022-04-09 19:29:51 +02:00
										 |  |  |             "The initial/current zoom level" | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         const lat = localStorageSynced( | 
					
						
							|  |  |  |             "lat", | 
					
						
							|  |  |  |             layoutToUse?.startLat ?? 0, | 
					
						
							|  |  |  |             "The initial/current latitude" | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         const lon = localStorageSynced( | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |             "lon", | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |             layoutToUse?.startLon ?? 0, | 
					
						
							| 
									
										
										
										
											2022-04-09 19:29:51 +02:00
										 |  |  |             "The initial/current longitude of the app" | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-10-22 14:01:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         this.locationControl.setData({ | 
					
						
							|  |  |  |             zoom: Utils.asFloat(zoom.data), | 
					
						
							|  |  |  |             lat: Utils.asFloat(lat.data), | 
					
						
							|  |  |  |             lon: Utils.asFloat(lon.data), | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |         this.locationControl.addCallback((latlonz) => { | 
					
						
							| 
									
										
										
										
											2022-04-09 19:29:51 +02:00
										 |  |  |             // Sync the location controls
 | 
					
						
							|  |  |  |             zoom.setData(latlonz.zoom) | 
					
						
							|  |  |  |             lat.setData(latlonz.lat) | 
					
						
							|  |  |  |             lon.setData(latlonz.lon) | 
					
						
							| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-10-15 05:20:02 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } |