Auth réparée
This commit is contained in:
@ -1,6 +1,5 @@
|
||||
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';
|
||||
@ -11,6 +10,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:em2rp/views/widgets/auth/forgot_password_dialog.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class LoginPage extends StatefulWidget {
|
||||
@ -33,13 +33,11 @@ class _LoginPageState extends State<LoginPage> {
|
||||
void dispose() {
|
||||
_emailController.dispose();
|
||||
_passwordController.dispose();
|
||||
print("LoginPage DISPOSED");
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future<void> _loginUser() async {
|
||||
if (!mounted) return; // Early exit if widget is unmounted
|
||||
|
||||
Future<void> _signInWithEmailAndPassword() async {
|
||||
// Pas de vérification mounted ici, le widget reste monté pendant toute l'opération
|
||||
setState(() {
|
||||
_errorMessage = '';
|
||||
_isLoading = true;
|
||||
@ -47,95 +45,54 @@ class _LoginPageState extends State<LoginPage> {
|
||||
_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;
|
||||
final UserCredential userCredential =
|
||||
await FirebaseAuth.instance.signInWithEmailAndPassword(
|
||||
email: _emailController.text.trim(),
|
||||
password: _passwordController.text,
|
||||
);
|
||||
final uid = userCredential.user!.uid;
|
||||
|
||||
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
|
||||
final DocumentSnapshot userDoc =
|
||||
await FirebaseFirestore.instance.collection('users').doc(uid).get();
|
||||
|
||||
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
|
||||
if (userDoc.exists) {
|
||||
print("User document found: ${userDoc.data()}");
|
||||
Provider.of<UserProvider>(context, listen: false)
|
||||
.setUserData(userDoc.data() as Map<String, dynamic>, uid);
|
||||
|
||||
Map<String, dynamic> userData =
|
||||
userDoc.data() as Map<String, dynamic>;
|
||||
|
||||
print(
|
||||
"After data cast - userData: $userData"); // Log userData after cast
|
||||
|
||||
// 3. Store user data in UserProvider
|
||||
final userProvider =
|
||||
Provider.of<UserProvider>(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');
|
||||
}
|
||||
// Maintenant que toutes les données sont chargées, naviguer vers CalendarPage.
|
||||
Navigator.of(context).pushReplacementNamed('/calendar');
|
||||
} else {
|
||||
setState(() {
|
||||
_errorMessage = "Aucune donnée utilisateur trouvée.";
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
} 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;
|
||||
});
|
||||
}
|
||||
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 {
|
||||
_errorMessage = "Erreur de connexion. Veuillez réessayer.";
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
setState(() {
|
||||
_errorMessage =
|
||||
"Erreur lors de la récupération des données utilisateur.";
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _togglePasswordVisibility() {
|
||||
if (mounted) setState(() => _obscurePassword = !_obscurePassword);
|
||||
setState(() {
|
||||
_obscurePassword = !_obscurePassword;
|
||||
});
|
||||
}
|
||||
|
||||
void _forgotPassword() {
|
||||
@ -151,9 +108,13 @@ class _LoginPageState extends State<LoginPage> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: LayoutBuilder(
|
||||
builder: (context, constraints) => constraints.maxWidth > 900
|
||||
? _buildLargeScreenLayout(context)
|
||||
: _buildSmallScreenLayout(context),
|
||||
builder: (context, constraints) {
|
||||
if (constraints.maxWidth > 900) {
|
||||
return _buildLargeScreenLayout(context);
|
||||
} else {
|
||||
return _buildSmallScreenLayout(context);
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -161,11 +122,15 @@ class _LoginPageState extends State<LoginPage> {
|
||||
Widget _buildLargeScreenLayout(BuildContext context) {
|
||||
return Row(
|
||||
children: <Widget>[
|
||||
const Expanded(flex: 6, child: ImageSectionWidget()),
|
||||
Expanded(
|
||||
flex: 6,
|
||||
child: const ImageSectionWidget(), // Affiche l'image de gauche
|
||||
),
|
||||
Expanded(
|
||||
flex: 4,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 50, vertical: 30),
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 50.0, vertical: 30.0),
|
||||
child: _buildLoginForm(context),
|
||||
),
|
||||
),
|
||||
@ -200,26 +165,13 @@ class _LoginPageState extends State<LoginPage> {
|
||||
passwordController: _passwordController,
|
||||
obscurePassword: _obscurePassword,
|
||||
highlightPasswordField: _highlightPasswordField,
|
||||
onTogglePasswordVisibility: () {
|
||||
if (!mounted) return;
|
||||
setState(() {
|
||||
_obscurePassword = !_obscurePassword;
|
||||
});
|
||||
},
|
||||
onTogglePasswordVisibility: _togglePasswordVisibility,
|
||||
),
|
||||
ForgotPasswordButtonWidget(onPressed: () {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return const ForgotPasswordDialogWidget();
|
||||
},
|
||||
);
|
||||
}),
|
||||
ForgotPasswordButtonWidget(onPressed: _forgotPassword),
|
||||
const SizedBox(height: 30),
|
||||
LoginButtonWidget(
|
||||
isLoading: _isLoading,
|
||||
onPressed: () => Navigator.of(context).pushNamed(
|
||||
'/calendar'), //Ici, remplacer par une fonction de connexion avec firebase Auth
|
||||
onPressed: _signInWithEmailAndPassword,
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
ErrorMessageWidget(errorMessage: _errorMessage),
|
||||
|
Reference in New Issue
Block a user