✨ Nouvelles fonctionnalités: - Ajout du mode terrain pour utilisation mobile hors connexion - Génération automatique de reçus PDF avec template personnalisé - Révision complète du système de cartes avec amélioration des performances 🔧 Améliorations techniques: - Refactoring du module chat avec architecture simplifiée - Optimisation du système de sécurité NIST SP 800-63B - Amélioration de la gestion des secteurs géographiques - Support UTF-8 étendu pour les noms d'utilisateurs 📱 Application mobile: - Nouveau mode terrain dans user_field_mode_page - Interface utilisateur adaptative pour conditions difficiles - Synchronisation offline améliorée 🗺️ Cartographie: - Optimisation des performances MapBox - Meilleure gestion des tuiles hors ligne - Amélioration de l'affichage des secteurs 📄 Documentation: - Ajout guide Android (ANDROID-GUIDE.md) - Documentation sécurité API (API-SECURITY.md) - Guide module chat (CHAT_MODULE.md) 🐛 Corrections: - Résolution des erreurs 400 lors de la création d'utilisateurs - Correction de la validation des noms d'utilisateurs - Fix des problèmes de synchronisation chat 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
166 lines
5.8 KiB
Dart
Executable File
166 lines
5.8 KiB
Dart
Executable File
import 'dart:async';
|
|
import 'package:connectivity_plus/connectivity_plus.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/foundation.dart' show kIsWeb;
|
|
|
|
/// Service qui gère la surveillance de l'état de connectivité de l'appareil
|
|
class ConnectivityService extends ChangeNotifier {
|
|
final Connectivity _connectivity = Connectivity();
|
|
late StreamSubscription<List<ConnectivityResult>> _connectivitySubscription;
|
|
|
|
List<ConnectivityResult> _connectionStatus = [ConnectivityResult.none];
|
|
bool _isInitialized = false;
|
|
|
|
/// Indique si l'appareil est connecté à Internet
|
|
bool get isConnected {
|
|
// Vérifie si la liste contient au moins un type de connexion autre que 'none'
|
|
return _connectionStatus.any((result) => result != ConnectivityResult.none);
|
|
}
|
|
|
|
/// Indique si l'appareil est connecté via WiFi
|
|
bool get isWifi => _connectionStatus.contains(ConnectivityResult.wifi);
|
|
|
|
/// Indique si l'appareil est connecté via données mobiles (4G, 5G, etc.)
|
|
bool get isMobile => _connectionStatus.contains(ConnectivityResult.mobile);
|
|
|
|
/// Retourne le type de connexion actuel (WiFi, données mobiles, etc.)
|
|
List<ConnectivityResult> get connectionStatus => _connectionStatus;
|
|
|
|
/// Retourne le premier type de connexion actif (pour compatibilité avec l'ancien code)
|
|
ConnectivityResult get primaryConnectionStatus {
|
|
// Retourne le premier type de connexion qui n'est pas 'none', ou 'none' si tous sont 'none'
|
|
return _connectionStatus.firstWhere(
|
|
(result) => result != ConnectivityResult.none,
|
|
orElse: () => ConnectivityResult.none
|
|
);
|
|
}
|
|
|
|
/// Obtient une description textuelle du type de connexion
|
|
String get connectionType {
|
|
// Si aucune connexion n'est disponible
|
|
if (!isConnected) {
|
|
return 'Aucune connexion';
|
|
}
|
|
|
|
// Utiliser le premier type de connexion actif
|
|
ConnectivityResult primaryStatus = primaryConnectionStatus;
|
|
|
|
switch (primaryStatus) {
|
|
case ConnectivityResult.wifi:
|
|
return 'WiFi';
|
|
case ConnectivityResult.mobile:
|
|
return 'Données mobiles';
|
|
case ConnectivityResult.ethernet:
|
|
return 'Ethernet';
|
|
case ConnectivityResult.bluetooth:
|
|
return 'Bluetooth';
|
|
case ConnectivityResult.vpn:
|
|
return 'VPN';
|
|
case ConnectivityResult.none:
|
|
return 'Aucune connexion';
|
|
default:
|
|
return 'Inconnu';
|
|
}
|
|
}
|
|
|
|
/// Constructeur du service de connectivité
|
|
ConnectivityService() {
|
|
// Initialiser avec une connexion par défaut (supposée disponible)
|
|
// Ceci sera mis à jour rapidement par _initConnectivity()
|
|
if (kIsWeb) {
|
|
_connectionStatus = [ConnectivityResult.wifi];
|
|
} else {
|
|
// Sur mobile, on suppose qu'il y a au moins une connexion jusqu'à vérification
|
|
_connectionStatus = [ConnectivityResult.wifi];
|
|
}
|
|
_initConnectivity();
|
|
}
|
|
|
|
/// Initialise le service et commence à écouter les changements de connectivité
|
|
Future<void> _initConnectivity() async {
|
|
if (_isInitialized) return;
|
|
|
|
try {
|
|
// En version web, on considère par défaut que la connexion est disponible
|
|
// car la vérification de connectivité est moins fiable sur le web
|
|
if (kIsWeb) {
|
|
_connectionStatus = [ConnectivityResult.wifi]; // Valeur par défaut pour le web
|
|
} else {
|
|
_connectionStatus = await _connectivity.checkConnectivity();
|
|
}
|
|
|
|
// S'abonner aux changements de connectivité
|
|
_connectivitySubscription = _connectivity.onConnectivityChanged.listen(_updateConnectionStatus);
|
|
_isInitialized = true;
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de l\'initialisation du service de connectivité: $e');
|
|
|
|
// En cas d'erreur en version web, on suppose que la connexion est disponible
|
|
// car l'application web ne peut pas fonctionner sans connexion de toute façon
|
|
if (kIsWeb) {
|
|
_connectionStatus = [ConnectivityResult.wifi];
|
|
_isInitialized = true;
|
|
}
|
|
}
|
|
|
|
notifyListeners();
|
|
}
|
|
|
|
/// Met à jour l'état de la connexion lorsqu'il change
|
|
void _updateConnectionStatus(List<ConnectivityResult> results) {
|
|
// Vérifier si la liste des résultats a changé
|
|
bool hasChanged = false;
|
|
|
|
// Si les listes ont des longueurs différentes, elles sont différentes
|
|
if (_connectionStatus.length != results.length) {
|
|
hasChanged = true;
|
|
} else {
|
|
// Vérifier si les éléments sont différents
|
|
for (int i = 0; i < _connectionStatus.length; i++) {
|
|
if (i >= results.length || _connectionStatus[i] != results[i]) {
|
|
hasChanged = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (hasChanged) {
|
|
_connectionStatus = results;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
/// Vérifie manuellement l'état actuel de la connexion
|
|
Future<List<ConnectivityResult>> checkConnectivity() async {
|
|
try {
|
|
// En version web, on considère par défaut que la connexion est disponible
|
|
if (kIsWeb) {
|
|
// En version web, on peut tenter de faire une requête réseau légère pour vérifier la connectivité
|
|
// mais pour l'instant, on suppose que la connexion est disponible
|
|
final results = [ConnectivityResult.wifi];
|
|
_updateConnectionStatus(results);
|
|
return results;
|
|
} else {
|
|
// Version mobile - utiliser l'API standard
|
|
final results = await _connectivity.checkConnectivity();
|
|
_updateConnectionStatus(results);
|
|
return results;
|
|
}
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de la vérification de la connectivité: $e');
|
|
// En cas d'erreur, on conserve l'état actuel
|
|
return _connectionStatus;
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
try {
|
|
_connectivitySubscription.cancel();
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de l\'annulation de l\'abonnement de connectivité: $e');
|
|
}
|
|
super.dispose();
|
|
}
|
|
}
|