Created
August 22, 2024 12:53
-
-
Save vousmeevoyez/521c41712b898f437b28e1cf793d0b15 to your computer and use it in GitHub Desktop.
minimalist sign up page using bootstrap + react
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import axios from 'axios'; | |
import React, { useState } from 'react'; | |
import { useForm } from 'react-hook-form'; | |
const SignUp = () => { | |
const { register, handleSubmit, formState: { errors } } = useForm(); | |
const [apiError, setApiError] = useState(''); // State to hold API error message | |
const [loading, setLoading] = useState(false); // State to manage loading state | |
const onSubmit = async (data) => { | |
try { | |
setApiError(''); // Clear previous error | |
setLoading(true); // Set loading to true | |
const response = await axios.post(`${process.env.REACT_APP_API_BASE_URL}/api/users`, data); | |
console.log('User created:', response.data); | |
// Handle successful response (e.g., redirect, success message) | |
} catch (error) { | |
console.error('There was an error creating the user:', error); | |
setApiError(`An error occurred while creating your account. ${error.response.data.error}`); // Set error message | |
} finally{ | |
setLoading(false); | |
} | |
}; | |
return ( | |
<div className="container mt-5"> | |
<div className="row justify-content-center"> | |
<div className="col-md-4"> | |
<div className="card"> | |
<div className="card-header text-center"> | |
<h4>Sign Up</h4> | |
</div> | |
<div className="card-body"> | |
{apiError && <div className="alert alert-danger text-center">{apiError}</div>} {/* Display API error */} | |
<form onSubmit={handleSubmit(onSubmit)}> | |
<div className="form-group mb-3"> | |
<label>First Name</label> | |
<input | |
type="text" | |
className={`form-control ${errors.firstName ? 'is-invalid' : ''}`} | |
{...register('firstName', { required: 'First Name is required' })} | |
/> | |
{errors.firstName && <div className="invalid-feedback">{errors.firstName.message}</div>} | |
</div> | |
<div className="form-group mb-3"> | |
<label>Last Name</label> | |
<input | |
type="text" | |
className={`form-control ${errors.lastName ? 'is-invalid' : ''}`} | |
{...register('lastName', { required: 'Last Name is required' })} | |
/> | |
{errors.lastName && <div className="invalid-feedback">{errors.lastName.message}</div>} | |
</div> | |
<div className="form-group mb-3"> | |
<label>Email</label> | |
<input | |
type="email" | |
className={`form-control ${errors.email ? 'is-invalid' : ''}`} | |
{...register('email', { | |
required: 'Email is required', | |
pattern: { | |
value: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, | |
message: 'Invalid email address' | |
} | |
})} | |
/> | |
{errors.email && <div className="invalid-feedback">{errors.email.message}</div>} | |
</div> | |
<div className="form-group mb-3"> | |
<label>Phone Number</label> | |
<input | |
type="tel" | |
className={`form-control ${errors.phoneNumber ? 'is-invalid' : ''}`} | |
{...register('phoneNumber', { | |
required: 'Phone Number is required', | |
pattern: { | |
value: /^\d{10,15}$/, | |
message: 'Invalid phone number' | |
} | |
})} | |
/> | |
{errors.phoneNumber && <div className="invalid-feedback">{errors.phoneNumber.message}</div>} | |
</div> | |
<div className="form-group mb-3"> | |
<label>Password</label> | |
<input | |
type="password" | |
className={`form-control ${errors.password ? 'is-invalid' : ''}`} | |
{...register('password', { | |
required: 'Password is required', | |
pattern: { | |
value: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/, | |
message: 'Password must be at least 8 characters long and include one uppercase letter, one lowercase letter, one number, and one special character' | |
} | |
})} | |
/> | |
{errors.password && <div className="invalid-feedback">{errors.password.message}</div>} | |
</div> | |
<button type="submit" className="btn btn-primary w-100" disabled={loading}> | |
{loading ? ( | |
<span className="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> | |
) : ( | |
'Sign Up' | |
)} | |
</button> | |
</form> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
); | |
}; | |
export default SignUp; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment