import 'package:flutter/material.dart'; import 'package:geosector_app/presentation/widgets/dashboard_app_bar.dart'; import 'package:geosector_app/presentation/widgets/responsive_navigation.dart'; import 'package:geosector_app/core/theme/app_theme.dart'; // Pour les couleurs du thème /// Layout commun pour les tableaux de bord utilisateur et administrateur /// Combine DashboardAppBar et ResponsiveNavigation class DashboardLayout extends StatelessWidget { /// Le contenu principal à afficher final Widget body; /// Le titre de la page final String title; /// L'index de la page sélectionnée final int selectedIndex; /// Callback appelé lorsqu'un élément de navigation est sélectionné final Function(int) onDestinationSelected; /// Liste des destinations de navigation final List destinations; /// Actions supplémentaires à afficher dans l'AppBar final List? additionalActions; /// Widgets à afficher en bas de la sidebar final List? sidebarBottomItems; /// Indique si l'utilisateur est un administrateur final bool isAdmin; /// Callback appelé lorsque le bouton de déconnexion est pressé final VoidCallback? onLogoutPressed; const DashboardLayout({ super.key, required this.body, required this.title, required this.selectedIndex, required this.onDestinationSelected, required this.destinations, this.additionalActions, this.sidebarBottomItems, this.isAdmin = false, this.onLogoutPressed, }); @override Widget build(BuildContext context) { try { debugPrint('Building DashboardLayout'); // Vérifier que les destinations ne sont pas vides if (destinations.isEmpty) { debugPrint('ERREUR: destinations est vide dans DashboardLayout'); return const Scaffold( body: Center( child: Text('Erreur: Aucune destination de navigation disponible'), ), ); } // Vérifier que selectedIndex est valide if (selectedIndex < 0 || selectedIndex >= destinations.length) { debugPrint('ERREUR: selectedIndex invalide dans DashboardLayout'); return Scaffold( body: Center( child: Text('Erreur: Index de navigation invalide ($selectedIndex)'), ), ); } // Scaffold avec fond transparent (le fond est géré par AppScaffold) return Scaffold( key: ValueKey('dashboard_scaffold_$selectedIndex'), backgroundColor: Colors.transparent, appBar: DashboardAppBar( key: ValueKey('dashboard_appbar_$selectedIndex'), title: title, pageTitle: destinations[selectedIndex].label, isAdmin: isAdmin, onLogoutPressed: onLogoutPressed, ), body: ResponsiveNavigation( key: ValueKey('responsive_nav_$selectedIndex'), title: title, // Même si le titre n'est pas affiché dans la navigation, il est utilisé pour la cohérence body: body, selectedIndex: selectedIndex, onDestinationSelected: onDestinationSelected, destinations: destinations, // Ne pas afficher le bouton "Nouveau passage" dans la navigation showNewPassageButton: false, onNewPassagePressed: null, sidebarBottomItems: sidebarBottomItems, isAdmin: isAdmin, // Ne pas afficher l'AppBar dans la navigation car nous utilisons DashboardAppBar showAppBar: false, ), ); } catch (e) { debugPrint('ERREUR CRITIQUE dans DashboardLayout.build: $e'); // Afficher une interface de secours en cas d'erreur return Scaffold( appBar: AppBar( title: Text('Erreur - $title'), backgroundColor: Colors.red, ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon(Icons.error_outline, color: Colors.red, size: 64), const SizedBox(height: 16), Text( 'Une erreur est survenue', style: TextStyle( fontSize: AppTheme.r(context, 20), fontWeight: FontWeight.bold), ), const SizedBox(height: 8), Text('Détails: $e'), const SizedBox(height: 24), ElevatedButton( onPressed: () { Navigator.of(context) .pushNamedAndRemoveUntil('/', (route) => false); }, child: const Text('Retour à l\'accueil'), ), ], ), ), ); } } }