as-app/src/location/emulatorService.js
2025-07-02 00:54:30 +02:00

111 lines
2.9 KiB
JavaScript

import BackgroundGeolocation from "react-native-background-geolocation";
import AsyncStorage from "~/storage/memoryAsyncStorage";
import { STORAGE_KEYS } from "~/storage/storageKeys";
import { createLogger } from "~/lib/logger";
import { BACKGROUND_SCOPES } from "~/lib/logger/scopes";
// Global variables
let emulatorIntervalId = null;
let isEmulatorModeEnabled = false;
// Create a logger for the emulator service
const emulatorLogger = createLogger({
module: BACKGROUND_SCOPES.GEOLOCATION,
feature: "emulator",
});
// Initialize emulator mode based on stored preference
export const initEmulatorMode = async () => {
try {
const storedValue = await AsyncStorage.getItem(
STORAGE_KEYS.EMULATOR_MODE_ENABLED,
);
emulatorLogger.debug("Initializing emulator mode", { storedValue });
if (storedValue === "true") {
await enableEmulatorMode();
}
} catch (error) {
emulatorLogger.error("Failed to initialize emulator mode", {
error: error.message,
stack: error.stack,
});
}
};
// Enable emulator mode
export const enableEmulatorMode = async () => {
emulatorLogger.info("Enabling emulator mode");
// Clear existing interval if any
if (emulatorIntervalId) {
clearInterval(emulatorIntervalId);
}
try {
// Call immediately once
await BackgroundGeolocation.changePace(true);
emulatorLogger.debug("Initial changePace call successful");
// Then set up interval
emulatorIntervalId = setInterval(
() => {
BackgroundGeolocation.changePace(true);
emulatorLogger.debug("Interval changePace call executed");
},
30 * 60 * 1000,
); // 30 minutes
isEmulatorModeEnabled = true;
// Persist the setting
await AsyncStorage.setItem(STORAGE_KEYS.EMULATOR_MODE_ENABLED, "true");
emulatorLogger.debug("Emulator mode setting saved");
} catch (error) {
emulatorLogger.error("Failed to enable emulator mode", {
error: error.message,
stack: error.stack,
});
}
};
// Disable emulator mode
export const disableEmulatorMode = async () => {
emulatorLogger.info("Disabling emulator mode");
if (emulatorIntervalId) {
clearInterval(emulatorIntervalId);
emulatorIntervalId = null;
}
isEmulatorModeEnabled = false;
// Persist the setting
try {
await AsyncStorage.setItem(STORAGE_KEYS.EMULATOR_MODE_ENABLED, "false");
emulatorLogger.debug("Emulator mode setting saved");
} catch (error) {
emulatorLogger.error("Failed to save emulator mode setting", {
error: error.message,
stack: error.stack,
});
}
};
// Get current emulator mode state
export const getEmulatorModeState = () => {
return isEmulatorModeEnabled;
};
// Toggle emulator mode
export const toggleEmulatorMode = async (enabled) => {
emulatorLogger.info("Toggling emulator mode", { enabled });
if (enabled) {
await enableEmulatorMode();
} else {
await disableEmulatorMode();
}
return isEmulatorModeEnabled;
};