| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  | /// Given a feature source, calculates a list of OSM-contributors who mapped the latest versions
 | 
					
						
							|  |  |  | import {UIEventSource} from "./UIEventSource"; | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  | import FeaturePipeline from "./FeatureSource/FeaturePipeline"; | 
					
						
							|  |  |  | import Loc from "../Models/Loc"; | 
					
						
							| 
									
										
										
										
											2021-09-28 17:30:48 +02:00
										 |  |  | import {BBox} from "./BBox"; | 
					
						
							| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default class ContributorCount { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |     public readonly Contributors: UIEventSource<Map<string, number>> = new UIEventSource<Map<string, number>>(new Map<string, number>()); | 
					
						
							|  |  |  |     private readonly state: { featurePipeline: FeaturePipeline, currentBounds: UIEventSource<BBox>, locationControl: UIEventSource<Loc> }; | 
					
						
							| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |     constructor(state: { featurePipeline: FeaturePipeline, currentBounds: UIEventSource<BBox>, locationControl: UIEventSource<Loc> }) { | 
					
						
							|  |  |  |         this.state = state; | 
					
						
							|  |  |  |         const self = this; | 
					
						
							|  |  |  |         state.currentBounds.map(bbox => { | 
					
						
							|  |  |  |             self.update(bbox) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         state.featurePipeline.runningQuery.addCallbackAndRun( | 
					
						
							|  |  |  |             _ =>   self.update(state.currentBounds.data) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |        | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private lastUpdate: Date = undefined; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private update(bbox: BBox) { | 
					
						
							|  |  |  |         if(bbox === undefined){ | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const now = new Date(); | 
					
						
							|  |  |  |         if (this.lastUpdate !== undefined && ((now.getTime() - this.lastUpdate.getTime()) < 1000 * 60)) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-09-21 03:10:15 +02:00
										 |  |  |         this.lastUpdate = now; | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         const featuresList = this.state.featurePipeline.GetAllFeaturesWithin(bbox) | 
					
						
							|  |  |  |         const hist = new Map<string, number>(); | 
					
						
							|  |  |  |         for (const list of featuresList) { | 
					
						
							|  |  |  |             for (const feature of list) { | 
					
						
							|  |  |  |                 const contributor = feature.properties["_last_edit:contributor"] | 
					
						
							| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  |                 const count = hist.get(contributor) ?? 0; | 
					
						
							|  |  |  |                 hist.set(contributor, count + 1) | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-09-21 02:10:42 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         this.Contributors.setData(hist) | 
					
						
							| 
									
										
										
										
											2021-05-10 23:42:01 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |