From 3c5d3b4c5a1a9f64b1607cf4d17b841a4d890eac Mon Sep 17 00:00:00 2001 From: "PC-PAUL\\paulf" Date: Wed, 5 Mar 2025 16:46:24 +0100 Subject: [PATCH] =?UTF-8?q?user=20cass=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- em2rp/devtools_options.yaml | 3 + em2rp/lib/main.dart | 46 ++++- em2rp/lib/providers/user_provider.dart | 41 +++++ em2rp/lib/views/calendar_page.dart | 31 +++- em2rp/lib/views/login_page.dart | 164 +++++++++++++----- em2rp/lib/views/my_account_page.dart | 22 +++ em2rp/lib/views/user_management_page.dart | 39 +++++ .../widgets/auth/forgot_password_button.dart | 10 +- .../widgets/auth/forgot_password_dialog.dart | 103 +++++++++++ .../widgets/auth/password_textfield.dart | 2 +- em2rp/lib/views/widgets/nav/main_drawer.dart | 129 ++++++++++++++ em2rp/pubspec.yaml | 1 + 12 files changed, 529 insertions(+), 62 deletions(-) create mode 100644 em2rp/devtools_options.yaml create mode 100644 em2rp/lib/providers/user_provider.dart create mode 100644 em2rp/lib/views/my_account_page.dart create mode 100644 em2rp/lib/views/user_management_page.dart create mode 100644 em2rp/lib/views/widgets/auth/forgot_password_dialog.dart create mode 100644 em2rp/lib/views/widgets/nav/main_drawer.dart diff --git a/em2rp/devtools_options.yaml b/em2rp/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/em2rp/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/em2rp/lib/main.dart b/em2rp/lib/main.dart index 2bbfb63..296a390 100644 --- a/em2rp/lib/main.dart +++ b/em2rp/lib/main.dart @@ -1,16 +1,27 @@ import 'package:em2rp/views/calendar_page.dart'; import 'package:em2rp/views/login_page.dart'; +import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; import 'utils/colors.dart'; +import 'views/my_account_page.dart'; +import 'views/user_management_page.dart'; +import 'package:provider/provider.dart'; +import 'providers/user_provider.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); - runApp(const MyApp()); + runApp( + ChangeNotifierProvider( + // Wrap MyApp with ChangeNotifierProvider + create: (context) => UserProvider(), // Create UserProvider instance + child: const MyApp(), + ), + ); } class MyApp extends StatelessWidget { @@ -18,15 +29,9 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { + print("test"); return MaterialApp( title: 'EM2 ERP', - initialRoute: '/', - routes: { - '/': (context) => - LoginPage(), // Remplacez HomePage par votre page d'accueil - '/calendar': (context) => - CalendarPage(), // Ajoutez cette ligne pour la route /calendar - }, theme: ThemeData( primarySwatch: Colors.red, primaryColor: AppColors.noir, @@ -63,6 +68,31 @@ class MyApp extends StatelessWidget { ), ), ), + routes: { + '/login': (context) => const LoginPage(), + '/calendar': (context) => const CalendarPage(), + '/my_account': (context) => const MyAccountPage(), + '/user_management': (context) => const UserManagementPage(), + }, + // Conditionally set home based on authentication state + home: StreamBuilder( + stream: FirebaseAuth.instance.authStateChanges(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.active) { + User? user = snapshot.data; + if (user == null) { + return const LoginPage(); // User not logged in, show LoginPage + } + return const CalendarPage(); // User logged in, show CalendarPage + } + // Checking auth state, show loading indicator + return const Scaffold( + body: Center( + child: CircularProgressIndicator(), + ), + ); + }, + ), ); } } diff --git a/em2rp/lib/providers/user_provider.dart b/em2rp/lib/providers/user_provider.dart new file mode 100644 index 0000000..12b110f --- /dev/null +++ b/em2rp/lib/providers/user_provider.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class UserProvider extends ChangeNotifier { + String? _uid; + String? _firstName; + String? _lastName; + String? _role; + String? _profilePictureUrl; + String? _email; + String? _phoneNumber; + + String? get uid => _uid; + String? get firstName => _firstName; + String? get lastName => _lastName; + String? get role => _role; + String? get profilePhotoUrl => _profilePictureUrl; + String? get email => _email; + String? get phoneNumber => _phoneNumber; + + void setUserData(Map userData, String uid) { + _uid = uid; + _firstName = userData['firstName']; + _lastName = userData['lastName']; + _role = userData['role'] ?? 'USER'; // Default role if not provided + _profilePictureUrl = userData['profilePhotoUrl']; + _email = userData['email']; + _phoneNumber = userData['phoneNumber']; + notifyListeners(); // Notify listeners that state has changed + } + + void clearUserData() { + _uid = null; + _firstName = null; + _lastName = null; + _role = null; + _profilePictureUrl = null; + _email = null; + _phoneNumber = null; + notifyListeners(); + } +} diff --git a/em2rp/lib/views/calendar_page.dart b/em2rp/lib/views/calendar_page.dart index 580a4ff..3325beb 100644 --- a/em2rp/lib/views/calendar_page.dart +++ b/em2rp/lib/views/calendar_page.dart @@ -1,20 +1,35 @@ import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; +import 'package:em2rp/views/widgets/nav/main_drawer.dart'; +import 'package:provider/provider.dart'; // Import Provider +import 'package:em2rp/providers/user_provider.dart'; // Import UserProvider +import 'package:em2rp/utils/colors.dart'; class CalendarPage extends StatelessWidget { + const CalendarPage({super.key}); + @override Widget build(BuildContext context) { - final User? user = FirebaseAuth.instance.currentUser; - final String email = user?.email ?? 'Guest'; + final userProvider = Provider.of(context); return Scaffold( - appBar: AppBar( - title: Text('Calendar Page'), - ), + appBar: AppBar(title: const Text('Calendrier')), + drawer: MainDrawer( + currentPage: '/calendar', + userProvider: userProvider), // Pass UserProvider to MainDrawer body: Center( - child: Text( - 'Hello $email, welcome to EM2RP', - style: TextStyle(fontSize: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text('Page Calendrier', style: TextStyle(fontSize: 24)), + const SizedBox(height: 20), + if (userProvider.role == 'ADMIN') // Get role from UserProvider + const Text('Vue Admin du Calendrier', + style: TextStyle(fontSize: 18, color: AppColors.rouge)) + else + const Text('Vue Utilisateur du Calendrier', + style: TextStyle(fontSize: 18, color: Colors.blueGrey)), + ], ), ), ); diff --git a/em2rp/lib/views/login_page.dart b/em2rp/lib/views/login_page.dart index 4f2a70e..a1aeee9 100644 --- a/em2rp/lib/views/login_page.dart +++ b/em2rp/lib/views/login_page.dart @@ -1,3 +1,6 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:em2rp/providers/user_provider.dart'; +import 'package:em2rp/views/widgets/auth/forgot_password_dialog.dart'; import 'package:em2rp/views/widgets/auth/mail_textfield.dart'; import 'package:em2rp/views/widgets/error_message.dart'; import 'package:em2rp/views/widgets/auth/forgot_password_button.dart'; @@ -8,6 +11,7 @@ import 'package:em2rp/views/widgets/auth/password_textfield.dart'; import 'package:em2rp/views/widgets/auth/welcome_text.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class LoginPage extends StatefulWidget { const LoginPage({super.key}); @@ -29,63 +33,127 @@ class _LoginPageState extends State { void dispose() { _emailController.dispose(); _passwordController.dispose(); + print("LoginPage DISPOSED"); super.dispose(); } - Future _signInWithEmailAndPassword() async { + Future _loginUser() async { + if (!mounted) return; // Early exit if widget is unmounted + setState(() { _errorMessage = ''; _isLoading = true; _highlightPasswordField = false; _highlightEmailField = false; }); + + String email = _emailController.text.trim(); + String password = _passwordController.text; + try { - await FirebaseAuth.instance.signInWithEmailAndPassword( - email: _emailController.text.trim(), - password: _passwordController.text, - ); - Navigator.of(context).pushReplacementNamed('/calendar'); - print('Connexion réussie!'); - } on FirebaseAuthException catch (e) { - setState(() { - _isLoading = false; - if (e.code == 'user-not-found' || e.code == 'wrong-password') { - _errorMessage = "Email ou mot de passe incorrect."; - _highlightPasswordField = true; - _highlightEmailField = true; - } else if (e.code == 'invalid-email') { - _errorMessage = "Adresse email invalide."; - _highlightEmailField = true; + // 1. Sign in with Firebase Authentication + UserCredential userCredential = await FirebaseAuth.instance + .signInWithEmailAndPassword(email: email, password: password); + User? user = userCredential.user; + + if (user != null) { + // 2. Fetch user data from Firestore + print( + "Fetching user data from Firestore..."); // Log before Firestore fetch + DocumentSnapshot userDoc = await FirebaseFirestore.instance + .collection('users') + .doc(user.uid) + .get(); + print("Firestore DocumentSnapshot retrieved."); // Log after fetch + + if (userDoc.exists) { + print("Firestore Document Exists: true"); // Log doc exists check + print("Document ID: ${userDoc.id}"); // Log document ID + print( + "Before data cast - userDoc.data(): ${userDoc.data()}"); // Log raw data before cast + + Map userData = + userDoc.data() as Map; + + print( + "After data cast - userData: $userData"); // Log userData after cast + + // 3. Store user data in UserProvider + final userProvider = + Provider.of(context, listen: false); + print( + "Before setUserData call - userProvider: $userProvider"); // Log userProvider instance + userProvider.setUserData( + userData, user.uid); // Store user data in provider + print("After setUserData call"); // Log after setUserData is called + + print( + 'Login successful! Role: ${userProvider.role}'); // Log success and role + if (mounted) { + Navigator.of(context).pushReplacementNamed( + '/calendar'); // 4. Navigate to CalendarPage + } } else { - _errorMessage = "Erreur de connexion. Veuillez réessayer."; + // User document not found in Firestore + print( + "Firestore Document Exists: false"); // Log doc exists check - false + if (mounted) { + setState(() { + _isLoading = false; + _errorMessage = + "Erreur: Utilisateur non trouvé dans la base de données."; + }); + } + print('Login Error: Firestore user document not found'); } - }); - print('Erreur de connexion: ${e.code} - ${e.message}'); + } + } on FirebaseAuthException catch (e) { + // Firebase Authentication error + if (mounted) { + setState(() { + _isLoading = false; + if (e.code == 'user-not-found' || e.code == 'wrong-password') { + _errorMessage = "Email ou mot de passe incorrect."; + _highlightPasswordField = true; + _highlightEmailField = true; + } else if (e.code == 'invalid-email') { + _errorMessage = "Adresse email invalide."; + _highlightEmailField = true; + } else { + _errorMessage = "Erreur de connexion. Veuillez réessayer."; + } + }); + } + print('Login Error (FirebaseAuth): ${e.code} - ${e.message}'); + } finally { + if (mounted) { + setState(() { + _isLoading = false; + }); + } } } void _togglePasswordVisibility() { - setState(() { - _obscurePassword = !_obscurePassword; - }); + if (mounted) setState(() => _obscurePassword = !_obscurePassword); } void _forgotPassword() { - // TODO: Implémenter la logique de mot de passe oublié - print("Mot de passe oublié cliqué !"); + showDialog( + context: context, + builder: (BuildContext context) { + return const ForgotPasswordDialogWidget(); + }, + ); } @override Widget build(BuildContext context) { return Scaffold( body: LayoutBuilder( - builder: (context, constraints) { - if (constraints.maxWidth > 900) { - return _buildLargeScreenLayout(context); - } else { - return _buildSmallScreenLayout(context); - } - }, + builder: (context, constraints) => constraints.maxWidth > 900 + ? _buildLargeScreenLayout(context) + : _buildSmallScreenLayout(context), ), ); } @@ -93,16 +161,11 @@ class _LoginPageState extends State { Widget _buildLargeScreenLayout(BuildContext context) { return Row( children: [ - Expanded( - flex: 6, - child: - const ImageSectionWidget(), // Utilise le composant ImageSection - ), + const Expanded(flex: 6, child: ImageSectionWidget()), Expanded( flex: 4, child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 50.0, vertical: 30.0), + padding: const EdgeInsets.symmetric(horizontal: 50, vertical: 30), child: _buildLoginForm(context), ), ), @@ -124,9 +187,9 @@ class _LoginPageState extends State { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - const LogoWidget(), // Utilise le widget LogoWidget + const LogoWidget(), const SizedBox(height: 30), - const WelcomeTextWidget(), // Utilise le widget WelcomeTextWidget + const WelcomeTextWidget(), const SizedBox(height: 40), EmailTextFieldWidget( emailController: _emailController, @@ -137,13 +200,26 @@ class _LoginPageState extends State { passwordController: _passwordController, obscurePassword: _obscurePassword, highlightPasswordField: _highlightPasswordField, - onTogglePasswordVisibility: _togglePasswordVisibility, + onTogglePasswordVisibility: () { + if (!mounted) return; + setState(() { + _obscurePassword = !_obscurePassword; + }); + }, ), - ForgotPasswordButtonWidget(onPressed: _forgotPassword), + ForgotPasswordButtonWidget(onPressed: () { + showDialog( + context: context, + builder: (BuildContext context) { + return const ForgotPasswordDialogWidget(); + }, + ); + }), const SizedBox(height: 30), LoginButtonWidget( isLoading: _isLoading, - onPressed: _signInWithEmailAndPassword, + onPressed: () => Navigator.of(context).pushNamed( + '/calendar'), //Ici, remplacer par une fonction de connexion avec firebase Auth ), const SizedBox(height: 20), ErrorMessageWidget(errorMessage: _errorMessage), diff --git a/em2rp/lib/views/my_account_page.dart b/em2rp/lib/views/my_account_page.dart new file mode 100644 index 0000000..5d904db --- /dev/null +++ b/em2rp/lib/views/my_account_page.dart @@ -0,0 +1,22 @@ +import 'package:em2rp/providers/user_provider.dart'; +import 'package:em2rp/views/widgets/nav/main_drawer.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class MyAccountPage extends StatelessWidget { + const MyAccountPage({super.key}); + + @override + Widget build(BuildContext context) { + final userProvider = Provider.of(context); + + return Scaffold( + appBar: AppBar(title: const Text('Mon Compte')), + drawer: + MainDrawer(currentPage: '/my_account', userProvider: userProvider), + body: const Center( + child: Text('Page Mon Compte', style: TextStyle(fontSize: 24)), + ), + ); + } +} diff --git a/em2rp/lib/views/user_management_page.dart b/em2rp/lib/views/user_management_page.dart new file mode 100644 index 0000000..e8b7c86 --- /dev/null +++ b/em2rp/lib/views/user_management_page.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:em2rp/views/widgets/nav/main_drawer.dart'; +import 'package:em2rp/providers/user_provider.dart'; // Import UserProvider +import 'package:provider/provider.dart'; // Import Provider + +class UserManagementPage extends StatelessWidget { + const UserManagementPage({super.key}); + + @override + Widget build(BuildContext context) { + final userProvider = + Provider.of(context); // Get UserProvider instance + + if (userProvider.role != 'ADMIN') { + // Get role from UserProvider + return Scaffold( + appBar: AppBar(title: const Text('Gestion des Utilisateurs')), + drawer: MainDrawer( + currentPage: '/user_management', + userProvider: userProvider), // Pass UserProvider to MainDrawer + body: const Center( + child: Text('Accès non autorisé pour les utilisateurs non-Admin.', + style: TextStyle(fontSize: 18, color: Colors.red)), + ), + ); + } else { + return Scaffold( + appBar: AppBar(title: const Text('Gestion des Utilisateurs (Admin)')), + drawer: MainDrawer( + currentPage: '/user_management', + userProvider: userProvider), // Pass UserProvider to MainDrawer + body: const Center( + child: Text('Page de Gestion des Utilisateurs (Admin)', + style: TextStyle(fontSize: 24)), + ), + ); + } + } +} diff --git a/em2rp/lib/views/widgets/auth/forgot_password_button.dart b/em2rp/lib/views/widgets/auth/forgot_password_button.dart index ad3a46e..eccb1c7 100644 --- a/em2rp/lib/views/widgets/auth/forgot_password_button.dart +++ b/em2rp/lib/views/widgets/auth/forgot_password_button.dart @@ -1,3 +1,4 @@ +import 'package:em2rp/views/widgets/auth/forgot_password_dialog.dart'; import 'package:flutter/material.dart'; class ForgotPasswordButtonWidget extends StatelessWidget { @@ -10,7 +11,14 @@ class ForgotPasswordButtonWidget extends StatelessWidget { return Align( alignment: Alignment.centerRight, child: TextButton( - onPressed: onPressed, + onPressed: () { + showDialog( + context: context, + builder: (BuildContext context) { + return const ForgotPasswordDialogWidget(); + }, + ); + }, child: const Text( 'Mot de passe oublié ?', style: TextStyle(color: Colors.grey), diff --git a/em2rp/lib/views/widgets/auth/forgot_password_dialog.dart b/em2rp/lib/views/widgets/auth/forgot_password_dialog.dart new file mode 100644 index 0000000..64df7ce --- /dev/null +++ b/em2rp/lib/views/widgets/auth/forgot_password_dialog.dart @@ -0,0 +1,103 @@ +import 'package:em2rp/utils/colors.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; + +class ForgotPasswordDialogWidget extends StatefulWidget { + const ForgotPasswordDialogWidget({super.key}); + + @override + State createState() => + _ForgotPasswordDialogState(); +} + +class _ForgotPasswordDialogState extends State { + final _emailController = TextEditingController(); + String _errorMessage = ''; + bool _isLoading = false; + bool _emailSent = false; + + @override + void dispose() { + _emailController.dispose(); + super.dispose(); + } + + Future _resetPassword() async { + setState(() { + _errorMessage = ''; + _isLoading = true; + _emailSent = false; + }); + try { + await FirebaseAuth.instance + .sendPasswordResetEmail(email: _emailController.text.trim()); + setState(() { + _isLoading = false; + _emailSent = true; + }); + } on FirebaseAuthException catch (e) { + setState(() { + _isLoading = false; + _errorMessage = "Erreur : ${e.message}"; + _emailSent = false; + }); + print( + "Erreur de réinitialisation du mot de passe: ${e.code} - ${e.message}"); + } + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: const Text('Mot de passe oublié ?'), + content: SingleChildScrollView( + child: ListBody( + children: [ + if (_emailSent) + const Text( + "Un email de réinitialisation a été envoyé à votre adresse.", + style: TextStyle(color: Colors.green)), + if (!_emailSent) ...[ + const Text( + "Entrez votre adresse email pour recevoir un lien de réinitialisation."), + const SizedBox(height: 20), + TextField( + controller: _emailController, + keyboardType: TextInputType.emailAddress, + decoration: const InputDecoration( + labelText: 'Email', + border: OutlineInputBorder(), + ), + ), + if (_errorMessage.isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text(_errorMessage, + style: const TextStyle(color: Colors.red)), + ), + ] + ], + ), + ), + actions: [ + TextButton( + child: const Text('Terminer'), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + if (!_emailSent) + ElevatedButton( + onPressed: _isLoading ? null : _resetPassword, + child: _isLoading + ? const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator(color: AppColors.blanc), + ) + : const Text('Envoyer'), + ), + ], + ); + } +} diff --git a/em2rp/lib/views/widgets/auth/password_textfield.dart b/em2rp/lib/views/widgets/auth/password_textfield.dart index adf7349..9691b1c 100644 --- a/em2rp/lib/views/widgets/auth/password_textfield.dart +++ b/em2rp/lib/views/widgets/auth/password_textfield.dart @@ -1,6 +1,6 @@ +// lib/views/widgets/password_text_field_widget.dart import 'package:em2rp/utils/colors.dart'; import 'package:flutter/material.dart'; -import 'package:em2rp/utils/colors.dart'; class PasswordTextFieldWidget extends StatelessWidget { final TextEditingController passwordController; diff --git a/em2rp/lib/views/widgets/nav/main_drawer.dart b/em2rp/lib/views/widgets/nav/main_drawer.dart new file mode 100644 index 0000000..4c4cea7 --- /dev/null +++ b/em2rp/lib/views/widgets/nav/main_drawer.dart @@ -0,0 +1,129 @@ +import 'package:em2rp/providers/user_provider.dart'; // Import UserProvider +import 'package:em2rp/utils/colors.dart'; +import 'package:em2rp/views/calendar_page.dart'; +import 'package:em2rp/views/my_account_page.dart'; +import 'package:em2rp/views/user_management_page.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; // Import Provider + +class MainDrawer extends StatelessWidget { + final String currentPage; + final UserProvider userProvider; + + const MainDrawer( + {super.key, required this.currentPage, required this.userProvider}); + + @override + Widget build(BuildContext context) { + return Drawer( + child: ListView( + padding: EdgeInsets.zero, + children: [ + DrawerHeader( + // Header du drawer amélioré + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage('assets/EM2_NsurB.jpg'), + fit: BoxFit.cover, + colorFilter: ColorFilter.mode( + AppColors.noir.withOpacity(0.4), + BlendMode.darken, + ), + ), + ), + child: Container( + padding: const EdgeInsets.all(16.0), + alignment: Alignment.bottomLeft, + child: Column( + // Use Column to arrange logo and user name + crossAxisAlignment: + CrossAxisAlignment.start, // Align text to the left + mainAxisAlignment: + MainAxisAlignment.end, // Align content to the bottom + children: [ + Image.asset('assets/EM2_NsurB.jpg', + height: 50), // Smaller logo in header + const SizedBox(height: 8), + Text( + 'Bonjour, ${userProvider.firstName ?? 'Erreur'}', // Display user's first name from provider + style: TextStyle( + color: AppColors.blanc, + fontSize: 18, + fontWeight: FontWeight.bold, + shadows: [ + Shadow( + blurRadius: 3.0, + color: AppColors.noir, + offset: Offset(1.0, 1.0), + ), + ], + ), + ), + ], + ), + ), + ), + ListTile( + // Lien vers la page Calendrier + leading: const Icon(Icons.calendar_today), + title: const Text('Calendrier'), + selected: currentPage == '/calendar', + selectedColor: AppColors.rouge, + onTap: () { + Navigator.pop(context); + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => CalendarPage()), + ); + }, + ), + ExpansionTileTheme( + data: const ExpansionTileThemeData( + iconColor: AppColors.noir, + collapsedIconColor: AppColors.noir, + ), + child: ExpansionTile( + leading: const Icon(Icons.settings), + title: const Text('Paramètres'), + children: [ + ListTile( + leading: const Icon(Icons.account_circle), + // Lien vers "Mon Compte" + title: const Text('Mon Compte'), + selected: currentPage == '/my_acount', + selectedColor: AppColors.rouge, + onTap: () { + Navigator.pop(context); + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => const MyAccountPage()), + ); + }, + ), + ListTile( + leading: const Icon(Icons.group), + // Lien vers "Gestion des Utilisateurs" + title: const Text('Gestion des Utilisateurs'), + selected: currentPage == + '/user_management', // Check if current page is UserManagementPage + selectedColor: AppColors.rouge, // Color when selected + onTap: () { + Navigator.pop(context); // Ferme le drawer + Navigator.pushReplacement( + // Navigue vers UserManagementPage + context, + MaterialPageRoute( + builder: (context) => const UserManagementPage()), + ); + }, + ), + ], + ), + ), + // Tu peux ajouter d'autres liens ici si besoin + ], + ), + ); + } +} diff --git a/em2rp/pubspec.yaml b/em2rp/pubspec.yaml index 0bee70c..02702ad 100644 --- a/em2rp/pubspec.yaml +++ b/em2rp/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: firebase_auth: ^5.5.1 cloud_firestore: ^5.6.5 google_sign_in: ^6.2.2 + provider: ^6.1.2 dev_dependencies: flutter_test: