Skip to content

Instantly share code, notes, and snippets.

@gchumillas
Last active May 23, 2024 18:29
Show Gist options
  • Save gchumillas/354f49c1679de24b56c452ca04420233 to your computer and use it in GitHub Desktop.
Save gchumillas/354f49c1679de24b56c452ca04420233 to your computer and use it in GitHub Desktop.
validate forms hook
import { useCallback, useMemo, useState } from 'react';
const useValidator = <T extends Record<string, string>>(validator: () => T) => {
const [errors, setErrors] = useState<Partial<T>>({})
return useMemo(() => ({
validate: () => {
setErrors(validator())
return Object.values(errors).every((x) => !x)
},
reset: () => setErrors({}),
errors
}), [errors, validator])
}
import { useState } from 'react';
import { Button, TextField } from '@mui/material';
function App() {
const [data, setData] = useState({
name: '',
middlename: '',
surname: ''
})
const { errors, validate, reset } = useValidator(useCallback(() => ({
name: data.name ? '' : 'Name is required',
middlename: data.middlename ? '': 'Middlename is required',
surname: data.surname ? '' : 'Surname is required'
}), [data]))
const doReset = useCallback(() => {
setData({ name: '', middlename: '', surname: '' })
reset()
}, [reset])
const doSubmit = useCallback(() => {
if (!validate()) {
console.error('Please enter the required fields')
return
}
console.log('Submiting form...')
}, [validate])
return (
<form onSubmit={(e) => e.preventDefault()} style={{ display: 'flex', flexDirection: 'column', gap: 8, maxWidth: 500 }}>
<TextField
required
label="Name"
value={data.name}
onChange={(e) => setData((val) => ({ ...val, name: e.target.value }))}
error={!!errors.name}
helperText={errors.name}
/>
<TextField
required
label="Middlename"
value={data.middlename}
onChange={(e) => setData((val) => ({ ...val, middlename: e.target.value }))}
error={!!errors.middlename}
helperText={errors.middlename}
/>
<TextField
required
label="Surname"
value={data.surname}
onChange={(e) => setData((val) => ({ ...val, surname: e.target.value }))}
error={!!errors.surname}
helperText={errors.surname}
/>
<Button type="submit" onClick={doSubmit}>
Save
</Button>
<Button type="reset" onClick={doReset}>
Reset
</Button>
</form>
);
}
export default App;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment