feat: Implement Google Sign-In functionality and update user profile management
This commit is contained in:
@@ -47,8 +47,9 @@ class ProfileContent extends StatelessWidget {
|
||||
radius: 40,
|
||||
backgroundColor: Theme.of(context).colorScheme.primary,
|
||||
child: Text(
|
||||
user.prenom[0].toUpperCase() +
|
||||
user.nom[0].toUpperCase(),
|
||||
user.prenom.isNotEmpty
|
||||
? user.prenom[0].toUpperCase()
|
||||
: 'U',
|
||||
style: TextStyle(
|
||||
fontSize: 24,
|
||||
fontWeight: FontWeight.bold,
|
||||
|
||||
@@ -67,6 +67,57 @@ class _LoginPageState extends State<LoginPage> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _signInWithGoogle() async {
|
||||
setState(() {
|
||||
_isLoading = true;
|
||||
});
|
||||
|
||||
try {
|
||||
final userCredential = await _authService.signInWithGoogle();
|
||||
|
||||
if (mounted && userCredential.user != null) {
|
||||
final user = userCredential.user!;
|
||||
final userProvider = Provider.of<UserProvider>(context, listen: false);
|
||||
|
||||
// Récupérer les données utilisateur depuis Firestore
|
||||
final userData = await userProvider.getUserData(user.uid);
|
||||
|
||||
if (userData != null) {
|
||||
// L'utilisateur existe déjà
|
||||
userProvider.setCurrentUser(userData);
|
||||
Navigator.pushReplacementNamed(context, '/home');
|
||||
} else {
|
||||
// L'utilisateur n'existe pas, créer son profil
|
||||
final newUserData = {
|
||||
'uid': user.uid,
|
||||
'email': user.email ?? '',
|
||||
'name': user.displayName ?? 'Utilisateur',
|
||||
};
|
||||
|
||||
// Créer le profil utilisateur dans Firestore
|
||||
final createdUser = await userProvider.createUser(newUserData);
|
||||
|
||||
if (createdUser != null) {
|
||||
userProvider.setCurrentUser(createdUser);
|
||||
Navigator.pushReplacementNamed(context, '/home');
|
||||
} else {
|
||||
_showErrorMessage('Erreur lors de la création du profil utilisateur');
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
if (mounted) {
|
||||
_showErrorMessage('Erreur lors de la connexion avec Google: ${e.toString()}');
|
||||
}
|
||||
} finally {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
@@ -215,12 +266,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
children: [
|
||||
// GOOGLE
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
// TODO: Implémenter la connexion Google
|
||||
_showErrorMessage(
|
||||
'Connexion Google non implémentée',
|
||||
);
|
||||
},
|
||||
onTap: _isLoading ? null : _signInWithGoogle,
|
||||
child: Container(
|
||||
width: 50,
|
||||
height: 50,
|
||||
|
||||
@@ -66,6 +66,27 @@ class UserProvider extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
// Méthode pour créer un nouvel utilisateur dans Firestore
|
||||
Future<User?> createUser(Map<String, dynamic> userData) async {
|
||||
try {
|
||||
// Structurer les données pour que tous les utilisateurs aient le même format
|
||||
final userDoc = {
|
||||
'id': userData['uid'],
|
||||
'email': userData['email'] ?? '',
|
||||
'nom': '', // Nom vide pour tous les utilisateurs
|
||||
'prenom': userData['name'] ?? userData['nom'] ?? 'Utilisateur', // Nom complet dans prenom
|
||||
};
|
||||
|
||||
await _firestore.collection('users').doc(userData['uid']).set(userDoc);
|
||||
|
||||
// Retourner l'objet User créé
|
||||
return User.fromMap({...userDoc, 'id': userData['uid']});
|
||||
} catch (e) {
|
||||
print('Erreur lors de la création de l\'utilisateur: $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Initialiser l'utilisateur connecté
|
||||
Future<void> initializeUser() async {
|
||||
firebase_auth.User? firebaseUser = _authService.currentUser;
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
import 'package:google_sign_in/google_sign_in.dart';
|
||||
import 'package:google_sign_in_platform_interface/google_sign_in_platform_interface.dart';
|
||||
|
||||
class AuthService {
|
||||
final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
|
||||
@@ -64,5 +66,39 @@ class AuthService {
|
||||
// Update the password
|
||||
await currentUser!.updatePassword(newPassword);
|
||||
}
|
||||
|
||||
Future<void> ensureInitialized(){
|
||||
return GoogleSignInPlatform.instance.init(const InitParameters());
|
||||
}
|
||||
|
||||
Future<UserCredential> signInWithGoogle() async {
|
||||
try {
|
||||
await ensureInitialized();
|
||||
final AuthenticationResults result = await GoogleSignInPlatform.instance.authenticate(const AuthenticateParameters());
|
||||
final String? idToken = result.authenticationTokens.idToken;
|
||||
if (idToken == null) {
|
||||
throw FirebaseAuthException(
|
||||
code: 'ERROR_MISSING_GOOGLE_ID_TOKEN',
|
||||
message: 'Missing Google ID Token',
|
||||
);
|
||||
} else {
|
||||
final OAuthCredential credential = GoogleAuthProvider.credential(idToken: idToken);
|
||||
UserCredential userCredential = await firebaseAuth.signInWithCredential(credential);
|
||||
|
||||
// Retourner le UserCredential au lieu de void
|
||||
return userCredential;
|
||||
}
|
||||
|
||||
} on GoogleSignInException catch (e) {
|
||||
print('Erreur lors de l\'initialisation de Google Sign-In: $e');
|
||||
rethrow;
|
||||
} on FirebaseAuthException catch (e) {
|
||||
print('Erreur Firebase lors de l\'initialisation de Google Sign-In: $e');
|
||||
rethrow;
|
||||
} catch (e) {
|
||||
print('Erreur inconnue lors de l\'initialisation de Google Sign-In: $e');
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user