85 lines
2.6 KiB
JavaScript
85 lines
2.6 KiB
JavaScript
import BackgroundGeolocation from "react-native-background-geolocation";
|
|
import { Alert } from "react-native";
|
|
|
|
import { getLocationState } from "~/stores";
|
|
|
|
import openSettings from "~/lib/native/openSettings";
|
|
|
|
import setLocationState from "./setLocationState";
|
|
|
|
import camelCaseKeys from "~/utils/string/camelCaseKeys";
|
|
|
|
const MAX_RETRIES = 3;
|
|
const RETRY_DELAY = 1000; // 1 second
|
|
|
|
export async function getCurrentLocation() {
|
|
let retries = 0;
|
|
|
|
while (retries < MAX_RETRIES) {
|
|
try {
|
|
// Check for location permissions and services
|
|
const state = await BackgroundGeolocation.getState();
|
|
|
|
if (!state.enabled) {
|
|
// Prompt the user to enable location services manually
|
|
Alert.alert(
|
|
"Services de localisation désactivés",
|
|
"Veuillez activer les services de localisation pour utiliser cette fonctionnalité.",
|
|
[
|
|
{ text: "Annuler", style: "cancel" },
|
|
{ text: "Ouvrir les paramètres", onPress: openSettings },
|
|
],
|
|
);
|
|
return null;
|
|
}
|
|
const authorizationStatus =
|
|
await BackgroundGeolocation.requestPermission();
|
|
|
|
const isAuthorized =
|
|
authorizationStatus ===
|
|
BackgroundGeolocation.AUTHORIZATION_STATUS_ALWAYS ||
|
|
authorizationStatus ===
|
|
BackgroundGeolocation.AUTHORIZATION_STATUS_WHEN_IN_USE;
|
|
|
|
if (!isAuthorized) {
|
|
// If unable to get permissions, provide a link to settings
|
|
Alert.alert(
|
|
"Autorisation de localisation requise",
|
|
"Veuillez accorder l'autorisation de localisation pour utiliser cette fonctionnalité.",
|
|
[
|
|
{ text: "Annuler", style: "cancel" },
|
|
{ text: "Ouvrir les paramètres", onPress: openSettings },
|
|
],
|
|
);
|
|
return null;
|
|
}
|
|
|
|
const location = await BackgroundGeolocation.getCurrentPosition({
|
|
timeout: 30,
|
|
persist: true,
|
|
maximumAge: 5000,
|
|
desiredAccuracy: BackgroundGeolocation.DESIRED_ACCURACY_HIGH,
|
|
samples: 1,
|
|
});
|
|
const coords = camelCaseKeys(location.coords);
|
|
setLocationState(coords);
|
|
return coords;
|
|
} catch (error) {
|
|
console.log(
|
|
`Erreur lors de l'obtention de la position actuelle (tentative ${
|
|
retries + 1
|
|
}/${MAX_RETRIES}):`,
|
|
error,
|
|
);
|
|
retries++;
|
|
if (retries < MAX_RETRIES) {
|
|
await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY));
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log(
|
|
"Nombre maximal de tentatives atteint. Utilisation de la dernière position connue",
|
|
);
|
|
return getLocationState().coords || {};
|
|
}
|