From 1ce50458712547b70ad892a84330f34001d9ea38 Mon Sep 17 00:00:00 2001 From: Emmy D'Anello Date: Fri, 6 Dec 2024 19:00:51 +0100 Subject: [PATCH] =?UTF-8?q?G=C3=A9olocalisation=20en=20arri=C3=A8re-plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/app.json | 9 +++--- client/app/(tabs)/_layout.tsx | 4 +-- client/app/(tabs)/index.tsx | 14 +-------- client/app/_layout.tsx | 59 +++++++++++++++++++++++++++++++++++ client/package-lock.json | 20 ++++++++++++ client/package.json | 1 + 6 files changed, 87 insertions(+), 20 deletions(-) diff --git a/client/app.json b/client/app.json index d26a3d5..e7aa572 100644 --- a/client/app.json +++ b/client/app.json @@ -1,7 +1,7 @@ { "expo": { "name": "Traintrape-moi", - "slug": "traintrape-moi", + "slug": "traintrape-moi-client", "version": "1.0.0", "orientation": "portrait", "icon": "./assets/images/icon.png", @@ -34,9 +34,7 @@ "backgroundColor": "#ffffff" } ], - [ - "@maplibre/maplibre-react-native" - ], + "@maplibre/maplibre-react-native", [ "expo-location", { @@ -44,7 +42,8 @@ "isIosBackgroundLocationEnabled": true, "locationAlwaysAndWhenInUsePermission": "Allow $(PRODUCT_NAME) to use your location." } - ] + ], + "expo-task-manager" ], "experiments": { "typedRoutes": true diff --git a/client/app/(tabs)/_layout.tsx b/client/app/(tabs)/_layout.tsx index fdb013c..a821782 100644 --- a/client/app/(tabs)/_layout.tsx +++ b/client/app/(tabs)/_layout.tsx @@ -6,7 +6,7 @@ import { useColorScheme } from '@/hooks/useColorScheme' import { FontAwesome6, MaterialIcons } from '@expo/vector-icons' export default function TabLayout() { - const colorScheme = useColorScheme(); + const colorScheme = useColorScheme() return ( - ); + ) } diff --git a/client/app/(tabs)/index.tsx b/client/app/(tabs)/index.tsx index 3da84e8..ce7bb02 100644 --- a/client/app/(tabs)/index.tsx +++ b/client/app/(tabs)/index.tsx @@ -11,19 +11,7 @@ export default function MapScreen() { const [location, setLocation] = useState(null) const [locationAccessGranted, setLocationAccessGranted] = useState(false) - useEffect(() => { - async function watchPosition() { - let { status } = await Location.requestForegroundPermissionsAsync() - if (status !== 'granted') { - setLocationAccessGranted(false) - alert("Vous devez activer votre géolocalisation pour utiliser l'application.") - return - } - setLocationAccessGranted(true) - await Location.watchPositionAsync({accuracy: Location.Accuracy.BestForNavigation}, location => setLocation(location)) - } - watchPosition() - }, []) + return ( diff --git a/client/app/_layout.tsx b/client/app/_layout.tsx index 59134e4..e21c480 100644 --- a/client/app/_layout.tsx +++ b/client/app/_layout.tsx @@ -1,10 +1,69 @@ +import { Dispatch, useEffect, useState } from 'react' import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native' import { Stack } from "expo-router" import { useColorScheme } from '@/hooks/useColorScheme' import { StatusBar } from 'expo-status-bar' +import * as Location from 'expo-location' +import * as TaskManager from 'expo-task-manager' +import { Platform } from 'react-native' + +TaskManager.defineTask("fetch-geolocation", async ({ data, error }: any) => { + if (error) { + console.error(error) + return + } + const { locations } = data + for (let location of locations) { + console.log(location) + } + }) + +async function manageGelocation(setLocation: Dispatch) { + await Location.enableNetworkProviderAsync().catch(error => alert(error)) + const { status: foregroundStatus } = await Location.requestForegroundPermissionsAsync() + if (foregroundStatus === 'granted') { + setLocation(await Location.getLastKnownPositionAsync()) + const { status: backgroundStatus } = await Location.requestBackgroundPermissionsAsync() + if (backgroundStatus === 'granted') { + if (Platform.OS !== "web") { + if (!await Location.hasStartedLocationUpdatesAsync("fetch-geolocation")) { + await Location.startLocationUpdatesAsync("fetch-geolocation", { + accuracy: Location.Accuracy.BestForNavigation, + activityType: Location.ActivityType.OtherNavigation, + deferredUpdatesInterval: 100, + foregroundService: { + killServiceOnDestroy: false, + notificationBody: "Géolocalisation activée pour « Traintrape-moi »", + notificationTitle: "Traintrape-moi", + notificationColor: "#FFFF00", + } + }) + } + } + else { + await Location.watchPositionAsync({accuracy: Location.Accuracy.BestForNavigation}, location_nouveau => setLocation(location_nouveau)) + } + } + else { + alert("Vous devez activer votre géolocalisation en arrière-plan pour utiliser l'application.") + } + } + else { + alert("Vous devez activer votre géolocalisation pour utiliser l'application.") + } +} export default function RootLayout() { + const [location, setLocation] = useState(null) + useEffect(() => { + manageGelocation(setLocation) + return () => { + Location.stopLocationUpdatesAsync("fetch-geolocation") + } + }, []) + const colorScheme = useColorScheme() + return diff --git a/client/package-lock.json b/client/package-lock.json index dc72e9e..7c47d28 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -26,6 +26,7 @@ "expo-status-bar": "~2.0.0", "expo-symbols": "~0.2.0", "expo-system-ui": "~4.0.4", + "expo-task-manager": "^12.0.3", "expo-web-browser": "~14.0.1", "maplibre-gl": "^4.7.1", "maplibre-react-components": "^0.1.9", @@ -7838,6 +7839,19 @@ } } }, + "node_modules/expo-task-manager": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/expo-task-manager/-/expo-task-manager-12.0.3.tgz", + "integrity": "sha512-XNbDWPqBJw9kuWrYFhpcjRBbuxMUlgiFdEUHpm7VmMqGmm86UAZTO20zSGkM0U25yIcmQgsHiEbfV9B2S84dqA==", + "license": "MIT", + "dependencies": { + "unimodules-app-loader": "~5.0.0" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, "node_modules/expo-updates-interface": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-1.0.0.tgz", @@ -15348,6 +15362,12 @@ "node": ">=4" } }, + "node_modules/unimodules-app-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unimodules-app-loader/-/unimodules-app-loader-5.0.0.tgz", + "integrity": "sha512-0Zc3u344NmlvyQBmcgnxHcQhrLeFV4hn80U6S4YwAfaexXCWmiHOzMe4+P+YhgHiRWb5lJgadr08hLbee3XTHg==", + "license": "MIT" + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", diff --git a/client/package.json b/client/package.json index 86dab20..48ecd90 100644 --- a/client/package.json +++ b/client/package.json @@ -32,6 +32,7 @@ "expo-status-bar": "~2.0.0", "expo-symbols": "~0.2.0", "expo-system-ui": "~4.0.4", + "expo-task-manager": "^12.0.3", "expo-web-browser": "~14.0.1", "maplibre-gl": "^4.7.1", "maplibre-react-components": "^0.1.9",