111 lines
2.9 KiB
JavaScript
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;
|
|
};
|