Untitled
unknown
plain_text
2 years ago
6.0 kB
2
Indexable
Never
import React, { useEffect } from 'react'; import { useCreateUserWithEmailAndPassword, useSignInWithGoogle, useUpdateProfile } from 'react-firebase-hooks/auth'; import { useForm } from 'react-hook-form'; import { Link, useNavigate } from 'react-router-dom'; import auth from '../../firebase.init'; import Loading from '../Shared/Loading/Loading'; const Signup = () => { const [signInWithGoogle, gUser, gLoading, gError] = useSignInWithGoogle(auth); const [ createUserWithEmailAndPassword, user, loading, error, ] = useCreateUserWithEmailAndPassword(auth); const [updateProfile, updating, updateError] = useUpdateProfile(auth); const navigate = useNavigate(); const { register, formState: { errors }, handleSubmit } = useForm(); useEffect(() => { if (user || gUser) { navigate('/') console.log(user) } }, [user, gUser, navigate]) let signUpError; if (error || gError || updateError) { signUpError = <p className='text-red-500'>{error.message || gError.message || updateError.message}</p> } if (loading || gLoading || updating) { return <Loading></Loading> } const onSubmit = async data => { await createUserWithEmailAndPassword(data.email, data.password); await updateProfile({ displayName: data.name }) }; return ( <div className='flex h-screen justify-center items-center'> <div className="card w-96 shadow-xl border-2 border-white"> <div className="card-body"> <h2 className="text-center text-accent text-2xl font-bold">Please Sign up</h2> <form onSubmit={handleSubmit(onSubmit)}> <div className="form-control w-full max-w-xs"> <label className="label"> <span className="label-text">Name</span> </label> <input {...register("name", { required: { value: true, message: 'Name is required' } })} type="text" placeholder="Your Name" className="input input-bordered w-full max-w-xs" /> <label className="label"> {errors.name?.type === 'required' && <span className="label-text-alt text-red-500">{errors.name.message}</span>} </label> </div> <div className="form-control w-full max-w-xs"> <label className="label"> <span className="label-text">Email Address</span> </label> <input {...register("email", { required: { value: true, message: 'Email is required' }, pattern: { value: /[A-Za-z]{3}/, message: 'Provide a valid email' } })} type="email" placeholder="Your Email" className="input input-bordered w-full max-w-xs" /> <label className="label"> {errors.email?.type === 'required' && <span className="label-text-alt text-red-500">{errors.email.message}</span>} {errors.email?.type === 'pattern' && <span className="label-text-alt text-red-500">{errors.email.message}</span>} </label> </div> <div className="form-control w-full max-w-xs"> <label className="label"> <span className="label-text">Password</span> </label> <input {...register("password", { required: { value: true, message: 'Password is required' }, minLength: { value: 6, message: 'Must be 6 characters or longer' } })} type="password" placeholder="Password" className="input input-bordered w-full max-w-xs" /> <label className="label"> {errors.password?.type === 'required' && <span className="label-text-alt text-red-500">{errors.password.message}</span>} {errors.password?.type === 'pattern' && <span className="label-text-alt text-red-500">{errors.password.message}</span>} </label> </div> {signUpError} <p className='mb-2 text-center text-lg'><small> Already have an account? <Link to="/login" className='text-blue-400 font-semibold'>Please Login</Link></small></p> <input className='btn btn-accent sm:btn-sm md:btn-md hover:bg-transparent hover:text-accent w-full max-w-xs' type="submit" value="Signup" /> </form> <div className="divider">OR</div> <button onClick={() => signInWithGoogle()} className="btn btn-secondary sm:btn-sm md:btn-md hover:bg-transparent hover:text-secondary">Continue with Google</button> </div> </div> </div> ); }; export default Signup;