Files
TravelMate/lib/providers/user_provider.dart

121 lines
3.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart' as firebase_auth;
import 'package:cloud_firestore/cloud_firestore.dart';
import '../models/user.dart';
import '../services/auth_service.dart';
class UserProvider extends ChangeNotifier {
User? _currentUser;
final AuthService _authService = AuthService();
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
User? get currentUser => _currentUser;
void setCurrentUser(User user) {
_currentUser = user;
notifyListeners();
}
Future<void> logout() async {
await _authService.signOut();
_currentUser = null;
notifyListeners();
}
bool get isLoggedIn => _currentUser != null;
// Méthode pour récupérer les données utilisateur depuis Firestore
Future<User?> getUserData(String uid) async {
try {
DocumentSnapshot doc = await _firestore.collection('users').doc(uid).get();
if (doc.exists) {
Map<String, dynamic> data = doc.data() as Map<String, dynamic>;
return User.fromMap({...data, 'id': uid});
}
return null;
} catch (e) {
print('Erreur lors de la récupération des données utilisateur: $e');
return null;
}
}
// Méthode pour sauvegarder les données utilisateur dans Firestore
Future<void> saveUserData(User user) async {
try {
await _firestore.collection('users').doc(user.id).set(user.toMap());
} catch (e) {
print('Erreur lors de la sauvegarde des données utilisateur: $e');
rethrow;
}
}
// Méthode pour mettre à jour les données utilisateur
Future<bool> updateUser(User updatedUser) async {
try {
await _firestore.collection('users').doc(updatedUser.id).update(updatedUser.toMap());
// Mettre à jour le displayName dans Firebase Auth
await _authService.updateDisplayName(displayName: updatedUser.fullName);
_currentUser = updatedUser;
notifyListeners();
return true;
} catch (e) {
print('Erreur lors de la mise à jour de l\'utilisateur: $e');
return false;
}
}
// 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 = {
'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éé avec l'ID correct
return User.fromMap({...userDoc, 'id': userData['uid']});
} catch (e) {
print('Erreur lors de la création de l\'utilisateur: $e');
return null;
}
}
// Méthode pour obtenir l'ID d'un utilisateur par son email
Future<String?> getUserIdByEmail(String email) async {
try {
final QuerySnapshot querySnapshot = await _firestore
.collection('users')
.where('email', isEqualTo: email.trim())
.limit(1)
.get();
if (querySnapshot.docs.isNotEmpty) {
return querySnapshot.docs.first.id;
}
return null;
} catch (e) {
print('Erreur lors de la recherche de l\'utilisateur par email: $e');
return null;
}
}
// Initialiser l'utilisateur connecté
Future<void> initializeUser() async {
firebase_auth.User? firebaseUser = _authService.currentUser;
if (firebaseUser != null) {
User? userData = await getUserData(firebaseUser.uid);
if (userData != null) {
_currentUser = userData;
notifyListeners();
}
}
}
}