traintrape-moi/client/app/_layout.tsx

75 lines
2.7 KiB
TypeScript
Raw Normal View History

2024-12-06 18:00:51 +00:00
import { Dispatch, useEffect, useState } from 'react'
2024-12-01 11:29:47 +00:00
import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'
import { Stack } from "expo-router"
import { useColorScheme } from '@/hooks/useColorScheme'
import { StatusBar } from 'expo-status-bar'
2024-12-06 18:00:51 +00:00
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<Location.LocationObject | null>) {
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.")
}
}
2024-12-01 11:29:47 +00:00
export default function RootLayout() {
2024-12-06 18:00:51 +00:00
const [location, setLocation] = useState<Location.LocationObject | null>(null)
useEffect(() => {
manageGelocation(setLocation)
return () => {
Location.stopLocationUpdatesAsync("fetch-geolocation")
}
}, [])
2024-12-01 11:29:47 +00:00
const colorScheme = useColorScheme()
2024-12-06 18:00:51 +00:00
2024-12-01 11:29:47 +00:00
return <ThemeProvider value={colorScheme === 'dark' ? DarkTheme : DefaultTheme}>
<Stack>
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
<Stack.Screen name="+not-found" />
</Stack>
<StatusBar style="auto" />
2024-12-01 11:29:47 +00:00
</ThemeProvider>
}