Tiago 2.0
Tiago 2.0

Reputation: 151

Sending verification email with Firebase and React Native

I am trying to send the validation email upon the account registration, using firebase. The registration is being done successfully but whenever I try to code email verification it gives me an error. Probably because I don't know where to place it. All my firebase methods are on Fire.js, which are the following:

import firebaseKeys from './Config';
import firebase from 'firebase';
require("firebase/firestore");

class Fire {
constructor() {
    if (!firebase.apps.length) {
        firebase.initializeApp(firebaseKeys);
      }
}


addPost = async ({ text, localUri }) => {
    const remoteUri = await this.uploadPhotoAsync(localUri, 'photos/${this.uid}/${Date.now()}');

    return new Promise((res, rej) => {
        this.firestore.collection('posts').add({
            text,
            uid: this.uid,
            timestamp: this.timestamp,
            image: remoteUri
        })
            .then(ref => {
                res(ref);
        })
        .catch(error => {
            rej(error);
        });
    });
}

uploadPhotoAsync = async (uri, filename) => {
    return new Promise(async (res, rej) => {
        const response = await fetch(uri);
        const file = await response.blob();

        let upload = firebase
            .storage()
            .ref(filename)
            .put(file);

        upload.on(
            "state_changed",
            snapshot => {},
            err => {
                rej(err);
            },
            async () => {
                const url = await upload.snapshot.ref.getDownloadURL();
                res(url);
            }
        );
    });
}

createUser = async user => {
    let remoteUri = null

    try {
        await firebase.auth().createUserWithEmailAndPassword(user.email, user.password)
//I tried to code it here with user.sendEmailVerification();
        let db = this.firestore.collection("users").doc(this.uid)

        db.set({
            name: user.name,
            email: user.email,
            avatar: null
        })

        if (user.avatar) {
            remoteUri = await this.uploadPhotoAsync(user.avatar, 'avatars/${this.uid}')

            db.set({avatar: remoteUri}, {merge: true});
        }
    } catch (error) {
        alert("Error: ", error);
    }
};

get firestore() {
    return firebase.firestore();
}

get uid() {
    return (firebase.auth().currentUser || {}).uid;
}

get timestamp() {
    return Date.now();
}
}

Fire.shared = new Fire();
export default Fire;

Upvotes: 0

Views: 1662

Answers (1)

Renaud Tarnec
Renaud Tarnec

Reputation: 83093

The createUserWithEmailAndPassword() method returns a Promise which resolves with a UserCredential AND (as the the doc indicates) "on successful creation of the user account, this user will also be signed in to your application."

So you can easily get the signed in user by using the user property of the UserCredential, and call the sendEmailVerification() method, as follows:

try {
    const userCredential = await firebase.auth().createUserWithEmailAndPassword(user.email, user.password);

    await userCredential.user.sendEmailVerification();

    //In the next line, you should most probably use userCredential.user.uid as the ID of the Firestore document (instead of this.uid)
    cont db = this.firestore.collection("users").doc(this.uid);

    //...

} catch (...)

Note that you may pass an ActionCodeSettings object to the sendEmailVerification() method, see the doc.

Upvotes: 2

Related Questions