import 'package:flutter/material.dart'; import 'package:geosector_app/presentation/widgets/dashboard_app_bar.dart'; import 'package:geosector_app/presentation/widgets/responsive_navigation.dart'; /// 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; /// Indique si le bouton "Nouveau passage" doit être affiché final bool showNewPassageButton; /// Callback appelé lorsque le bouton "Nouveau passage" est pressé final VoidCallback? onNewPassagePressed; /// 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({ Key? key, required this.body, required this.title, required this.selectedIndex, required this.onDestinationSelected, required this.destinations, this.additionalActions, this.showNewPassageButton = true, this.onNewPassagePressed, this.sidebarBottomItems, this.isAdmin = false, this.onLogoutPressed, }) : super(key: key); @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)'), ), ); } return Scaffold( backgroundColor: Colors .transparent, // Fond transparent pour laisser voir le AdminBackground appBar: DashboardAppBar( title: title, pageTitle: destinations[selectedIndex].label, showNewPassageButton: showNewPassageButton, onNewPassagePressed: onNewPassagePressed, isAdmin: isAdmin, onLogoutPressed: onLogoutPressed, ), body: ResponsiveNavigation( 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 car il est déjà dans l'AppBar showNewPassageButton: false, onNewPassagePressed: onNewPassagePressed, 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), const Text( 'Une erreur est survenue', style: TextStyle(fontSize: 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'), ), ], ), ), ); } } }