forked from MapComplete/MapComplete
		
	Further refactoring
This commit is contained in:
		
							parent
							
								
									e4a2fd1daf
								
							
						
					
					
						commit
						7a7b34b0fa
					
				
					 17 changed files with 350 additions and 297 deletions
				
			
		
							
								
								
									
										71
									
								
								State.ts
									
										
									
									
									
								
							
							
						
						
									
										71
									
								
								State.ts
									
										
									
									
									
								
							|  | @ -18,6 +18,8 @@ import {BaseLayer} from "./Models/BaseLayer"; | |||
| import Loc from "./Models/Loc"; | ||||
| import Constants from "./Models/Constants"; | ||||
| import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers"; | ||||
| import * as L from "leaflet" | ||||
| import LayerResetter from "./Logic/Actors/LayerResetter"; | ||||
| 
 | ||||
| /** | ||||
|  * Contains the global state: a bunch of UI-event sources | ||||
|  | @ -41,9 +43,9 @@ export default class State { | |||
|      */ | ||||
|     public changes: Changes; | ||||
|     /** | ||||
|      THe basemap with leaflet instance | ||||
|      The leaflet instance of the big basemap | ||||
|      */ | ||||
|     public bm; | ||||
|     public leafletMap = new UIEventSource<L.Map>(undefined); | ||||
|     /** | ||||
|      * Background layer id | ||||
|      */ | ||||
|  | @ -91,8 +93,11 @@ export default class State { | |||
|      * The map location: currently centered lat, lon and zoom | ||||
|      */ | ||||
|     public readonly locationControl = new UIEventSource<Loc>(undefined); | ||||
|     public readonly backgroundLayer = new UIEventSource<BaseLayer>(AvailableBaseLayers.osmCarto); | ||||
|      | ||||
|     public readonly backgroundLayer; | ||||
|     /* Last location where a click was registered | ||||
|      */ | ||||
|     public readonly LastClickLocation: UIEventSource<{ lat: number, lon: number }> = new UIEventSource<{ lat: number, lon: number }>(undefined) | ||||
| 
 | ||||
|     /** | ||||
|      * The location as delivered by the GPS | ||||
|      */ | ||||
|  | @ -114,23 +119,12 @@ export default class State { | |||
|         const self = this; | ||||
|         this.layoutToUse.setData(layoutToUse); | ||||
| 
 | ||||
|         function asFloat(source: UIEventSource<string>): UIEventSource<number> { | ||||
|             return source.map(str => { | ||||
|                 let parsed = parseFloat(str); | ||||
|                 return isNaN(parsed) ? undefined : parsed; | ||||
|             }, [], fl => { | ||||
|                 if (fl === undefined || isNaN(fl)) { | ||||
|                     return undefined; | ||||
|                 } | ||||
|                 return ("" + fl).substr(0, 8); | ||||
|             }) | ||||
|         } | ||||
|         const zoom = asFloat( | ||||
|         const zoom = State.asFloat( | ||||
|             QueryParameters.GetQueryParameter("z", "" + layoutToUse.startZoom, "The initial/current zoom level") | ||||
|             .syncWith(LocalStorageSource.Get("zoom"))); | ||||
|         const lat = asFloat(QueryParameters.GetQueryParameter("lat", "" + layoutToUse.startLat, "The initial/current latitude") | ||||
|         const lat = State.asFloat(QueryParameters.GetQueryParameter("lat", "" + layoutToUse.startLat, "The initial/current latitude") | ||||
|             .syncWith(LocalStorageSource.Get("lat"))); | ||||
|         const lon = asFloat(QueryParameters.GetQueryParameter("lon", "" + layoutToUse.startLon, "The initial/current longitude of the app") | ||||
|         const lon = State.asFloat(QueryParameters.GetQueryParameter("lon", "" + layoutToUse.startLon, "The initial/current longitude of the app") | ||||
|             .syncWith(LocalStorageSource.Get("lon"))); | ||||
| 
 | ||||
| 
 | ||||
|  | @ -153,11 +147,35 @@ export default class State { | |||
|         }); | ||||
| 
 | ||||
| 
 | ||||
|         this.availableBackgroundLayers = new AvailableBaseLayers(this.locationControl).availableEditorLayers; | ||||
|         this.backgroundLayer = QueryParameters.GetQueryParameter("background", | ||||
|             this.layoutToUse.data.defaultBackgroundId ?? AvailableBaseLayers.osmCarto.id, | ||||
|             "The id of the background layer to start with") | ||||
|             .map((selectedId: string) => { | ||||
|                 console.log("SELECTED ID", selectedId) | ||||
|                 const available = self.availableBackgroundLayers.data; | ||||
|                 for (const layer of available) { | ||||
|                     if (layer.id === selectedId) { | ||||
|                         return layer; | ||||
|                     } | ||||
|                 } | ||||
|                 return AvailableBaseLayers.osmCarto; | ||||
|             }, [], layer => layer.id); | ||||
| 
 | ||||
| 
 | ||||
|         new LayerResetter( | ||||
|             this.backgroundLayer,this.locationControl, | ||||
|             this.availableBackgroundLayers, this.layoutToUse.map((layout : LayoutConfig)=> layout.defaultBackgroundId)); | ||||
| 
 | ||||
| 
 | ||||
|          | ||||
| 
 | ||||
| 
 | ||||
|         function featSw(key: string, deflt: (layout: LayoutConfig) => boolean, documentation: string): UIEventSource<boolean> { | ||||
|             const queryParameterSource = QueryParameters.GetQueryParameter(key, undefined, documentation); | ||||
|             // I'm so sorry about someone trying to decipher this
 | ||||
| 
 | ||||
|             // It takes the current layout, extracts the default value for this query paramter. A query parameter event source is then retreived and flattened
 | ||||
|             // It takes the current layout, extracts the default value for this query parameter. A query parameter event source is then retrieved and flattened
 | ||||
|             return UIEventSource.flatten( | ||||
|                 self.layoutToUse.map((layout) => { | ||||
|                     const defaultValue = deflt(layout); | ||||
|  | @ -186,6 +204,9 @@ export default class State { | |||
|         this.featureSwitchGeolocation = featSw("fs-geolocation", (layoutToUse) => layoutToUse?.enableGeolocation ?? true, | ||||
|             "Disables/Enables the geolocation button"); | ||||
| 
 | ||||
| 
 | ||||
|          | ||||
|          | ||||
|         const testParam = QueryParameters.GetQueryParameter("test", "false", | ||||
|             "If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org").data; | ||||
|         this.osmConnection = new OsmConnection( | ||||
|  | @ -264,4 +285,16 @@ export default class State { | |||
| 
 | ||||
|     } | ||||
| 
 | ||||
|    private static asFloat(source: UIEventSource<string>): UIEventSource<number> { | ||||
|         return source.map(str => { | ||||
|             let parsed = parseFloat(str); | ||||
|             return isNaN(parsed) ? undefined : parsed; | ||||
|         }, [], fl => { | ||||
|             if (fl === undefined || isNaN(fl)) { | ||||
|                 return undefined; | ||||
|             } | ||||
|             return ("" + fl).substr(0, 8); | ||||
|         }) | ||||
|     } | ||||
|      | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue