import React, { useState, useEffect } from "react"; import Col from "react-bootstrap/Col"; import Form from "react-bootstrap/Form"; import Row from "react-bootstrap/Row"; import Button from "../../pageElements/Button"; import { db, auth } from "../../firebase"; import { createUserWithEmailAndPassword } from "firebase/auth"; import { Link, useNavigate } from "react-router-dom"; import TextInput from "../../pageElements/TextInput"; import { v4 as uuidv4 } from "uuid"; import { collection, setDoc, doc } from "firebase/firestore"; import { splitEvery } from "../../Utils/Array"; import { getFormDataDefaults, getValidatedFormData, handleFormDataChange, isFormDataHasErrors, } from "../../Utils/Form"; import { objectMap } from "../../Utils/Object"; import { signupfields } from "../../Constants/Fields/Signupfields"; import "../../styles/signup.scss"; const SignupPage = () => { const navigate = useNavigate(); const [notice, setNotice] = useState(""); const [isMobile, setIsMobile] = useState(window.innerWidth < 440); useEffect(() => { setIsMobile(window.innerWidth < 440); }); const fieldsChunkSize = 2; const [isBusy, setIsBusy] = useState(false); const [data, setData] = useState(getFormDataDefaults(signupfields)); const handleChangeInput = (e, name) => { const newData = handleFormDataChange(e, name, data, signupfields); if (newData !== null) { setData(newData); } }; const validateData = () => { const newData = getValidatedFormData(data, signupfields); const hasErrors = isFormDataHasErrors(newData); setData(newData); return hasErrors ? null : objectMap(({ value }) => value, newData); }; async function saveUserData(authId, dataValues) { const appUserId = uuidv4(); const firmId = uuidv4(); const fbAuthUid = authId; const { firstName, lastName, firm, telephone, streetAddress, city, state, zipCode, barNumber, practiceArea, email, } = dataValues; const userData = { appUserId, fbAuthUid, firmId, firstName, lastName, firm, telephone, streetAddress, city, state, zipCode, barNumber, practiceArea, email, }; try { const usersRef = collection(db, "users"); await setDoc(doc(usersRef, fbAuthUid), userData); } catch (error) { console.log(`Error saving new user to db: ${error}`); } } const handleSignup = async (e) => { e.preventDefault(); if (isBusy) { return; } const dataValues = validateData(); if (dataValues === null) { return; } setIsBusy(true); try { const userCredential = await createUserWithEmailAndPassword( auth, dataValues.email, dataValues.password ); const user = userCredential.user; await saveUserData(user.uid, dataValues); navigate("/"); } catch (error) { setIsBusy(false); setNotice( error.message || "Sorry, something went wrong. Please try again." ); } }; const MobileForm = () => { return splitEvery( Object.keys(signupfields).slice(0, -2), fieldsChunkSize ).map((names, j) => (