fix: Récupérer l'opération active depuis la table operations
- Corrige l'erreur SQL 'Unknown column fk_operation in users' - L'opération active est récupérée depuis operations.chk_active = 1 - Jointure avec users pour filtrer par entité de l'admin créateur - Query: SELECT o.id FROM operations o INNER JOIN users u ON u.fk_entite = o.fk_entite WHERE u.id = ? AND o.chk_active = 1
This commit is contained in:
@@ -78,11 +78,8 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
/// Effectue un nettoyage sélectif du cache
|
||||
/// Préserve la box pending_requests et les données critiques
|
||||
Future<void> _performSelectiveCleanup({bool manual = false}) async {
|
||||
debugPrint('🧹 === DÉBUT DU NETTOYAGE DU CACHE === 🧹');
|
||||
debugPrint('📌 Type: ${manual ? "MANUEL" : "AUTOMATIQUE"}');
|
||||
debugPrint('📱 Platform: ${kIsWeb ? "WEB" : "MOBILE"}');
|
||||
debugPrint('📦 Version actuelle: $_appVersion');
|
||||
|
||||
debugPrint('🧹 Nettoyage du cache (${manual ? "manuel" : "auto"})...');
|
||||
|
||||
try {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
@@ -94,27 +91,21 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
|
||||
// Étape 1: Nettoyer le Service Worker (Web uniquement)
|
||||
if (kIsWeb) {
|
||||
debugPrint('🔄 Nettoyage du Service Worker...');
|
||||
try {
|
||||
// Désenregistrer tous les service workers
|
||||
final registrations = await html.window.navigator.serviceWorker?.getRegistrations();
|
||||
if (registrations != null) {
|
||||
for (final registration in registrations) {
|
||||
await registration.unregister();
|
||||
debugPrint('✅ Service Worker désenregistré');
|
||||
}
|
||||
}
|
||||
|
||||
// Nettoyer les caches du navigateur
|
||||
if (html.window.caches != null) {
|
||||
final cacheNames = await html.window.caches!.keys();
|
||||
for (final cacheName in cacheNames) {
|
||||
await html.window.caches!.delete(cacheName);
|
||||
debugPrint('✅ Cache "$cacheName" supprimé');
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('⚠️ Erreur lors du nettoyage Service Worker: $e');
|
||||
debugPrint('⚠️ Erreur Service Worker: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,28 +117,20 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
}
|
||||
|
||||
// Étape 2: Sauvegarder les données critiques (pending_requests + app_version)
|
||||
debugPrint('💾 Sauvegarde des données critiques...');
|
||||
List<dynamic>? pendingRequests;
|
||||
String? savedAppVersion;
|
||||
try {
|
||||
// Sauvegarder pending_requests
|
||||
if (Hive.isBoxOpen(AppKeys.pendingRequestsBoxName)) {
|
||||
final pendingBox = Hive.box(AppKeys.pendingRequestsBoxName);
|
||||
pendingRequests = pendingBox.values.toList();
|
||||
debugPrint('📊 ${pendingRequests.length} requêtes en attente sauvegardées');
|
||||
await pendingBox.close();
|
||||
}
|
||||
|
||||
// Sauvegarder app_version pour éviter de perdre l'info de version
|
||||
if (Hive.isBoxOpen(AppKeys.settingsBoxName)) {
|
||||
final settingsBox = Hive.box(AppKeys.settingsBoxName);
|
||||
savedAppVersion = settingsBox.get('app_version') as String?;
|
||||
if (savedAppVersion != null) {
|
||||
debugPrint('📦 Version sauvegardée: $savedAppVersion');
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('⚠️ Erreur lors de la sauvegarde: $e');
|
||||
debugPrint('⚠️ Erreur sauvegarde données critiques: $e');
|
||||
}
|
||||
|
||||
if (mounted) {
|
||||
@@ -173,17 +156,14 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
];
|
||||
|
||||
// Étape 4: Fermer et supprimer les boxes
|
||||
debugPrint('🗑️ Nettoyage des boxes Hive...');
|
||||
for (final boxName in boxesToClean) {
|
||||
try {
|
||||
if (Hive.isBoxOpen(boxName)) {
|
||||
await Hive.box(boxName).close();
|
||||
debugPrint('📦 Box "$boxName" fermée');
|
||||
}
|
||||
await Hive.deleteBoxFromDisk(boxName);
|
||||
debugPrint('✅ Box "$boxName" supprimée');
|
||||
} catch (e) {
|
||||
debugPrint('⚠️ Erreur lors du nettoyage de "$boxName": $e');
|
||||
debugPrint('⚠️ Erreur nettoyage box "$boxName": $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,27 +175,21 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
}
|
||||
|
||||
// Étape 5: Réinitialiser Hive proprement
|
||||
debugPrint('🔄 Réinitialisation de Hive...');
|
||||
await Hive.close();
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
await Hive.initFlutter();
|
||||
|
||||
// Étape 6: Restaurer les données critiques
|
||||
if (pendingRequests != null && pendingRequests.isNotEmpty) {
|
||||
debugPrint('♻️ Restauration des requêtes en attente...');
|
||||
final pendingBox = await Hive.openBox(AppKeys.pendingRequestsBoxName);
|
||||
for (final request in pendingRequests) {
|
||||
await pendingBox.add(request);
|
||||
}
|
||||
debugPrint('✅ ${pendingRequests.length} requêtes restaurées');
|
||||
}
|
||||
|
||||
// Restaurer app_version pour maintenir la détection de changement de version
|
||||
if (savedAppVersion != null) {
|
||||
debugPrint('♻️ Restauration de la version...');
|
||||
final settingsBox = await Hive.openBox(AppKeys.settingsBoxName);
|
||||
await settingsBox.put('app_version', savedAppVersion);
|
||||
debugPrint('✅ Version restaurée: $savedAppVersion');
|
||||
}
|
||||
|
||||
if (mounted) {
|
||||
@@ -225,7 +199,7 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
});
|
||||
}
|
||||
|
||||
debugPrint('🎉 === NETTOYAGE TERMINÉ AVEC SUCCÈS === 🎉');
|
||||
debugPrint('✅ Nettoyage du cache terminé');
|
||||
|
||||
// Petit délai pour voir le message de succès
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
@@ -238,7 +212,7 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
debugPrint('❌ ERREUR CRITIQUE lors du nettoyage: $e');
|
||||
debugPrint('❌ Erreur nettoyage cache: $e');
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isCleaningCache = false;
|
||||
@@ -260,45 +234,29 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
/// Réinitialise le cache de tous les repositories après nettoyage complet
|
||||
void _resetAllRepositoriesCache() {
|
||||
try {
|
||||
debugPrint('🔄 === RESET DU CACHE DES REPOSITORIES === 🔄');
|
||||
|
||||
// Reset du cache des 3 repositories qui utilisent le pattern de cache
|
||||
passageRepository.resetCache();
|
||||
sectorRepository.resetCache();
|
||||
membreRepository.resetCache();
|
||||
|
||||
debugPrint('✅ Cache de tous les repositories réinitialisé');
|
||||
} catch (e) {
|
||||
debugPrint('⚠️ Erreur lors du reset des caches: $e');
|
||||
// Ne pas faire échouer le processus si le reset échoue
|
||||
debugPrint('⚠️ Erreur reset caches repositories: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// Détecte et gère le refresh (F5) avec session existante
|
||||
/// Retourne true si une session a été restaurée, false sinon
|
||||
Future<bool> _handleSessionRefreshIfNeeded() async {
|
||||
if (!kIsWeb) {
|
||||
debugPrint('📱 Plateforme mobile - pas de gestion F5');
|
||||
return false;
|
||||
}
|
||||
if (!kIsWeb) return false;
|
||||
|
||||
try {
|
||||
debugPrint('🔍 Vérification d\'une session existante (F5)...');
|
||||
|
||||
// Charger l'utilisateur depuis Hive
|
||||
await CurrentUserService.instance.loadFromHive();
|
||||
|
||||
final isLoggedIn = CurrentUserService.instance.isLoggedIn;
|
||||
final displayMode = CurrentUserService.instance.displayMode;
|
||||
final sessionId = CurrentUserService.instance.sessionId;
|
||||
|
||||
if (!isLoggedIn || sessionId == null) {
|
||||
debugPrint('ℹ️ Aucune session active - affichage normal de la splash');
|
||||
return false;
|
||||
}
|
||||
if (!isLoggedIn || sessionId == null) return false;
|
||||
|
||||
debugPrint('🔄 Session active détectée - mode: $displayMode');
|
||||
debugPrint('🔄 Rechargement des données depuis l\'API...');
|
||||
debugPrint('🔄 Session active détectée, restauration...');
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
@@ -312,9 +270,6 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
|
||||
// Appeler le nouvel endpoint API pour restaurer la session
|
||||
// IMPORTANT: Utiliser getWithoutQueue() pour ne JAMAIS mettre cette requête en file d'attente
|
||||
// Les refresh de session sont liés à une session spécifique et ne doivent pas être rejoués
|
||||
debugPrint('🔄 Appel API: user/session avec sessionId: ${sessionId.substring(0, 10)}...');
|
||||
|
||||
final response = await ApiService.instance.getWithoutQueue(
|
||||
'user/session',
|
||||
queryParameters: {'mode': displayMode},
|
||||
@@ -327,10 +282,7 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
if (response.data is String) {
|
||||
final dataStr = response.data as String;
|
||||
if (dataStr.contains('<!DOCTYPE') || dataStr.contains('<html')) {
|
||||
debugPrint('❌ ERREUR: L\'API a retourné du HTML au lieu de JSON !');
|
||||
debugPrint('❌ StatusCode: $statusCode');
|
||||
debugPrint('❌ URL de base: ${ApiService.instance.baseUrl}');
|
||||
debugPrint('❌ Début de la réponse: ${dataStr.substring(0, 100)}...');
|
||||
debugPrint('❌ L\'API a retourné du HTML au lieu de JSON');
|
||||
await CurrentUserService.instance.clearUser();
|
||||
return false;
|
||||
}
|
||||
@@ -340,15 +292,12 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
|
||||
switch (statusCode) {
|
||||
case 200:
|
||||
// Succès - traiter les données
|
||||
if (data == null || data['success'] != true) {
|
||||
debugPrint('❌ Format de réponse invalide (200 mais pas success=true)');
|
||||
debugPrint('❌ Format de réponse session invalide');
|
||||
await CurrentUserService.instance.clearUser();
|
||||
return false;
|
||||
}
|
||||
|
||||
debugPrint('✅ Données reçues de l\'API, traitement...');
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_statusMessage = "Chargement de vos données...";
|
||||
@@ -356,7 +305,6 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
});
|
||||
}
|
||||
|
||||
// Traiter les données avec DataLoadingService
|
||||
final apiData = data['data'] as Map<String, dynamic>?;
|
||||
if (apiData == null) {
|
||||
debugPrint('❌ Données manquantes dans la réponse');
|
||||
@@ -365,11 +313,9 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
}
|
||||
|
||||
await DataLoadingService.instance.processLoginData(apiData);
|
||||
debugPrint('✅ Session restaurée avec succès');
|
||||
break;
|
||||
|
||||
case 400:
|
||||
// Paramètre mode invalide - erreur technique
|
||||
debugPrint('❌ Paramètre mode invalide: $displayMode');
|
||||
await CurrentUserService.instance.clearUser();
|
||||
if (mounted) {
|
||||
@@ -380,8 +326,7 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
return false;
|
||||
|
||||
case 401:
|
||||
// Session invalide ou expirée
|
||||
debugPrint('⚠️ Session invalide ou expirée');
|
||||
debugPrint('⚠️ Session expirée');
|
||||
await CurrentUserService.instance.clearUser();
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
@@ -391,9 +336,8 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
return false;
|
||||
|
||||
case 403:
|
||||
// Accès interdit (membre → admin) ou entité inactive
|
||||
final message = data?['message'] ?? 'Accès interdit';
|
||||
debugPrint('🚫 Accès interdit: $message');
|
||||
debugPrint('❌ Accès interdit: $message');
|
||||
await CurrentUserService.instance.clearUser();
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
@@ -410,7 +354,6 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
return false;
|
||||
|
||||
case 500:
|
||||
// Erreur serveur
|
||||
final message = data?['message'] ?? 'Erreur serveur';
|
||||
debugPrint('❌ Erreur serveur: $message');
|
||||
if (mounted) {
|
||||
@@ -425,11 +368,9 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
),
|
||||
);
|
||||
}
|
||||
// Ne pas effacer la session en cas d'erreur serveur
|
||||
return false;
|
||||
|
||||
default:
|
||||
// Code de retour inattendu
|
||||
debugPrint('❌ Code HTTP inattendu: $statusCode');
|
||||
await CurrentUserService.instance.clearUser();
|
||||
return false;
|
||||
@@ -449,12 +390,11 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
if (!mounted) return true;
|
||||
|
||||
if (displayMode == 'admin') {
|
||||
debugPrint('🔀 Redirection vers interface admin');
|
||||
context.go('/admin/home');
|
||||
} else {
|
||||
debugPrint('🔀 Redirection vers interface user');
|
||||
context.go('/user/field-mode');
|
||||
}
|
||||
debugPrint('✅ Session restaurée → $displayMode');
|
||||
|
||||
return true;
|
||||
|
||||
@@ -477,53 +417,32 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
|
||||
/// Vérifie si une nouvelle version est disponible et nettoie si nécessaire
|
||||
Future<void> _checkVersionAndCleanIfNeeded() async {
|
||||
if (!kIsWeb) {
|
||||
debugPrint('📱 Plateforme mobile - pas de nettoyage automatique');
|
||||
return;
|
||||
}
|
||||
if (!kIsWeb) return;
|
||||
|
||||
try {
|
||||
String lastVersion = '';
|
||||
|
||||
// Lire la version depuis Hive settings
|
||||
if (Hive.isBoxOpen(AppKeys.settingsBoxName)) {
|
||||
final settingsBox = Hive.box(AppKeys.settingsBoxName);
|
||||
lastVersion = settingsBox.get('app_version', defaultValue: '') as String;
|
||||
}
|
||||
|
||||
debugPrint('🔍 Vérification de version:');
|
||||
debugPrint(' Version stockée: $lastVersion');
|
||||
debugPrint(' Version actuelle: $_appVersion');
|
||||
|
||||
// Si changement de version détecté
|
||||
if (lastVersion.isNotEmpty && lastVersion != _appVersion) {
|
||||
debugPrint('🆕 NOUVELLE VERSION DÉTECTÉE !');
|
||||
debugPrint(' Migration de $lastVersion vers $_appVersion');
|
||||
|
||||
debugPrint('🆕 Nouvelle version: $lastVersion → $_appVersion');
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_statusMessage = "Nouvelle version détectée, mise à jour...";
|
||||
});
|
||||
}
|
||||
|
||||
// Effectuer le nettoyage automatique
|
||||
await _performSelectiveCleanup(manual: false);
|
||||
|
||||
// Reset du cache des repositories après nettoyage
|
||||
_resetAllRepositoriesCache();
|
||||
} else if (lastVersion.isEmpty) {
|
||||
// Première installation
|
||||
debugPrint('🎉 Première installation détectée');
|
||||
if (Hive.isBoxOpen(AppKeys.settingsBoxName)) {
|
||||
final settingsBox = Hive.box(AppKeys.settingsBoxName);
|
||||
await settingsBox.put('app_version', _appVersion);
|
||||
debugPrint('💾 Version initiale sauvegardée dans Hive: $_appVersion');
|
||||
}
|
||||
} else {
|
||||
debugPrint('✅ Même version - pas de nettoyage nécessaire');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('⚠️ Erreur lors de la vérification de version: $e');
|
||||
debugPrint('⚠️ Erreur vérification version: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -560,7 +479,7 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
|
||||
void _startInitialization() async {
|
||||
try {
|
||||
debugPrint('🚀 Début de l\'initialisation complète de l\'application...');
|
||||
debugPrint('🚀 Initialisation de l\'application...');
|
||||
|
||||
// Étape 1: Vérification des permissions GPS (obligatoire) - 0 à 10%
|
||||
if (!kIsWeb) {
|
||||
@@ -577,7 +496,6 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
final errorMessage = await LocationService.getLocationErrorMessage();
|
||||
|
||||
if (!hasPermission) {
|
||||
// Si les permissions ne sont pas accordées, on arrête tout
|
||||
debugPrint('❌ Permissions GPS refusées');
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
@@ -616,10 +534,7 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
}
|
||||
|
||||
// === GESTION F5 WEB : Vérifier session AVANT de détruire les données ===
|
||||
// Sur Web, on essaie d'abord de récupérer une session existante
|
||||
if (kIsWeb) {
|
||||
debugPrint('🌐 Web détecté - tentative de récupération de session existante...');
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_statusMessage = "Vérification de session...";
|
||||
@@ -627,12 +542,9 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
});
|
||||
}
|
||||
|
||||
// Initialisation légère qui préserve les données
|
||||
final hasExistingSession = await HiveService.instance.initializeWithoutReset();
|
||||
|
||||
if (hasExistingSession) {
|
||||
debugPrint('✅ Session existante détectée, tentative de restauration...');
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_statusMessage = "Restauration de la session...";
|
||||
@@ -640,17 +552,8 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
});
|
||||
}
|
||||
|
||||
// Tenter la restauration via l'API
|
||||
final sessionRestored = await _handleSessionRefreshIfNeeded();
|
||||
if (sessionRestored) {
|
||||
debugPrint('✅ Session restaurée via F5 - fin de l\'initialisation');
|
||||
return;
|
||||
}
|
||||
|
||||
// Si la restauration API échoue, on continue vers le login
|
||||
debugPrint('⚠️ Restauration API échouée, passage au login normal');
|
||||
} else {
|
||||
debugPrint('ℹ️ Pas de session existante, initialisation normale');
|
||||
if (sessionRestored) return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -689,22 +592,11 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
|
||||
// Gérer la box pending_requests séparément pour préserver les données
|
||||
try {
|
||||
debugPrint('📦 Gestion de la box pending_requests...');
|
||||
if (!Hive.isBoxOpen(AppKeys.pendingRequestsBoxName)) {
|
||||
// Importer PendingRequest si nécessaire
|
||||
final pendingRequestBox = await Hive.openBox(AppKeys.pendingRequestsBoxName);
|
||||
final pendingCount = pendingRequestBox.length;
|
||||
if (pendingCount > 0) {
|
||||
debugPrint('⏳ $pendingCount requêtes en attente trouvées dans la box');
|
||||
} else {
|
||||
debugPrint('✅ Box pending_requests ouverte (vide)');
|
||||
}
|
||||
} else {
|
||||
debugPrint('✅ Box pending_requests déjà ouverte');
|
||||
await Hive.openBox(AppKeys.pendingRequestsBoxName);
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('⚠️ Erreur lors de l\'ouverture de la box pending_requests: $e');
|
||||
// On continue quand même, ce n'est pas critique pour le démarrage
|
||||
debugPrint('⚠️ Erreur ouverture pending_requests: $e');
|
||||
}
|
||||
|
||||
if (mounted) {
|
||||
@@ -717,8 +609,7 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
// Étape 4: Vérification finale - 80 à 95%
|
||||
final allBoxesOpen = HiveService.instance.areAllBoxesOpen();
|
||||
if (!allBoxesOpen) {
|
||||
final diagnostic = HiveService.instance.getDiagnostic();
|
||||
debugPrint('❌ Diagnostic des Box: $diagnostic');
|
||||
debugPrint('❌ Erreur: certaines boxes Hive non ouvertes');
|
||||
throw Exception('Une erreur est survenue lors de l\'initialisation');
|
||||
}
|
||||
|
||||
@@ -744,10 +635,9 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
final settingsBox = Hive.box(AppKeys.settingsBoxName);
|
||||
await settingsBox.put('hive_initialized', true);
|
||||
await settingsBox.put('hive_initialized_at', DateTime.now().toIso8601String());
|
||||
debugPrint('✅ Clé hive_initialized définie à true dans settings');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('⚠️ Impossible de définir la clé hive_initialized: $e');
|
||||
debugPrint('⚠️ Erreur hive_initialized: $e');
|
||||
}
|
||||
|
||||
// Attendre un court instant pour que l'utilisateur voie "Application prête !"
|
||||
@@ -761,39 +651,59 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
if (widget.action != null) {
|
||||
await _handleAutoRedirect();
|
||||
} else {
|
||||
setState(() {
|
||||
_showButtons = true;
|
||||
});
|
||||
// Sur mobile natif ou petit écran, rediriger directement vers connexion utilisateur
|
||||
// L'interface admin n'est disponible que sur Web avec grand écran
|
||||
if (mounted) {
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
final isSmallScreen = screenWidth < 600;
|
||||
|
||||
if (!kIsWeb || isSmallScreen) {
|
||||
context.go('/login/user');
|
||||
} else {
|
||||
setState(() {
|
||||
_showButtons = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debugPrint('✅ Initialisation complète de l\'application terminée avec succès');
|
||||
debugPrint('✅ Initialisation terminée');
|
||||
} catch (e) {
|
||||
debugPrint('❌ Erreur lors de l\'initialisation: $e');
|
||||
debugPrint('❌ Erreur initialisation: $e');
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_statusMessage = "Erreur de chargement - Veuillez redémarrer l'application";
|
||||
_progress = 1.0;
|
||||
_isInitializing = false;
|
||||
_showButtons = true;
|
||||
});
|
||||
|
||||
// Sur mobile natif ou petit écran, rediriger vers connexion utilisateur même en cas d'erreur
|
||||
// L'interface admin n'est disponible que sur Web avec grand écran
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
final isSmallScreen = screenWidth < 600;
|
||||
|
||||
if (!kIsWeb || isSmallScreen) {
|
||||
context.go('/login/user');
|
||||
} else {
|
||||
setState(() {
|
||||
_showButtons = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Gère la redirection automatique après l'initialisation
|
||||
Future<void> _handleAutoRedirect() async {
|
||||
// Petit délai pour voir le message "Application prête !"
|
||||
await Future.delayed(const Duration(milliseconds: 300));
|
||||
|
||||
|
||||
if (!mounted) return;
|
||||
|
||||
final action = widget.action?.toLowerCase();
|
||||
final type = widget.type?.toLowerCase();
|
||||
|
||||
debugPrint('🔄 Redirection automatique: action=$action, type=$type');
|
||||
|
||||
// Afficher un message de redirection avant de naviguer
|
||||
setState(() {
|
||||
_statusMessage = action == 'login'
|
||||
@@ -805,8 +715,8 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
|
||||
await Future.delayed(const Duration(milliseconds: 200));
|
||||
|
||||
if (!context.mounted) return;
|
||||
|
||||
if (!mounted) return;
|
||||
|
||||
switch (action) {
|
||||
case 'login':
|
||||
if (type == 'admin') {
|
||||
@@ -1227,7 +1137,6 @@ class _SplashPageState extends State<SplashPage> with SingleTickerProviderStateM
|
||||
);
|
||||
|
||||
if (confirm == true) {
|
||||
debugPrint('👤 Utilisateur a demandé un nettoyage manuel');
|
||||
await _performSelectiveCleanup(manual: true);
|
||||
|
||||
// Reset du cache des repositories après nettoyage
|
||||
|
||||
Reference in New Issue
Block a user