edit validation, add new validation message

This commit is contained in:
smanylov
2026-01-09 19:46:59 +07:00
parent 9f880f71d1
commit 2350ac8a5d
5 changed files with 75 additions and 14 deletions
+1
View File
@@ -161,6 +161,7 @@ export async function registration(
password,
confirm_password,
agree,
companyName
});
if (!validatedFields.success) {
+37 -10
View File
@@ -23,15 +23,13 @@ export const SignupFormSchema = z
fullName: z
.string()
.min(2, { error: 'register-error-name' })
.regex(/^[^0-9]*$/, { message: 'register-error-no-digits' })
/* .refine(
(value) => !/\p{Emoji}/u.test(value),
{ message: 'no-emoji-allowed' }
) */
.max(100, { error: 'register-error-max-name' })
.regex(/^[a-zA-Zа-яА-ЯёЁ\s\-'.]*$/, { message: 'register-error-no-digits' })
.trim(),
email: z
.string()
.trim()
.max(254, { error: 'register-error-max-email' })
.refine(
(value) => value === value.toLowerCase(),
{ message: 'email-no-uppercase' }
@@ -48,16 +46,45 @@ export const SignupFormSchema = z
.min(8, { error: 'register-error-password-symbols' })
.regex(/[a-zA-Zа-яёА-ЯЁ]/, { error: 'register-error-password-one-letter' })
.regex(/[0-9]/, { error: 'register-error-password-one-digit' })
/* .refine(
(value) => !/\p{Emoji}/u.test(value),
{ message: 'no-emoji-allowed' }
) */
.max(124, { error: 'register-error-max-passowrd' })
.trim(),
confirm_password: z
.string(),
agree: z
.string()
.min(2, { error: 'register-error-agree' })
.min(2, { error: 'register-error-agree' }),
companyName: z
.string()
.optional()
.nullable()
.refine(
(value) => {
if (!value || value.trim().length === 0) return true;
return value.trim().length >= 2;
},
{ message: 'register-error-company-name' }
)
.refine(
(value) => {
const trimmed = value ? value.trim() : '';
return trimmed.length === 0 || trimmed.length <= 200;
},
{
message: 'register-error-company-name-max',
path: ['companyName']
}
)
.refine(
(value) => {
if (!value || value.trim().length === 0) return true;
const regex = /^[a-zA-Zа-яА-ЯёЁ0-9\s\-&.,'"()]+$/;
return regex.test(value);
},
{
message: 'companyName-invalid-chars',
path: ['companyName']
}
),
})
.refine((data) => data.password === data.confirm_password, {
message: 'repeat-password',
+19
View File
@@ -67,6 +67,7 @@ export default function RegisterForm() {
case 'fullName':
case 'phone':
case 'password':
case 'companyName':
case 'agree':
const schema = SignupFormSchema.shape[fieldName];
if (fieldName === 'phone') {
@@ -81,6 +82,9 @@ export default function RegisterForm() {
function onChangeHandler(e: ChangeEvent<HTMLInputElement>): void {
const fieldName = e.target.name;
if (fieldName !== 'phone') {
e.target.value = e.target.value.replace(/[^a-zA-Zа-яёА-ЯЁ0-9@#$%^&*_\-\.?!'"\s]/g, '');
}
const validatedField = validateField(fieldName, e.target.value);
if (validatedField.success) {
@@ -190,7 +194,22 @@ export default function RegisterForm() {
className={`${styles['form-input']}`}
placeholder={t('company-placeholder')}
defaultValue={formState?.previousState?.companyName ? formState?.previousState?.companyName : ''}
onChange={onChangeHandler}
/>
{formState?.error?.companyName && (
<p className="text-sm text-red-500">
{
formState?.error?.companyName.split('&').map((e, index) => {
return (
<span key={index}>
{t(e)}
<br />
</span>
)
})
}
</p>
)}
</div>
<div className={`${styles['form-group']}`}>
+9 -2
View File
@@ -195,10 +195,13 @@
"register": "Register",
"register-error-agree": "Please review the terms of use and privacy policy.",
"register-error-name": "Name must be at least 2 characters long.",
"register-error-max-name": "The name length must not exceed 100 characters.",
"register-error-password-one-digit": "Password must contain at least 1 digit.",
"register-error-password-one-letter": "Password must contain at least 1 letter.",
"register-error-password-symbols": "Password must be at least 8 characters long.",
"register-error-phone": "Please enter a phone number.",
"register-error-company-name": "The company name must contain at least 2 characters.",
"register-error-company-name-max": "The company name must exceed 200 characters.",
"remember-me": "Remember me",
"repeat-password": "Repeat password",
"request-ended-with-an-error": "The request ended with an error",
@@ -208,7 +211,7 @@
"email-or-already-registered": "Email or phone already registered",
"password-does-not-match": "Password does not match",
"email-not-found": "Email not found",
"register-error-no-digits": "The name should not contain a number.",
"register-error-no-digits": "The name should not contain a number or symbols.",
"recover-password": "Recover password",
"fullName-too-long": "Full name must be less than 100 characters.",
"fullName-invalid-chars": "Name can only contain letters, spaces, hyphens and apostrophes.",
@@ -216,6 +219,10 @@
"email-too-long": "Email is too long",
"password-too-long": "Password must be less than 50 characters",
"email-no-uppercase": "Email must not contain capital letters.",
"no-emoji-allowed": "The use of emoji is prohibited."
"no-emoji-allowed": "The use of emoji is prohibited.",
"register-error-max-passowrd": "The password length must not exceed 124 characters.",
"register-error-max-email": "Email length must not exceed 254 characters.",
"companyName-invalid-chars": "The company name must not contain symbols.",
"password-too-common": "This password is too common, please choose another."
}
}
+9 -2
View File
@@ -195,10 +195,13 @@
"register": "Зарегистрироваться",
"register-error-agree": "Пожалуйста, ознакомьтесь с условиями использования и политикой конфиденциальности.",
"register-error-name": "Имя должно содержать не менее 2 символов.",
"register-error-max-name": "Длина имени не должна превышать 100 символов.",
"register-error-password-one-digit": "Пароль должен содержать как минимум 1 цифру.",
"register-error-password-one-letter": "Пароль должен содержать как минимум 1 букву.",
"register-error-password-symbols": "Длина пароля должна быть не менее 8 символов.",
"register-error-phone": "Пожалуйста, введите телефонный номер.",
"register-error-company-name": "Название компании должно содержать не менее 2 символов.",
"register-error-company-name-max": "Название компании должно превышать 200 символов.",
"remember-me": "Запомнить меня",
"repeat-password": "Повторите пароль",
"request-ended-with-an-error": "Запрос завершился с ошибкой",
@@ -208,7 +211,7 @@
"email-or-already-registered": "Такой email и/или телефон уже зарегистрированы",
"password-does-not-match": "Неверный пароль",
"email-not-found": "Email не найден",
"register-error-no-digits": "В имени не должно быть цифр.",
"register-error-no-digits": "В имени не должно быть цифр и символов.",
"recover-password": "Восстановить пароль",
"fullName-too-long": "Полное имя должно содержать менее 100 символов.",
"fullName-invalid-chars": "В имени могут содержаться только буквы, пробелы, дефисы и апострофы.",
@@ -216,6 +219,10 @@
"email-too-long": "Email слишком длинный.",
"password-too-long": "Пароль должен содержать менее 50 символов.",
"email-no-uppercase": "Email не должен содержать заглавных букв.",
"no-emoji-allowed": "Использование эмодзи запрещено."
"no-emoji-allowed": "Использование эмодзи запрещено.",
"register-error-max-passowrd": "Длина пароля не должна превышать 124 символа.",
"register-error-max-email": "Длина Email не должна превышать 254 символа.",
"companyName-invalid-chars": "Название компании не должно содержать символов.",
"password-too-common": "Этот пароль слишком простой, пожалуйста, выберите другой."
}
}