Files
gpx.studio/website/src/lib/components/map/gpx-layer/StartEndMarkers.ts

53 lines
1.9 KiB
TypeScript
Raw Normal View History

import { gpxStatistics, slicedGPXStatistics, currentTool, Tool } from '$lib/stores';
import mapboxgl from 'mapbox-gl';
import { get } from 'svelte/store';
2024-06-10 13:21:53 +02:00
export class StartEndMarkers {
map: mapboxgl.Map;
start: mapboxgl.Marker;
end: mapboxgl.Marker;
updateBinded: () => void = this.update.bind(this);
2024-07-13 11:42:21 +02:00
unsubscribes: (() => void)[] = [];
2024-06-10 13:21:53 +02:00
constructor(map: mapboxgl.Map) {
this.map = map;
let startElement = document.createElement('div');
let endElement = document.createElement('div');
startElement.className = `h-4 w-4 rounded-full bg-green-500 border-2 border-white`;
endElement.className = `h-4 w-4 rounded-full border-2 border-white`;
endElement.style.background =
'repeating-conic-gradient(#fff 0 90deg, #000 0 180deg) 0 0/8px 8px round';
2024-06-10 13:21:53 +02:00
this.start = new mapboxgl.Marker({ element: startElement });
this.end = new mapboxgl.Marker({ element: endElement });
2024-07-13 11:42:21 +02:00
this.unsubscribes.push(gpxStatistics.subscribe(this.updateBinded));
this.unsubscribes.push(slicedGPXStatistics.subscribe(this.updateBinded));
this.unsubscribes.push(currentTool.subscribe(this.updateBinded));
2024-06-10 13:21:53 +02:00
}
update() {
2024-06-10 20:03:57 +02:00
let tool = get(currentTool);
let statistics = get(slicedGPXStatistics)?.[0] ?? get(gpxStatistics);
2024-06-10 20:03:57 +02:00
if (statistics.local.points.length > 0 && tool !== Tool.ROUTING) {
2024-06-10 13:21:53 +02:00
this.start.setLngLat(statistics.local.points[0].getCoordinates()).addTo(this.map);
this.end
.setLngLat(
statistics.local.points[statistics.local.points.length - 1].getCoordinates()
)
.addTo(this.map);
2024-06-10 13:21:53 +02:00
} else {
this.start.remove();
this.end.remove();
}
}
2024-07-13 11:42:21 +02:00
remove() {
this.unsubscribes.forEach((unsubscribe) => unsubscribe());
2024-07-13 11:42:21 +02:00
this.start.remove();
this.end.remove();
}
}