/
Moss
/
Diplom
Обзор
Документация
Войти
/
Moss
/
Diplom
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
client/src/hooks/useFormValidation.ts
88 строк
2 KB
Kursovaya
lol
08 июн 2025, 18:06
08 июн 2025, 18:06
c28cde0
Код
Авторство
О чём код?
import { useState } from 'react'; interface ValidationRules { [key: string]: { required?: boolean; minLength?: number; maxLength?: number; pattern?: RegExp; message?: string; }; } interface ValidationErrors { [key: string]: string; } export const useFormValidation = <T extends Record<string, any>>( initialState: T, validationRules: ValidationRules ) => { const [formData, setFormData] = useState<T>(initialState); const [errors, setErrors] = useState<ValidationErrors>({}); const validateField = (name: string, value: any) => { const rules = validationRules[name]; if (!rules) return ''; if (rules.required && !value) { return rules.message || 'This field is required'; } if (rules.minLength && value.length < rules.minLength) { return rules.message || `Minimum length is ${rules.minLength} characters`; } if (rules.maxLength && value.length > rules.maxLength) { return rules.message || `Maximum length is ${rules.maxLength} characters`; } if (rules.pattern && !rules.pattern.test(value)) { return rules.message || 'Invalid format'; } return ''; }; const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); const error = validateField(name, value); setErrors((prev) => ({ ...prev, [name]: error, })); }; const validateForm = () => { const newErrors: ValidationErrors = {}; let isValid = true; Object.keys(validationRules).forEach((name) => { const value = formData[name]; const error = validateField(name, value); if (error) { newErrors[name] = error; isValid = false; } }); setErrors(newErrors); return isValid; }; const resetForm = () => { setFormData(initialState); setErrors({}); }; return { formData, errors, handleChange, validateForm, resetForm, setFormData, }; };