93 lines
No EOL
2.2 KiB
TypeScript
93 lines
No EOL
2.2 KiB
TypeScript
// Helper functions for map.ts to reduce code duplication
|
|
|
|
export interface MapState {
|
|
lat: number;
|
|
lng: number;
|
|
zoom: number;
|
|
}
|
|
|
|
export interface BoundsData {
|
|
north: number;
|
|
south: number;
|
|
east: number;
|
|
west: number;
|
|
}
|
|
|
|
/**
|
|
* Parse timestamp to milliseconds
|
|
*/
|
|
export function parseTimestamp(timestamp: any): number {
|
|
if (!timestamp) return Date.now();
|
|
|
|
if (typeof timestamp === "number") {
|
|
return timestamp;
|
|
} else if (typeof timestamp === "string") {
|
|
return new Date(timestamp).getTime();
|
|
}
|
|
return Date.now();
|
|
}
|
|
|
|
/**
|
|
* Get trail ID from marker data
|
|
*/
|
|
export function getTrailId(data: { callsign_group?: string; callsign?: string; id: string }): string {
|
|
return data.callsign_group || data.callsign || data.id;
|
|
}
|
|
|
|
/**
|
|
* Save map state to localStorage and send to server
|
|
*/
|
|
export function saveMapState(map: any, pushEvent: Function) {
|
|
const center = map.getCenter();
|
|
const zoom = map.getZoom();
|
|
|
|
// Truncate lat/lng to 5 decimal places for URL
|
|
const truncatedLat = Math.round(center.lat * 100000) / 100000;
|
|
const truncatedLng = Math.round(center.lng * 100000) / 100000;
|
|
|
|
localStorage.setItem(
|
|
"aprs_map_state",
|
|
JSON.stringify({ lat: truncatedLat, lng: truncatedLng, zoom }),
|
|
);
|
|
|
|
// Send combined map state update to server for URL and bounds updating
|
|
pushEvent("update_map_state", {
|
|
center: { lat: truncatedLat, lng: truncatedLng },
|
|
zoom: zoom,
|
|
bounds: {
|
|
north: map.getBounds().getNorth(),
|
|
south: map.getBounds().getSouth(),
|
|
east: map.getBounds().getEast(),
|
|
west: map.getBounds().getWest(),
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Safely push event to LiveView
|
|
*/
|
|
export function safePushEvent(pushEvent: Function | undefined, event: string, payload: any): boolean {
|
|
if (!pushEvent) return false;
|
|
|
|
try {
|
|
pushEvent(event, payload);
|
|
return true;
|
|
} catch (e) {
|
|
console.debug(`Unable to send ${event} event - LiveView disconnected`);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if LiveView socket is available
|
|
*/
|
|
export function isLiveViewConnected(): boolean {
|
|
return !!(window as any).liveSocket;
|
|
}
|
|
|
|
/**
|
|
* Get LiveView socket
|
|
*/
|
|
export function getLiveSocket(): any {
|
|
return (window as any).liveSocket;
|
|
} |