as-app/src/location/bggeo/diagnostics.js

75 lines
2.2 KiB
JavaScript

import BackgroundGeolocation from "react-native-background-geolocation";
import { ensureBackgroundGeolocationReady } from "~/location/backgroundGeolocationService";
import { BASE_GEOLOCATION_CONFIG } from "~/location/backgroundGeolocationConfig";
/**
* BGGeo diagnostics helpers.
*
* Intentionally lives outside UI code so we don't scatter direct BGGeo calls.
*
* NOTE: Calling these will execute `.ready()` (vendor requirement), but they do not start
* tracking by themselves.
*/
export async function bggeoGetStatusSnapshot() {
await ensureBackgroundGeolocationReady(BASE_GEOLOCATION_CONFIG);
const [state, count] = await Promise.all([
BackgroundGeolocation.getState(),
BackgroundGeolocation.getCount(),
]);
return {
enabled: !!state?.enabled,
isMoving: !!state?.isMoving,
trackingMode: state?.trackingMode ?? null,
schedulerEnabled: !!state?.schedulerEnabled,
pending: count ?? null,
};
}
export async function bggeoSyncNow() {
await ensureBackgroundGeolocationReady(BASE_GEOLOCATION_CONFIG);
const pendingBefore = await BackgroundGeolocation.getCount();
const records = await BackgroundGeolocation.sync();
const pendingAfter = await BackgroundGeolocation.getCount();
return {
pendingBefore: pendingBefore ?? null,
synced: records?.length ?? 0,
pendingAfter: pendingAfter ?? null,
};
}
export async function bggeoGetDiagnosticsSnapshot() {
await ensureBackgroundGeolocationReady(BASE_GEOLOCATION_CONFIG);
const [state, count, locations] = await Promise.all([
BackgroundGeolocation.getState(),
BackgroundGeolocation.getCount(),
BackgroundGeolocation.getLocations(),
]);
const last =
Array.isArray(locations) && locations.length
? locations[locations.length - 1]
: null;
return {
state: {
enabled: !!state?.enabled,
isMoving: !!state?.isMoving,
trackingMode: state?.trackingMode ?? null,
schedulerEnabled: !!state?.schedulerEnabled,
},
pending: count ?? null,
lastLocation: last
? {
latitude: last?.coords?.latitude ?? null,
longitude: last?.coords?.longitude ?? null,
accuracy: last?.coords?.accuracy ?? null,
timestamp: last?.timestamp ?? null,
}
: null,
};
}