MapComplete/src/Logic/Geocoding/RecentSearch.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

52 lines
1.8 KiB
TypeScript
Raw Normal View History

2024-08-21 14:06:42 +02:00
import { Store, UIEventSource } from "../UIEventSource"
import { Feature } from "geojson"
import { OsmConnection } from "../Osm/OsmConnection"
import { GeoCodeResult } from "./GeocodingProvider"
import { GeoOperations } from "../GeoOperations"
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig"
export class RecentSearch {
private readonly _seenThisSession: UIEventSource<GeoCodeResult[]>
public readonly seenThisSession: Store<GeoCodeResult[]>
2024-08-21 14:06:42 +02:00
constructor(state: { layout: LayoutConfig, osmConnection: OsmConnection, selectedElement: Store<Feature> }) {
// const prefs = state.osmConnection.preferencesHandler.GetLongPreference("previous-searches")
this._seenThisSession = new UIEventSource<GeoCodeResult[]>([])//UIEventSource.asObject<GeoCodeResult[]>(prefs, [])
this.seenThisSession = this._seenThisSession
2024-08-21 14:06:42 +02:00
state.selectedElement.addCallbackAndRunD(selected => {
2024-08-22 22:50:37 +02:00
2024-08-21 14:06:42 +02:00
const [osm_type, osm_id] = selected.properties.id.split("/")
2024-08-22 22:50:37 +02:00
if(!osm_id){
return
}
2024-08-21 14:06:42 +02:00
const [lon, lat] = GeoOperations.centerpointCoordinates(selected)
const entry = <GeoCodeResult>{
2024-08-21 14:06:42 +02:00
feature: selected,
osm_id, osm_type,
lon, lat
}
this.addSelected(entry)
})
}
addSelected(entry: GeoCodeResult) {
const arr = [...(this.seenThisSession.data ?? []).slice(0, 20), entry]
2024-08-21 14:06:42 +02:00
const seenIds = new Set<string>()
for (let i = arr.length - 1; i >= 0; i--) {
const id = arr[i].osm_type + arr[i].osm_id
if (seenIds.has(id)) {
arr.splice(i, 1)
} else {
seenIds.add(id)
}
}
this._seenThisSession.set(arr)
}
}