What I cover
Updates
Sign up Form functionality
Sign up helper functions in firebase
Data structure & Trello
Updates
I changed my components return type from: React.FunctionalComponent => ReactElement. I don't think the previous was the correct one lol.
const Signup = (): ReactElement =>
added function to reset form values after submission
Sign up Form functionality
I mostly copied the code from sign-in to the sign-up, as most of it is the same. I added additional form fields. The userChoice prop is passed down to handle the separation of creating an account for an employer vs employee. I will handle this within the helper function within firebase.
Note: I passed it to the sign-in component as well, to handle when a user uses the google sign-in method.
// ...other imports
const defaultFormFields = {
displayName: '',
email: '',
password: '',
confirmPassword: '',
};
type ChildProps = {
userChoice: string;
};
const Signup = (props: ChildProps): ReactElement => {
const { userChoice } = props;
const [formFields, setFormFields] = useState(defaultFormFields);
const { email, password, displayName, confirmPassword } = formFields;
const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
const { name, value } = event.target;
setFormFields({ ...formFields, [name]: value });
};
const resetFormFields = () => {
setFormFields(defaultFormFields);
};
const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
if (password !== confirmPassword) {
// set error message
return;
}
signUpEmailAndPassword({ email, password, displayName }, userChoice);
resetFormFields();
};
return (
<div>....</div>
);
};
export default Signup;
Sign up helper functions (Firebase)
I created 2 functions that will help in creating a user document after signing up.
-
signUpEmailAndPassword()I sign up a user using the email and password with Firebase'screateUserWithEmailAndPassword()helper method. After this, I create a user in the DB at the same time, hence mycreateUserBasedOnChoice()helper method. Lastly, this function will not run if the auth url params doesn't contain either of the choices fromallowedChoices.
export const signUpEmailAndPassword = async (
formFields: FormFields,
userChoice: string
) => {
const { email, password, displayName } = formFields;
const allowedChoices = ['employees', 'employers'];
if (!allowedChoices.includes(userChoice)) return;
try {
await createUserWithEmailAndPassword(auth, email, password);
await createUserDocumentFromAuth(
auth.currentUser,
{ displayName },
userChoice
);
} catch (error) {
console.log('from within sign up method', error);
}
};
2.createUserBasedOnChoice()
The additionalInfo params is/if the user specifies a displayName. I defined the return type to either void or a created user document. Based on user choice, I'll create a collection for either employers or employees. I'll store the appropriate data to the user based on that choice, along with the displayName (if any).
export const createUserBasedOnChoice = async (
authUser: User,
additionalInfo = {} as AdditionalInfo,
userChoice: string
): Promise<void | QueryDocumentSnapshot<UserData>> => {
if (!authUser) return;
const userDocRef =
userChoice === 'employees'
? doc(db, 'employees', authUser.uid)
: doc(db, 'employers', authUser.uid);
const userSnapShot = await getDoc(userDocRef);
// if user doc doesn't exist, will create one in collection
if (!userSnapShot.exists()) {
const { email, displayName } = authUser;
const createdAt = new Date();
try {
if (userChoice === 'employees') {
await setDoc(userDocRef, {
email,
displayName,
createdAt,
...additionalInfo,
title: '',
isForHire: false,
websiteURL: '',
githubUrl: '',
yearsOfExperience: 0,
skills: [],
summary: '',
projects: [],
});
} else if (userChoice === 'employers') {
await setDoc(userDocRef, {
email,
displayName,
createdAt,
...additionalInfo,
company: '',
companyURL: '',
isHiring: false,
companySize: 50,
companyType: '',
jobs: [],
});
}
} catch (error) {
console.log('get user auth and create doc', error);
}
return userSnapShot as QueryDocumentSnapshot<UserData>;
}
};
These are the types I defined for my params within in these functions
type AdditionalInfo = {
displayName?: string;
};
type UserData = {
createdAt: Date;
displayName: string;
email: string;
};
type FormFields = {
email: string;
password: string;
displayName: string;
};
Data structure for project & Trello
Initially, I have 4 sets of data that I plan to use throughout this project.
- User
- Company
- Project
- Job
// User
sample = {
id: xxxxxxxx
name: james
email: james@mail.com
title: Front-end developer
isForHire: true
websiteUrl: www.me.com
githubUrl: www.james@github.com
yearsOfExperience: 3,
skills: [react, javascript, nodejs]
summary: lorem ipsum
projects: [Project]
}
// Project
sample = {
id: xxxxxxxxxx,
title: React Project,
tech: [react, node],
summary: lorem ipsum,
github: www.reactproject@github.com,
projectUrl: www.reactproject.com
}
// Company
sample = {
id: xxxxxxxxxx,
company: Goodcorp,
companyUrl: www.Goodcorp.com
email: goodcorp@mail.com,
isHiring: true,
companySize: 1-50,
companyType: private
jobs: [Jobs]
}
// Job
sample = {
id: xxxxxxxx,
position: Web developer,
location: remote,
salary: 70k,
datePosted: Jun 1,2022,
jobType: full-time,
applyUrl: www.mycompany.com
description: lorem ipsum
}
A glimpse of what I have in Trello for managing this project :)
That's all for now. Stay tuned for more! View the full source code.
P.S I might be getting into Redux in the next one, I want to add in small pieces at a time before getting too in-depth and have to refactor later. Just my preference, Happy Friday!

Top comments (0)