import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart' show kIsWeb; import 'package:geolocator/geolocator.dart'; import 'package:latlong2/latlong.dart'; /// Service de géolocalisation pour gérer les permissions et l'accès à la position class LocationService { /// Vérifie si les services de localisation sont activés static Future isLocationServiceEnabled() async { // En version web, on considère que les services de localisation sont toujours activés // car la vérification est gérée différemment par le navigateur if (kIsWeb) { return true; } return await Geolocator.isLocationServiceEnabled(); } /// Vérifie et demande les permissions de localisation /// Retourne true si l'autorisation est accordée, false sinon static Future checkAndRequestPermission() async { // En version web, on considère que les permissions sont toujours accordées // car la gestion des permissions est différente et gérée par le navigateur if (kIsWeb) { return true; } try { // Vérifier si les services de localisation sont activés bool serviceEnabled = await isLocationServiceEnabled(); if (!serviceEnabled) { // Les services de localisation ne sont pas activés, on ne peut pas demander la permission return false; } // Vérifier le statut actuel de la permission LocationPermission permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { // Demander la permission permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { // La permission a été refusée return false; } } if (permission == LocationPermission.deniedForever) { // La permission a été refusée définitivement return false; } // La permission est accordée (whileInUse ou always) return true; } catch (e) { debugPrint('Erreur lors de la vérification des permissions de localisation: $e'); // En cas d'erreur, on retourne false pour être sûr return false; } } /// Obtient la position actuelle de l'utilisateur /// Retourne null si la position ne peut pas être obtenue static Future getCurrentPosition() async { try { // En version web, la géolocalisation fonctionne différemment // et peut être bloquée par le navigateur si le site n'est pas en HTTPS if (kIsWeb) { try { Position position = await Geolocator.getCurrentPosition( locationSettings: const LocationSettings( accuracy: LocationAccuracy.high, ), ); return LatLng(position.latitude, position.longitude); } catch (e) { debugPrint('Erreur lors de l\'obtention de la position en version web: $e'); // En version web, en cas d'erreur, on peut retourner une position par défaut // ou null selon les besoins de l'application return null; } } // Version mobile // Vérifier si l'autorisation est accordée bool hasPermission = await checkAndRequestPermission(); if (!hasPermission) { return null; } // Obtenir la position actuelle Position position = await Geolocator.getCurrentPosition( locationSettings: const LocationSettings( accuracy: LocationAccuracy.high, ), ); return LatLng(position.latitude, position.longitude); } catch (e) { debugPrint('Erreur lors de l\'obtention de la position: $e'); return null; } } /// Vérifie si l'application peut accéder à la position de l'utilisateur /// Retourne un message d'erreur si l'accès n'est pas possible, null sinon static Future getLocationErrorMessage() async { // En version web, on considère qu'il n'y a pas d'erreur de localisation // car la gestion des permissions est gérée par le navigateur if (kIsWeb) { return null; } try { // Vérifier si les services de localisation sont activés bool serviceEnabled = await isLocationServiceEnabled(); if (!serviceEnabled) { return 'Les services de localisation sont désactivés. Veuillez les activer dans les paramètres de votre appareil.'; } // Vérifier le statut actuel de la permission LocationPermission permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { return 'L\'accès à la localisation a été refusé. Cette application ne peut pas fonctionner sans cette autorisation.'; } if (permission == LocationPermission.deniedForever) { return 'L\'accès à la localisation a été définitivement refusé. Veuillez l\'autoriser dans les paramètres de votre appareil.'; } return null; // Pas d'erreur } catch (e) { debugPrint('Erreur lors de la vérification des erreurs de localisation: $e'); // En cas d'erreur, on retourne null pour ne pas bloquer l'application return null; } } /// Ouvre les paramètres de l'application pour permettre à l'utilisateur de modifier les autorisations static Future openAppSettings() async { // En version web, cette fonctionnalité n'est pas disponible if (kIsWeb) { debugPrint('Ouverture des paramètres de l\'application non disponible en version web'); return; } try { await Geolocator.openAppSettings(); } catch (e) { debugPrint('Erreur lors de l\'ouverture des paramètres de l\'application: $e'); } } /// Ouvre les paramètres de localisation de l'appareil static Future openLocationSettings() async { // En version web, cette fonctionnalité n'est pas disponible if (kIsWeb) { debugPrint('Ouverture des paramètres de localisation non disponible en version web'); return; } try { await Geolocator.openLocationSettings(); } catch (e) { debugPrint('Erreur lors de l\'ouverture des paramètres de localisation: $e'); } } }