// validators.jsx
// Function to validate email
export const validateEmail = (email) => {
const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\\.,;:\s@\"]+\.)+[^<>()[\]\\.,;:\s@\"]{2,})$/i;
return re.test(email);
};
// Function to validate password
export const validatePassword = (password) => {
if (password.length < 8 || password.length > 32) return false;
if (!/[A-Z]/.test(password)) return false; // At least one uppercase letter
if (!/[a-z]/.test(password)) return false; // At least one lowercase letter
if (!/[0-9]/.test(password)) return false; // At least one digit
if (!/[^A-Za-z0-9]/.test(password)) return false; // At least one special character
return true;
};
// LoginForm.jsx
import React, { useState } from 'react';
import { validateEmail, validatePassword } from './validators.jsx';
const LoginForm = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [alert, setAlert] = useState('');
const handleSubmit = (event) => {
event.preventDefault();
setAlert(''); // Clear previous alerts
// Validate inputs
if (!validateEmail(email)) {
setAlert('Please enter a valid email address.');
return;
}
if (!validatePassword(password)) {
setAlert('Please enter a valid password. Password must be at least 8 characters.');
return;
}
// Call backend API here if validations pass
console.log('API call here');
};
return (
<div>
{alert && (
<div className="alert">
{alert}
<button onClick={() => setAlert('')}>Okay</button>
</div>
)}
<form onSubmit={handleSubmit}>
<label>
Email:
<input type="email" value={email} onChange={(e) => setEmail(e.target.value)} />
</label>
<label>
Password:
<input type="password" value={password} onChange={(e) => setPassword(e.target.value)} />
</label>
<button type="submit">Login</button>
</form>
</div>
);
};
export default LoginForm;
// In your route file, e.g., authRoutes.js
const { check, validationResult } = require('express-validator');
// Define the validation chain for the password and email
const validationChain = [
check('email')
.normalizeEmail()
.isEmail()
.withMessage('Invalid email address.'),
check('password')
.isLength({ min: 8, max: 32 })
.withMessage('Password must be between 8 to 32 characters long.')
.matches(/[A-Z]/)
.withMessage('Password must contain at least one uppercase letter.')
.matches(/[a-z]/)
.withMessage('Password must contain at least one lowercase letter.')
.matches(/[0-9]/)
.withMessage('Password must contain at least one digit.')
.matches(/[^A-Za-z0-9]/)
.withMessage('Password must contain at least one special character.')
];
// Add to your route, e.g., for user registration or login
app.post('/your-route', validationChain, (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ success: false, errors: errors.array() });
}
// Proceed with backend logic here if validation passes
});
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter