Add GPS trip reports and route maps

This commit is contained in:
2026-08-01 00:56:19 +02:00
parent cb0ac06091
commit e501895e56
12 changed files with 817 additions and 21 deletions
+55
View File
@@ -130,6 +130,50 @@ export type BluetoothStatus = {
message: string;
};
export type TripSummary = {
id: number;
deviceId: string;
deviceName: string;
startedAt: number;
endedAt: number | null;
active: boolean;
durationSeconds: number;
movingSeconds: number;
distanceKm: number;
pointCount: number;
averageSpeedKph: number | null;
peakSpeedKph: number | null;
vehicleBatteryStartPercent: number | null;
vehicleBatteryEndPercent: number | null;
batteryConsumedPercent: number | null;
energyConsumedKwh: number | null;
phoneBatteryStartPercent: number | null;
phoneBatteryEndPercent: number | null;
start: { latitude: number; longitude: number };
end: { latitude: number; longitude: number };
};
export type TripPoint = {
capturedAt: number;
latitude: number;
longitude: number;
accuracyMeters: number;
altitudeMeters: number | null;
speedKph: number | null;
bearingDegrees: number | null;
vehicleBatteryPercent: number | null;
};
export type TripPin = {
type: "start" | "end" | "peak-speed";
latitude: number;
longitude: number;
capturedAt: number | null;
speedKph?: number | null;
};
export type TripDetail = TripSummary & { points: TripPoint[]; pins: TripPin[] };
export type CarTelemetry = {
available: true;
collectedAt: string;
@@ -274,6 +318,17 @@ export async function getBluetoothStatus(): Promise<BluetoothStatus> {
return parseResponse<BluetoothStatus>(await fetch("/api/mobile/bluetooth", { credentials: "same-origin" }));
}
export async function getTrips(): Promise<TripSummary[]> {
const response = await parseResponse<{ trips: TripSummary[] }>(
await fetch("/api/trips", { credentials: "same-origin" })
);
return response.trips;
}
export async function getTrip(id: number): Promise<TripDetail> {
return parseResponse<TripDetail>(await fetch(`/api/trips/${id}`, { credentials: "same-origin" }));
}
export async function revokeMobileDevice(id: string, csrfToken: string): Promise<void> {
await parseResponse(await fetch(`/api/mobile/devices/${encodeURIComponent(id)}`, {
method: "DELETE",