function useForm(initialValues) { const [values, setValues] = useState(initialValues); const [errors, setErrors] = useState({}); const handleChange = useCallback((e) => { const { name, value, type, checked } = e.target; setValues(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); }, []); const setValue = useCallback((name, value) => { setValues(prev => ({ ...prev, [name]: value })); }, []); const reset = useCallback(() => { setValues(initialValues); setErrors({}); }, [initialValues]); const validate = useCallback((validationRules) => { const newErrors = {}; for (const [field, rules] of Object.entries(validationRules)) { for (const rule of rules) { const error = rule(values[field], values); if (error) { newErrors[field] = error; break; } } } setErrors(newErrors); return Object.keys(newErrors).length === 0; }, [values]); return { values, errors, handleChange, setValue, reset, validate }; } // Utilisation function LoginForm({ onSubmit }) { const { values, errors, handleChange, validate } = useForm({ email: '', password: '' }); const validationRules = { email: [ v => !v && 'Email requis', v => !v.includes('@') && 'Email invalide' ], password: [ v => !v && 'Mot de passe requis', v => v.length < 6 && 'Minimum 6 caractères' ] }; const handleSubmit = (e) => { e.preventDefault(); if (validate(validationRules)) { onSubmit(values); } }; return (
{errors.email && {errors.email}}
{errors.password && {errors.password}}
); }