{
defaultValue?: T,
validators?: Validator<T>[],
errorMessages?: any[],
errorTypes?: any[]
}
/**
* Хук для установки значений объекта и его валидации,
* возвращает объект содержащий :
* value - значение,
* setValue - колбэк для установки значения,
* errorType - код первой ошибки,
* errorMessage - сообщение первой ошибки,
* isError - флаг есть ли ошибка
*
* @param defaultValue - дефолтное значение объекта
* @param validators - массив валидаторов, функций принимающих в качестве параметра объект
* @param errorMessages - массив сообщений об ошибке
* @param errorTypes - массив кодов ошибки
*
* @return Объект содержащий :
* value - значение,
* setValue - колбэк для установки значения,
* errorType - код первой ошибки,
* errorMessage - сообщение первой ошибки,
* isError - флаг есть ли ошибка
export function useStateObjectWithValidation<T>(
options: UseStateWithValidationOptions<T>
);
*/
export function useStateObjectWithValidation<T>(
defaultValue: T = null,
validators: Validator<T>[] = null,
errorMessages: any[] = null,
errorTypes: any[] = null
) {
const [value, setValue] = useState(defaultValue);
let errorType = null;
let errorMessage = null;
let isError = false;
for (let i = 0; i < validators?.length ?? 0; i++) {
const validator = validators[i];
if (!validator(value)) {
errorType = errorTypes?.[i] ?? null;
errorMessage = errorMessages?.[i] ?? null;
isError = true;
// всегда возвращаем первую ошибку валидации
break;
}
}
return {value, setValue, errorType, errorMessage, isError};
}
/**
* Хук для установки значений объекта и его валидации,
* API сделан по аналогии с useState, но дополнительно возвращает третий элемент кортежа - ошибку валидации
*
* @param defaultValue - дефолтное значение объекта
* @param validators - массив валидаторов, функций принимающих в качестве параметра объект
* @param errorMessages - массив сообщений об ошибке
* @param errorTypes - массив кодов ошибки
*
* @return Кортеж из трех элементов содержащий :
* первый элемент - значение,
* второй элемент - колбэк для установки значения,
* третий элемент - объект содержащий: { isError - флаг наличия ошибки, errorType - код первой ошибки,
* errorMessage - сообщение первой ошибки }
*/
export function useStateWithValidation<T>(
defaultValue: T = null,
validators: Validator<any>[] = null,
errorMessages = null,
errorTypes = null
) {
const o = useStateObjectWithValidation(validators, errorMessages, errorTypes);
return [
o.value,
o.setValue,
{
isError: o.isError,
errorType: o.errorType,
errorMessage: o.errorMessage
}];
}
/**
* Хук для установки значений объекта и его валидации,
* API сделан по аналогии с useState, но дополнительно возвращает третий элемент кортежа - ошибку валидации
*
* @param options - опции типа UseStateWithValidationOptions
*
* @return Кортеж из трех элементов содержащий :
* первый элемент - значение,
* второй элемент - колбэк для установки значения,
* третий элемент - объект содержащий: { isError - флаг наличия ошибки, errorType - код первой ошибки,
* errorMessage - сообщение первой ошибки }
*/
export function useStateWithValidationOptional<T>(options: UseStateWithValidationOptions<T>) {
return useStateWithValidation(
options.defaultValue,
options.validators,
options.errorMessages,
options.errorTypes
);
}
А теперь все поля заблокируй (:
Обсуждают сегодня