Estoy usando Firestore y Storage en un proyecto de React Native y estoy trabajando en una función que migra datos de SQLite a Firebase. Una vez que el usuario inicia sesión por primera vez, el proceso de migración se ejecuta sincrónicamente. Entre los datos para migrar hay imágenes base64 y no importa lo que haga, a pesar de usar async/await en todas partes, obtengo la DownloadURL "demasiado tarde", después de que se realiza el proceso de migración y se enumeran los nuevos datos de Firestore. Entonces, no puedo mostrar las imágenes al principio, tengo que recargar la aplicación.
Mi código:
const upload64BaseImage = async (photo, docRef) => { try { //fetch doesn't work with base64 images and Firebase Cloud Storage const blob = await new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.onload = function () { resolve(xhr.response); }; xhr.onerror = function (e) { console.log(e); reject(new TypeError("Network request failed")); }; xhr.responseType = "blob"; xhr.open("GET", photo, true); xhr.send(null); }); const imageRef = ref(storage, `images/${docRef}.jpg`); const metadata = { contentType: "image/jpeg", }; const snapshot = await uploadBytes(imageRef, blob, metadata); const downloadUrl = await getDownloadURL(snapshot.ref); return downloadUrl; } catch (error) { console.log(`error`, error.message); } }; const createNewDocument = async (userId, data) => { try { const newUserRef = doc(collection(db, "users")); const myTimestamp = Timestamp.fromDate(new Date(data.Birthdate)); const downloadUrl = await upload64BaseImage(data.Photo, newUserRef.id); //crear un objeto const newUserObjetc = { UserId: userId, Birthdate: myTimestamp, Name: data.Name, Surname: data.Surname, Photo: downloadUrl || null, }; await setDoc(newUserRef, newUserObjetc); return newUserRef.id; } catch (error) { console.log(`error`, error.message); } };