In a previous post, I shared the steps I took to wire a React project to connect to Firebase services and retrieve data from the database.
Fetching from Firestore Realtime Database
Clark Johnson ・ Jul 12 '20 ・ 3 min read
My latest task involved creating a user with the Firebase Auth service and persisting profile data for the user.
The user was created through a React component containing a form for signup. When submitted, the form executes the function loginUser()
.
const loginUser = () => {
props.firebase
.doCreateUserWithEmailAndPassword(inputs)
.then((authUser) => {
console.log("authUser: ", authUser);
})
.catch((error) => {
console.error(error.code, error.message);
});
};
The fields from the form are passed to the Firebase handler function.
In my project, the connections to the Firebase services and helper methods are encapsulated in a class. In my project, the file is /src/Firebase/firebase.js
.
class Firebase {
constructor() {
app.initializeApp(firebaseConfig);
this.auth = app.auth();
this.db = app.firestore();
}
...
}
The form fields are passed to the doCreateUserWithEmail()
method. This method relies on the createUserWithEmailAndPassword()
and updateProfile()
methods supplied by the Firebase library.
Firebase Auth Class maintains a basic set of fields for the display_name, email, phone_number, and uid (unique identifier). All other fields must be stored separately in a database like Firestore. In my case, they are stored in a Firestore collection called users
.
The action takes place asynchronously through Promise chains. First, the authorized user is created. Then a default display_name is derived from the email address and persisted in the Auth record. Finally, a users
document is created with the uid
as the key, and the fields from inputs
as data. In this example, I'm saving the first and last names.
doCreateUserWithEmailAndPassword = (inputs) => {
const { email, password, firstName, lastName } = inputs;
return this.auth
.createUserWithEmailAndPassword(email, password)
.then((user) => {
const displayName = user.user.email.split("@")[0];
return this.auth.currentUser.updateProfile({ displayName });
})
.then(() => {
console.log(this.auth.currentUser);
return this.db
.collection("users")
.doc(this.auth.currentUser.uid)
.set({ firstName, lastName });
})
.catch((error) => console.error("Error: ", error));
};
The profile document for a single user can easily be retrieved from the users
collection by referencing the uid
.
doGetUserProfile = (uid, callback) => {
return this.db
.collection("users")
.doc(uid)
.get()
.then(callback);
};
Similarly, the profile document for an existing user can easily be updated.
doProfileUpdate = (profile) => {
return this.db
.collection("users")
.doc(this.auth.currentUser.uid)
.set(profile)
.catch((error) => console.error("Error: ", error));
};
So far, my foray into Firebase has been quite rewarding. It's easy to see that after a few implementations the development time for my applications will begin to diminish.
Happy coding!
Cover photo by Kelly Sikkema on Unsplash
Top comments (1)
okey