diff --git a/src/app/actions/auth.ts b/src/app/actions/auth.ts index 5a2bd43..7611d48 100644 --- a/src/app/actions/auth.ts +++ b/src/app/actions/auth.ts @@ -161,6 +161,7 @@ export async function registration( password, confirm_password, agree, + companyName }); if (!validatedFields.success) { diff --git a/src/app/actions/definitions.ts b/src/app/actions/definitions.ts index 6ce4aef..adaf21c 100644 --- a/src/app/actions/definitions.ts +++ b/src/app/actions/definitions.ts @@ -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', diff --git a/src/app/ui/forms/register-form.tsx b/src/app/ui/forms/register-form.tsx index 89e52b9..9149426 100644 --- a/src/app/ui/forms/register-form.tsx +++ b/src/app/ui/forms/register-form.tsx @@ -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): 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 && ( +

+ { + formState?.error?.companyName.split('&').map((e, index) => { + return ( + + {t(e)} +
+
+ ) + }) + } +

+ )}
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 568c643..b40a7a4 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -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." } } \ No newline at end of file diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index 5e2b027..a29aa23 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -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": "Этот пароль слишком простой, пожалуйста, выберите другой." } } \ No newline at end of file