Skip to content

Instantly share code, notes, and snippets.

@vousmeevoyez
Created August 22, 2024 12:53
Show Gist options
  • Save vousmeevoyez/521c41712b898f437b28e1cf793d0b15 to your computer and use it in GitHub Desktop.
Save vousmeevoyez/521c41712b898f437b28e1cf793d0b15 to your computer and use it in GitHub Desktop.
minimalist sign up page using bootstrap + react
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