From a7467d486d76de789c9495074a48db33da1bccc4 Mon Sep 17 00:00:00 2001 From: smanylov Date: Fri, 19 Dec 2025 16:11:58 +0700 Subject: [PATCH] update validation messages --- src/app/actions/auth.ts | 60 +++++++++++++++++++++--------- src/app/actions/definitions.ts | 12 ++++-- src/app/ui/forms/register-form.tsx | 28 +++++++++----- src/i18n/messages/en.json | 11 ++++-- src/i18n/messages/ru.json | 11 ++++-- 5 files changed, 85 insertions(+), 37 deletions(-) diff --git a/src/app/actions/auth.ts b/src/app/actions/auth.ts index 292a69e..b8b1222 100644 --- a/src/app/actions/auth.ts +++ b/src/app/actions/auth.ts @@ -135,12 +135,12 @@ export async function authorization( type FormState = { previousState: { - full_name: string; + fullName: string; email: string; password: string; confirm_password: string; phone: string; - company: string; + companyName: string; agree: string; } error: Record @@ -150,16 +150,16 @@ export async function registration( state: FormState | undefined, formData: FormData, ): Promise { - const full_name = formData.get('full_name') as string || ''; + const fullName = formData.get('fullName') as string || ''; const email = formData.get('email') as string || ''; const password = formData.get('password') as string || ''; const confirm_password = formData.get('confirm_password') as string || ''; const phone = formData.get('phone') as string || ''; - const company = formData.get('company') as string || ''; + const companyName = formData.get('companyName') as string || ''; const agree = formData.get('agree') as string || ''; const validatedFields = SignupFormSchema.safeParse({ - full_name, + fullName, email, phone: phone.replace(/[-\(\)\s]/g, ''), password, @@ -182,12 +182,12 @@ export async function registration( return { previousState: { - full_name, + fullName, email, password, confirm_password, phone, - company, + companyName, agree }, error: errors @@ -195,18 +195,18 @@ export async function registration( } try { - const { full_name, email, password, phone } = validatedFields.data; + const { fullName, email, password, phone } = validatedFields.data; const response = await fetch(`${API_BASE_URL}/api/v1/data`, { method: 'POST', body: JSON.stringify({ version: 1, msg_id: 20002, message_body: { - fullName: full_name, + fullName: fullName, email, phone: phone, password, - companyName: company, + companyName: companyName, } }), headers: { @@ -216,23 +216,47 @@ export async function registration( }); if (response.ok) { - let parsed = await response.json(); + let parsed = await response.json() as { + message_desc: string, + message_body: { token: string }, + message_code: string + }; if (parsed.message_desc === 'Operation successful') { await createSession(parsed.message_body.token, email); } else { - throw (`${parsed.message_code}`); + console.log('error'); + /* console.log(parsed.message_body); */ + /* throw (`${parsed.message_code.fieldErrors}`); */ + throw parsed; } } else { throw (`${response.status}`); } - } catch (error) { + } catch (error: unknown) { if (error) { + const typedError = error as any; const errors: Record = {}; - switch (error) { - case '1': + console.log(typedError); + console.log(typedError.message_body); + + switch (typedError.message_code) { + case 1: errors['server'] = 'email-or-already-registered' break; + case 2: + typedError.message_body.fieldErrors.forEach((obj: { + code: string, + field: string + }) => { + if (errors[obj.field]) { + errors[obj.field] = `${errors[obj.field]}&${obj.code.replaceAll('.', '-')}`; + } else { + errors[obj.field] = obj.code.replaceAll('.', '-'); + } + }); + break; + default: errors['server'] = 'request-ended-with-an-error' break; @@ -240,17 +264,19 @@ export async function registration( return { previousState: { - full_name, + fullName, email, password, confirm_password, phone, - company, + companyName, agree }, error: errors }; } + console.log('finale error'); + console.log(error); throw error; } diff --git a/src/app/actions/definitions.ts b/src/app/actions/definitions.ts index 84e581c..fc37101 100644 --- a/src/app/actions/definitions.ts +++ b/src/app/actions/definitions.ts @@ -16,21 +16,25 @@ export type FormAction = ( formData: FormData ) => Promise -const emailRegex = /^([a-zA-Z0-9.\-_]+|[а-яА-ЯёЁ0-9.\-_]+)@(([a-zA-Z0-9.\-]+)\.([a-zA-Z]{2,})|([a-zA-Z0-9.\-]+)\.([а-яА-ЯёЁ]{2,})|([а-яА-ЯёЁ0-9.\-]+)\.([a-zA-Z]{2,})|([а-яА-ЯёЁ0-9.\-]+)\.([а-яА-ЯёЁ]{2,}))$/i; +const emailRegex = /^([a-z0-9.\-_]+|[а-яё0-9.\-_]+)@(([a-z0-9.\-]+)\.([a-z]{2,})|([a-z0-9.\-]+)\.([а-яё]{2,})|([а-яё0-9.\-]+)\.([a-z]{2,})|([а-яё0-9.\-]+)\.([а-яё]{2,}))$/i; export const SignupFormSchema = z .object({ - full_name: z + fullName: z .string() - .min(3, { error: 'register-error-name' }) + .min(2, { error: 'register-error-name' }) .regex(/^[^0-9]*$/, { message: 'register-error-no-digits' }) .trim(), email: z .string() .trim() + .refine( + (value) => value === value.toLowerCase(), + { message: 'email-no-uppercase' } + ) .refine( (value) => emailRegex.test(value), - { message: 'register-error-valid-email' } + { message: 'email-invalid' } ), phone: z .string() diff --git a/src/app/ui/forms/register-form.tsx b/src/app/ui/forms/register-form.tsx index 840a5f4..ec93b16 100644 --- a/src/app/ui/forms/register-form.tsx +++ b/src/app/ui/forms/register-form.tsx @@ -55,15 +55,19 @@ export default function RegisterForm() { - {state?.error?.full_name && ( + {state?.error?.fullName && (

- {t(state?.error?.full_name)} + { + state?.error?.fullName.split('&').map((e) => { + return t(e) + " " + }) + }

)} @@ -82,7 +86,11 @@ export default function RegisterForm() { /> {state?.error?.email && (

- {t(state?.error?.email)} + { + state?.error?.email.split('&').map((e) => { + return t(e) + " " + }) + }

)} @@ -106,11 +114,11 @@ export default function RegisterForm() {
@@ -175,7 +183,7 @@ export default function RegisterForm() { handleMouseUp('confirm-password'); }} onMouseOut={() => { - handleMouseOut('confirm-password') + handleMouseOut('confirm-password'); }} type="button" className={`show-password-button ${showPassword ? 'show' : ''}`} diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 25cf4f0..5d4b59a 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -149,12 +149,11 @@ "privacy-policy": "privacy policy", "register": "Register", "register-error-agree": "Please review the terms of use and privacy policy.", - "register-error-name": "Name must be at least 3 characters long.", + "register-error-name": "Name must be at least 2 characters long.", "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-valid-email": "Please enter a valid email address.", "remember-me": "Remember me", "repeat-password": "Repeat password", "request-ended-with-an-error": "The request ended with an error", @@ -165,6 +164,12 @@ "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.", - "recover-password": "Recover password" + "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.", + "email-invalid": "Invalid email address", + "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 newline at end of file diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index a24f5b2..99c5299 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -149,12 +149,11 @@ "privacy-policy": "политикой конфиденциальности", "register": "Зарегистрироваться", "register-error-agree": "Пожалуйста, ознакомьтесь с условиями использования и политикой конфиденциальности.", - "register-error-name": "Имя должно содержать не менее 3 символов.", + "register-error-name": "Имя должно содержать не менее 2 символов.", "register-error-password-one-digit": "Пароль должен содержать как минимум 1 цифру.", "register-error-password-one-letter": "Пароль должен содержать как минимум 1 букву.", "register-error-password-symbols": "Длина пароля должна быть не менее 8 символов.", "register-error-phone": "Пожалуйста, введите телефонный номер.", - "register-error-valid-email": "Пожалуйста, введите правильный адрес электронной почты.", "remember-me": "Запомнить меня", "repeat-password": "Повторите пароль", "request-ended-with-an-error": "Запрос завершился с ошибкой", @@ -165,6 +164,12 @@ "password-does-not-match": "Неверный пароль", "email-not-found": "Email не найден", "register-error-no-digits": "В имени не должно быть цифр.", - "recover-password": "Восстановить пароль" + "recover-password": "Восстановить пароль", + "fullName-too-long": "Полное имя должно содержать менее 100 символов.", + "fullName-invalid-chars": "В имени могут содержаться только буквы, пробелы, дефисы и апострофы.", + "email-invalid": "Неверный адрес электронной почты", + "email-too-long": "Email слишком длинный.", + "password-too-long": "Пароль должен содержать менее 50 символов.", + "email-no-uppercase": "Email не должен содержать заглавных букв" } } \ No newline at end of file