as-app/src/stores/location.js

80 lines
2.1 KiB
JavaScript

import { createAtom } from "~/lib/atomic-zustand";
import { createLogger } from "~/lib/logger";
import { BACKGROUND_SCOPES } from "~/lib/logger/scopes";
const locationStoreLogger = createLogger({
module: BACKGROUND_SCOPES.GEOLOCATION,
feature: "store",
});
export default createAtom(({ merge, get }) => {
const update = (coords) => {
const prevState = get();
locationStoreLogger.debug("Updating location store", {
isFirstUpdate: !prevState.loaded,
hasValidCoords: !!(coords.latitude && coords.longitude),
accuracy: coords.accuracy,
});
merge({
coords,
loaded: true,
});
if (!prevState.loaded) {
locationStoreLogger.info(
"Location store initialized with first coordinates",
);
}
// Log significant changes in accuracy or movement
if (prevState.loaded) {
const prevCoords = prevState.coords;
const accuracyChange = Math.abs(
(coords.accuracy || 0) - (prevCoords.accuracy || 0),
);
const hasSignificantAccuracyChange = accuracyChange > 10; // 10 meters threshold
if (hasSignificantAccuracyChange) {
locationStoreLogger.debug("Significant accuracy change detected", {
previousAccuracy: prevCoords.accuracy,
newAccuracy: coords.accuracy,
change: accuracyChange,
});
}
// Log if speed or heading information becomes available
if (
(!prevCoords.speed && coords.speed) ||
(!prevCoords.heading && coords.heading)
) {
locationStoreLogger.debug("New motion data available", {
hasSpeed: !!coords.speed,
hasHeading: !!coords.heading,
speed: coords.speed,
heading: coords.heading,
});
}
}
};
locationStoreLogger.debug("Initializing location store");
return {
default: {
loaded: false,
coords: {
accuracy: null,
altitude: null,
altitudeAccuracy: null,
heading: null,
latitude: null,
longitude: null,
speed: null,
},
},
actions: {
update,
},
};
});