EM2RP/em2rp/lib/views/login_page.dart
2025-03-05 16:46:24 +01:00

230 lines
7.5 KiB
Dart

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<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
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<void> _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<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');
}
}
} 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: <Widget>[
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: <Widget>[
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),
],
);
}
}