90 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/foundation.dart'; // pour kIsWeb
 | |
| import 'package:firebase_storage/firebase_storage.dart';
 | |
| import 'package:cloud_firestore/cloud_firestore.dart';
 | |
| import 'package:image_picker/image_picker.dart';
 | |
| 
 | |
| class FirebaseStorageManager {
 | |
|   final FirebaseStorage _storage = FirebaseStorage.instance;
 | |
|   final FirebaseFirestore _firestore = FirebaseFirestore.instance;
 | |
| 
 | |
|   /// Upload ou remplace la photo de profil d'un utilisateur dans Firebase Storage.
 | |
|   /// Pour le Web, on fixe l'extension .jpg.
 | |
|   /// 1. Construit le chemin : "ProfilePictures/UID.jpg"
 | |
|   /// 2. Supprime l'ancienne photo (si elle existe).
 | |
|   /// 3. Upload la nouvelle photo.
 | |
|   /// 4. Met à jour Firestore avec l'URL de la nouvelle image.
 | |
|   Future<String?> sendProfilePicture(
 | |
|       {required XFile imageFile, required String uid}) async {
 | |
|     try {
 | |
|       const String fileExtension = '.jpg'; // Extension fixe pour le web
 | |
|       final String fileName = '$uid$fileExtension';
 | |
|       final String filePath = 'ProfilePictures/$fileName';
 | |
|       final Reference storageRef = _storage.ref().child(filePath);
 | |
| 
 | |
|       // 2. Suppression de l'ancienne photo de profil (si elle existe)
 | |
|       try {
 | |
|         await _storage.ref().child(filePath).delete();
 | |
|         print(
 | |
|             "FirebaseStorageManager: Ancienne photo supprimée pour l'utilisateur $uid.");
 | |
|       } on FirebaseException catch (e) {
 | |
|         if (e.code == 'object-not-found') {
 | |
|           print(
 | |
|               "FirebaseStorageManager: Pas d'ancienne photo à supprimer pour l'utilisateur $uid.");
 | |
|         } else {
 | |
|           print(
 | |
|               "FirebaseStorageManager: Erreur lors de la suppression pour l'utilisateur $uid: ${e.message}");
 | |
|           return null;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       // 3. Upload de la nouvelle photo en fonction de la plateforme
 | |
|       UploadTask uploadTask;
 | |
|       if (kIsWeb) {
 | |
|         // Pour le web, lire les bytes et utiliser putData()
 | |
|         final bytes = await imageFile.readAsBytes();
 | |
|         uploadTask = storageRef.putData(bytes);
 | |
|       } else {
 | |
|         // Pour mobile/desktop, utiliser un File (dart:io)
 | |
|         // Sur mobile, image_picker fournit un path, mais on ne doit pas utiliser File sur le web
 | |
|         final bytes = await imageFile.readAsBytes();
 | |
|         uploadTask = storageRef.putData(bytes);
 | |
|       }
 | |
| 
 | |
|       final TaskSnapshot snapshot = await uploadTask.whenComplete(() {});
 | |
|       if (snapshot.state == TaskState.success) {
 | |
|         // 4. Récupérer l'URL de téléchargement
 | |
|         final String downloadUrl = await snapshot.ref.getDownloadURL();
 | |
|         print(
 | |
|             "FirebaseStorageManager: Nouvelle photo uploadée pour l'utilisateur $uid. URL: $downloadUrl");
 | |
| 
 | |
|         // 5. Mettre à jour Firestore avec l'URL de la photo de profil
 | |
|         try {
 | |
|           await _firestore
 | |
|               .collection('users')
 | |
|               .doc(uid)
 | |
|               .update({'profilePhotoUrl': downloadUrl});
 | |
|           print(
 | |
|               "FirebaseStorageManager: Firestore mis à jour pour l'utilisateur $uid.");
 | |
|         } catch (firestoreError) {
 | |
|           print(
 | |
|               "FirebaseStorageManager: Erreur Firestore pour l'utilisateur $uid: $firestoreError");
 | |
|           return downloadUrl; // On retourne l'URL même si la mise à jour échoue
 | |
|         }
 | |
|         return downloadUrl;
 | |
|       } else {
 | |
|         print(
 | |
|             "FirebaseStorageManager: Échec de l'upload pour l'utilisateur $uid. État: ${snapshot.state}");
 | |
|         return null;
 | |
|       }
 | |
|     } on FirebaseException catch (storageError) {
 | |
|       print(
 | |
|           "FirebaseStorageManager: Erreur Firebase Storage pour l'utilisateur $uid: ${storageError.message}");
 | |
|       return null;
 | |
|     } catch (e) {
 | |
|       print(
 | |
|           "FirebaseStorageManager: Erreur inattendue pour l'utilisateur $uid: $e");
 | |
|       return null;
 | |
|     }
 | |
|   }
 | |
| }
 |