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'; import 'package:em2rp/views/widgets/image/big_image_left.dart'; import 'package:em2rp/views/widgets/auth/login_button.dart'; import 'package:em2rp/views/widgets/image/em2_logo_n_sur_b.dart'; 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}); @override State createState() => _LoginPageState(); } class _LoginPageState extends State { final _emailController = TextEditingController(); final _passwordController = TextEditingController(); String _errorMessage = ''; bool _isLoading = false; bool _obscurePassword = true; bool _highlightPasswordField = false; bool _highlightEmailField = false; @override void dispose() { _emailController.dispose(); _passwordController.dispose(); print("LoginPage DISPOSED"); super.dispose(); } 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 { // 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 { // 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'); } } } 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() { if (mounted) setState(() => _obscurePassword = !_obscurePassword); } void _forgotPassword() { showDialog( context: context, builder: (BuildContext context) { return const ForgotPasswordDialogWidget(); }, ); } @override Widget build(BuildContext context) { return Scaffold( body: LayoutBuilder( builder: (context, constraints) => constraints.maxWidth > 900 ? _buildLargeScreenLayout(context) : _buildSmallScreenLayout(context), ), ); } Widget _buildLargeScreenLayout(BuildContext context) { return Row( children: [ const Expanded(flex: 6, child: ImageSectionWidget()), Expanded( flex: 4, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 50, vertical: 30), child: _buildLoginForm(context), ), ), ], ); } Widget _buildSmallScreenLayout(BuildContext context) { return Center( child: SingleChildScrollView( padding: const EdgeInsets.all(20.0), child: _buildLoginForm(context), ), ); } Widget _buildLoginForm(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const LogoWidget(), const SizedBox(height: 30), const WelcomeTextWidget(), const SizedBox(height: 40), EmailTextFieldWidget( emailController: _emailController, highlightEmailField: _highlightEmailField, ), const SizedBox(height: 20), PasswordTextFieldWidget( passwordController: _passwordController, obscurePassword: _obscurePassword, highlightPasswordField: _highlightPasswordField, onTogglePasswordVisibility: () { if (!mounted) return; setState(() { _obscurePassword = !_obscurePassword; }); }, ), ForgotPasswordButtonWidget(onPressed: () { showDialog( context: context, builder: (BuildContext context) { return const ForgotPasswordDialogWidget(); }, ); }), const SizedBox(height: 30), LoginButtonWidget( isLoading: _isLoading, onPressed: () => Navigator.of(context).pushNamed( '/calendar'), //Ici, remplacer par une fonction de connexion avec firebase Auth ), const SizedBox(height: 20), ErrorMessageWidget(errorMessage: _errorMessage), ], ); } }