import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart' show kIsWeb; import 'package:geosector_app/core/theme/app_theme.dart'; import 'package:go_router/go_router.dart'; import 'package:geosector_app/core/services/api_service.dart'; import 'package:geosector_app/core/repositories/user_repository.dart'; import 'package:geosector_app/core/repositories/operation_repository.dart'; import 'package:geosector_app/core/repositories/passage_repository.dart'; import 'package:geosector_app/core/repositories/sector_repository.dart'; import 'package:geosector_app/core/repositories/membre_repository.dart'; import 'package:geosector_app/core/repositories/amicale_repository.dart'; import 'package:geosector_app/core/services/sync_service.dart'; import 'package:geosector_app/core/services/connectivity_service.dart'; import 'package:geosector_app/presentation/auth/splash_page.dart'; import 'package:geosector_app/presentation/auth/login_page.dart'; import 'package:geosector_app/presentation/auth/register_page.dart'; import 'package:geosector_app/presentation/admin/admin_dashboard_page.dart'; import 'package:geosector_app/presentation/user/user_dashboard_page.dart'; // Instances globales des services et repositories final apiService = ApiService(); final operationRepository = OperationRepository(apiService); final passageRepository = PassageRepository(apiService); final userRepository = UserRepository(apiService); final sectorRepository = SectorRepository(apiService); final membreRepository = MembreRepository(apiService); final amicaleRepository = AmicaleRepository(apiService); final syncService = SyncService(userRepository: userRepository); final connectivityService = ConnectivityService(); class GeoSectorApp extends StatelessWidget { const GeoSectorApp({super.key}); @override Widget build(BuildContext context) { // Utiliser directement le router sans provider final router = GoRouter( initialLocation: '/', debugLogDiagnostics: true, refreshListenable: userRepository, // Écouter les changements d'état d'authentification // Gestionnaire de redirection global - intercepte toutes les navigations redirect: (context, state) { // Détection manuelle des paramètres d'URL pour le Web if (kIsWeb && state.uri.path == '/login') { try { // Obtenir le paramètre 'type' de l'URL actuelle final typeParam = state.uri.queryParameters['type']; // Obtenir l'URL brute du navigateur pour comparer final rawUri = Uri.parse(Uri.base.toString()); final rawTypeParam = rawUri.queryParameters['type']; print('APP ROUTER: state.uri = ${state.uri}, type = $typeParam'); print('APP ROUTER: rawUri = $rawUri, type = $rawTypeParam'); // Pas de redirection si on a déjà le paramètre type if (typeParam != null) { print('APP ROUTER: Param type déjà présent, pas de redirection'); return null; // Pas de redirection } // Si un paramètre type=user est présent dans l'URL brute mais pas dans l'état if (rawTypeParam == 'user' && typeParam == null) { print( 'APP ROUTER: Paramètre détecté dans l\'URL brute, redirection vers /login?type=user'); return '/login?type=user'; } } catch (e) { print('Erreur lors de la récupération des paramètres d\'URL: $e'); } } // Sauvegarder le chemin actuel pour l'utilisateur connecté, sauf pour la page de splash if (state.uri.toString() != '/' && userRepository.isLoggedIn) { // Ne pas sauvegarder les chemins de login/register if (!state.uri.toString().startsWith('/login') && !state.uri.toString().startsWith('/register')) { userRepository.updateLastPath(state.uri.toString()); } } // Vérifier si l'utilisateur est sur la page de splash if (state.uri.toString() == '/') { // Laisser l'utilisateur sur la page de splash, la redirection sera gérée par SplashPage return null; } // Vérifier si l'utilisateur est sur une page d'authentification final isLoggedIn = userRepository.isLoggedIn; final isOnLoginPage = state.uri.toString().startsWith('/login'); final isOnRegisterPage = state.uri.toString() == '/register'; final isOnAdminRegisterPage = state.uri.toString() == '/admin-register'; // Si l'utilisateur n'est pas connecté et n'est pas sur une page d'authentification, rediriger vers la page de connexion if (!isLoggedIn && !isOnLoginPage && !isOnRegisterPage && !isOnAdminRegisterPage) { return '/login'; } // Si l'utilisateur est connecté et se trouve sur une page d'authentification, rediriger vers le tableau de bord approprié if (isLoggedIn && (isOnLoginPage || isOnRegisterPage || isOnAdminRegisterPage)) { // Récupérer le rôle de l'utilisateur directement final user = userRepository.getCurrentUser(); if (user != null) { // Convertir le rôle en int si nécessaire int roleValue; if (user.role is String) { roleValue = int.tryParse(user.role as String) ?? 1; } else { roleValue = user.role as int; } // Redirection simple basée sur le rôle if (roleValue > 1) { debugPrint( 'Router: Redirection vers /admin (rôle $roleValue > 1)'); return '/admin'; } else { debugPrint( 'Router: Redirection vers /user (rôle $roleValue = 1)'); return '/user'; } } } // Si l'utilisateur est connecté mais essaie d'accéder à la mauvaise page selon son rôle if (isLoggedIn) { final user = userRepository.getCurrentUser(); if (user != null) { // Convertir le rôle en int si nécessaire int roleValue; if (user.role is String) { roleValue = int.tryParse(user.role as String) ?? 1; } else { roleValue = user.role as int; } // Vérifier si l'utilisateur est sur la bonne page en fonction de son rôle final isOnUserPage = state.uri.toString().startsWith('/user'); final isOnAdminPage = state.uri.toString().startsWith('/admin'); // Admin (rôle > 1) essayant d'accéder à une page utilisateur if (roleValue > 1 && isOnUserPage) { debugPrint( 'Router: Redirection d\'admin (rôle $roleValue) vers /admin'); return '/admin'; } // Utilisateur standard (rôle = 1) essayant d'accéder à une page admin if (roleValue == 1 && isOnAdminPage) { debugPrint( 'Router: Redirection d\'utilisateur (rôle $roleValue) vers /user'); return '/user'; } } } return null; }, routes: [ // Splash screen GoRoute( path: '/', builder: (context, state) => const SplashPage(), ), // Page de connexion utilisateur dédiée GoRoute( path: '/login/user', builder: (context, state) { print('ROUTER: Accès direct à la route login user'); return const LoginPage( key: Key('login_page_user'), loginType: 'user', ); }, ), // Pages d'authentification standard GoRoute( path: '/login', builder: (context, state) { // Ajouter des logs de débogage détaillés pour comprendre les paramètres print('ROUTER DEBUG: Uri complète = ${state.uri}'); print('ROUTER DEBUG: Path = ${state.uri.path}'); print('ROUTER DEBUG: Query params = ${state.uri.queryParameters}'); print( 'ROUTER DEBUG: Has type? ${state.uri.queryParameters.containsKey("type")}'); // Donner la priorité aux paramètres d'URL puis aux extras String? loginType; // 1. Essayer d'abord les paramètres d'URL (pour les liens externes) final queryParams = state.uri.queryParameters; loginType = queryParams['type']; print('ROUTER DEBUG: Type from query params = $loginType'); // 2. Si aucun type dans les paramètres d'URL, vérifier les extras (pour la navigation interne) if (loginType == null && state.extra != null && state.extra is Map) { final extras = state.extra as Map; loginType = extras['type']?.toString(); print('ROUTER DEBUG: Type from extras = $loginType'); } // 3. Normaliser et valider le type if (loginType != null) { loginType = loginType.trim().toLowerCase(); // Vérifier explicitement que c'est 'user', sinon mettre 'admin' if (loginType != 'user') { loginType = 'admin'; } } else { // Si aucun type n'est spécifié, retourner la page de splash print( 'ROUTER: Aucun type spécifié, utilisation de la page splash'); return const SplashPage(); } print('ROUTER: Type de connexion final: $loginType'); return LoginPage( key: Key('login_page_${loginType}'), loginType: loginType, ); }, ), GoRoute( path: '/register', builder: (context, state) => const RegisterPage(), ), // Pages administrateur GoRoute( path: '/admin', builder: (context, state) => const AdminDashboardPage(), routes: [ // Ajouter d'autres routes admin ici ], ), // Pages utilisateur GoRoute( path: '/user', builder: (context, state) => const UserDashboardPage(), routes: [ // Ajouter d'autres routes utilisateur ici ], ), ], ); return MaterialApp.router( debugShowCheckedModeBanner: false, title: 'GEOSECTOR', theme: AppTheme.lightTheme, darkTheme: AppTheme.darkTheme, themeMode: ThemeMode.system, routerConfig: router, ); } }