Estoy tratando de obtener una URL de imagen del almacenamiento de firebase antes de enviar un formulario a firestore usando formik. Soy nuevo en la programación y lo he estado intentando durante días. Este es el código para tomar la URL
let uploadImage = async (uri, imageName) => { const response = await fetch(uri); const blob = await response.blob(); const storageRef = firebase.storage().ref("images/" + imageName); storageRef.put(blob).then((snapshot) => { snapshot.ref.getDownloadURL().then((downLoadURL) => { console.log("file available at: ", downLoadURL); //setImageStorage(null); setImageStorage({ photo: downLoadURL }); }) });};
a continuación se muestra el código para establecer la URL en el estado
const storageImage = () => { if (selectedImage !== null) { uploadImage(selectedImage.localUri, randomName) } else { setImageStorage({ photo: defaultImage }); }};
function submitForm(values) { db.collection("item") .add({ values, category: category, image: imageStorage.photo, latitude: newLatitude, longitude: newLongitude, }el código en formik se ve así
<Formik initialValues={{ description: "", price: "", roomName: "" }} validationSchema={itemSchema} onSubmit={ async (values, actions) => { await storageImage().then((()=>{ submitForm(values); })) actions.resetForm(); setCategory(""); setSelectedImage(null); setImageStorage(null); navigation.navigate("YardSale");Recibo el siguiente error: Advertencia: se detectó un error no controlado de submitForm (), [Error de tipo: nulo no es un objeto (evaluando 'imageStorage.photo')]
Por favor ayuda
await storageImage().then((()=>{ submitForm(values); })) // here values get added to the database before uploading image uploadImage
let uploadImage = async (uri, imageName) => { const response = await fetch(uri); const blob = await response.blob(); const storageRef = firebase.storage().ref("images/" + imageName); const snapshot = await storageRef.put(blob){ const downloadUrl = await snapshot.ref.getDownloadURL() console.log("file available at: ", downLoadURL); setImageStorage({ photo: downLoadURL }); } storageImage
const storageImage = async () => { // added async if (selectedImage !== null) { await uploadImage(selectedImage.localUri, randomName) // added await } else { setImageStorage({ photo: defaultImage }); } } In Formik
<Formik initialValues={{ description: "", price: "", roomName: "" }} validationSchema={itemSchema} onSubmit={ async (values, actions) => { // you shouldn't use await and then togather await storageImage(); submitForm(values); ...