169 похожих чатов

Import {useState} from "react"; import {Validator} from "./validators"; export type UseStateWithValidationOptions<T> =

{
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
);
}

1 ответов

11 просмотров

А теперь все поля заблокируй (:

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта