2021-05-10 23:42:01 +02:00
|
|
|
/// Given a feature source, calculates a list of OSM-contributors who mapped the latest versions
|
2022-06-19 13:55:33 +02:00
|
|
|
import { Store, 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>())
|
2022-06-19 13:55:33 +02:00
|
|
|
private readonly state: {
|
|
|
|
featurePipeline: FeaturePipeline
|
|
|
|
currentBounds: Store<BBox>
|
|
|
|
locationControl: Store<Loc>
|
2022-09-08 21:40:48 +02:00
|
|
|
}
|
2021-11-07 16:34:51 +01:00
|
|
|
private lastUpdate: Date = undefined
|
2021-05-10 23:42:01 +02:00
|
|
|
|
2022-06-19 13:55:33 +02:00
|
|
|
constructor(state: {
|
|
|
|
featurePipeline: FeaturePipeline
|
|
|
|
currentBounds: Store<BBox>
|
|
|
|
locationControl: Store<Loc>
|
|
|
|
}) {
|
2021-09-21 02:10:42 +02:00
|
|
|
this.state = state
|
|
|
|
const self = this
|
|
|
|
state.currentBounds.map((bbox) => {
|
|
|
|
self.update(bbox)
|
|
|
|
})
|
|
|
|
state.featurePipeline.runningQuery.addCallbackAndRun((_) =>
|
2021-11-07 16:34:51 +01:00
|
|
|
self.update(state.currentBounds.data)
|
2021-09-21 02:10:42 +02:00
|
|
|
)
|
2021-11-07 16:34:51 +01:00
|
|
|
}
|
2021-09-21 02:10:42 +02:00
|
|
|
|
|
|
|
private update(bbox: BBox) {
|
2021-11-07 16:34:51 +01:00
|
|
|
if (bbox === undefined) {
|
2021-09-21 02:10:42 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|