import 'dart:io'; 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 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) final file = File(imageFile.path); uploadTask = storageRef.putFile(file); } 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; } } }