I am working on a simple customer intake form, and as part of the validation I need to make sure that a proper zipcode has been included. I know regex would be the easiest way to solve this issue, but regex doesn't work when the input type is number. I HAVE to have the input type as number for this project. I've found some articles talking about making a custom validator component, but they all look so compliated. I just need my error code to pop up if it has under 5 digits or over 5 digits. Thank you for all the help.
import React from 'react'
import { useState } from 'react'
import './App.css'
import './FormInput/FormInput'
import FormInput from './FormInput/FormInput'
function App() {
const [values, setValues] = useState({
name:"",
email:"",
zipcode:""
});
const inputs = [
{
id:1,
name:"name",
type:"text",
placeholder:"Name",
error: "Must be at least 3 characters",
label:"Name",
pattern: "^.{3,25}$",
required: true
},
{
id:2,
name:"email",
type:"email",
placeholder:"Email",
error:"Must be a valid Email",
label:"Email",
required: true
},
{
id:3,
name:"zipcode",
type:"number",
placeholder:"Zipcode",
error:"Must be a valid Zipcode",
label:"Zipcode",
pattern: "^[0-9]{5,5}$",
required: true
}
]
const handleSubmit = (e) => {
e.preventDefault();
}
const onChange = (e) => {
setValues({...values, [e.target.name]: e.target.value});
}
console.log(values);
return (
<div className='app'>
<h2>Customer Form</h2>
<form onSubmit={handleSubmit}>
{inputs.map((input) => (
<FormInput key={input.id} {...input}
value={values[input.name]}
onChange={onChange}/>
))}
<button>Submit</button>
</form>
</div>
)
}
export default App;
import "./formInput.css";
import { useState } from "react";
const FormInput = (props) => {
const {label, error, onChange, id, ...inputProps} = props;
const handleFocus = (e) => {
setFocused(true);
}
return (
<div className="formInput">
<label>{label}</label>
<input {...inputProps}
onChange={onChange}/>
<span>{error}</span>
</div>
)
}
export default FormInput;
If you prefer to stay with React Base. try this. You can change the regex pattern as you want (zipcodeRegex). also styles.
you can find regex in here. regex for zip-code
hope this will help
import { useState } from 'react'
function App() {
const [zipcode, setZipcode] = useState('');
const [error, setError] = useState('');
const validateZipcode = (value) => {
const zipcodeRegex = /^\d{5}(?:[-\s]\d{4})?$/;
if (!value) {
return 'Zipcode is required';
}
if (!zipcodeRegex.test(value)) {
return 'Please enter a valid zipcode (12345 or 12345-6789)';
}
return '';
};
const handleSubmit = (e) => {
e.preventDefault();
const validationError = validateZipcode(zipcode);
setError(validationError);
if (!validationError) {
console.log('Valid zipcode:', zipcode);
}
};
const handleChange = (e) => {
setZipcode(e.target.value);
};
const formStyle = {
maxWidth: '300px',
margin: '20px auto',
padding: '20px'
};
const inputStyle = {
width: '100%',
padding: '8px',
marginBottom: '10px',
border: error ? '2px solid red' : '1px solid #ccc',
borderRadius: '4px'
};
const errorStyle = {
color: 'red',
fontSize: '14px',
marginBottom: '10px'
};
const buttonStyle = {
width: '100%',
padding: '10px',
backgroundColor: '#007bff',
color: 'white',
border: 'none',
borderRadius: '4px',
cursor: 'pointer'
};
return (
<>
<form onSubmit={handleSubmit} style={formStyle}>
<input
type="text"
value={zipcode}
onChange={handleChange}
placeholder="Enter zipcode"
style={inputStyle}
/>
{error && <div style={errorStyle}>{error}</div>}
<button type="submit" style={buttonStyle}>
Submit
</button>
</form>
)
}