'use client' import styles from '@/app/styles/module/login.module.scss'; import { ChangeEvent, useActionState, useEffect, useRef, useState } from 'react'; import { registration, FormState, confirmEmail } from '@/app/actions/auth'; import PhoneInput from '@/app/ui/inputs/phone-input'; import Link from 'next/link'; import { useTranslations } from 'next-intl'; import { IconEye } from '@/app/ui/icons/icons'; import { SignupFormSchema } from '@/app/actions/definitions'; import * as z from 'zod' export default function RegisterForm() { const [state, formAction, isPending] = useActionState( registration, undefined, ); const [stateEmailConfrim, formActionEmailConfrim, isPendingEmailConfrim] = useActionState( confirmEmail, undefined, ); const t = useTranslations('Login-register-form'); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [formState, setFormState] = useState(undefined); const [showMailConfirmWindow, setShowMailConfirmWindow] = useState(false); const passwordRef = useRef(null); const [accountType, setAccountType] = useState<'b2c' | 'b2b'>('b2c'); useEffect(() => { setFormState(state); if (state?.mailConfirm) { setShowMailConfirmWindow(true); } }, [state]) function showPassowrd(target: 'password' | 'confirm-password') { if (target === 'password') { setShowPassword(!showPassword); } else { setShowConfirmPassword(!showConfirmPassword); } } function validateField( fieldName: string, value: string, ) { switch (fieldName) { case 'confirm_password': const baseSchema = SignupFormSchema.shape.confirm_password; const baseResult = baseSchema.safeParse(value); if (!baseResult.success) { return baseResult; } const currentPassword = passwordRef.current?.value || ''; if (value !== currentPassword) { return { success: false, error: new z.ZodError([ { code: z.ZodIssueCode.custom, message: 'repeat-password', path: ['confirm_password'] } ]) }; } return { success: true, data: value }; case 'email': case 'fullName': case 'phone': case 'password': case 'companyName': case 'agree': const schema = SignupFormSchema.shape[fieldName]; if (fieldName === 'phone') { return schema.safeParse(value.replace(/[-\(\)\s]/g, '')); } if (fieldName === 'companyName' && accountType === 'b2c') { return { success: true, data: value }; } return schema.safeParse(value); default: throw new Error(`Unknown field: ${fieldName}`); } } 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) { setFormState(prevState => { if (!prevState?.error || !prevState?.error[fieldName]) { return prevState; } const { [fieldName]: _, ...newError } = prevState.error; return { ...prevState, error: newError }; }); } } function switchRegistrationTypeHandler(e: React.MouseEvent, type: 'b2c' | 'b2b') { e.preventDefault(); setAccountType(type); if (formState && type === 'b2c') { setFormState({ ...formState, previousState: { ...formState.previousState, companyName: '' }, error: { ...formState.error, companyName: '' } }); } } return ( <> {showMailConfirmWindow && (
{ setShowMailConfirmWindow(false); }} >
e.stopPropagation()} >
{ formActionEmailConfrim(e); }}>

{t('enter-confirmation-code')}

{ }} />
)}
{ formAction(e); }}>
{formState?.error?.fullName && (

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

)}
{accountType === 'b2b' && (
{formState?.error?.companyName && (

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

)}
)}
{ e.target.value = e.target.value.toLocaleLowerCase(); onChangeHandler(e) }} /> {formState?.error?.email && (

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

)}
{formState?.error?.phone && (

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

)}
{formState?.error?.password && (

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

)}
{formState?.error?.confirm_password && (

{t(formState?.error?.confirm_password)}

)}
{formState?.error?.agree && (

{t(formState?.error?.agree)}

)} {formState?.error?.server && (

{t(formState?.error?.server)}

)}
) }