'use client'; import { useMemo, useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { useTranslations } from 'next-intl'; import { Link } from '@/i18n/navigation'; import { Mail, Lock, User } from 'lucide-react'; import { useAuth } from '@/lib/hooks/useAuth'; import { OrganizationDetailsFields } from '@/components/ui/auth/OrganizationDetailsFields'; import { RegistrationProgressSteps } from '@/components/ui/auth/RegistrationProgressSteps'; import { Button } from '@/components/ui/shared/Button'; import { Input } from '@/components/ui/shared/Input'; import { TopBarControls } from '@/components/ui/shared/TopBarControls'; type RegisterForm = { name: string; email: string; password: string; confirmPassword: string; organizationName: string; organizationEmail: string; organizationType: 'CLINIC' | 'LAB'; }; export default function RegisterPage() { const t = useTranslations('auth'); const tCommon = useTranslations('common'); const tValidation = useTranslations('validation'); const { registerTrial, isLoading } = useAuth(); const [step, setStep] = useState(1); const [error, setError] = useState(null); const registerSchema = useMemo( () => z .object({ name: z.string().min(2, tValidation('nameMinLength')), email: z.string().email(tValidation('emailInvalid')), password: z .string() .min(8, tValidation('passwordMinLength')) .regex(/[A-Z]/, tValidation('passwordUppercase')) .regex(/[0-9]/, tValidation('passwordNumber')), confirmPassword: z.string(), organizationName: z.string().min(2, tValidation('organizationNameMinLength')), organizationEmail: z.string().email(tValidation('organizationEmailInvalid')), organizationType: z.enum(['CLINIC', 'LAB'], { message: tValidation('organizationTypeRequired'), }), }) .refine((data) => data.password === data.confirmPassword, { message: tValidation('passwordsDoNotMatch'), path: ['confirmPassword'], }), [tValidation], ); const { register, handleSubmit, watch, formState: { errors }, trigger, setValue, } = useForm({ resolver: zodResolver(registerSchema), mode: 'onChange', }); const organizationType = watch('organizationType'); const handleNext = async () => { const fieldsToValidate = step === 1 ? (['name', 'email', 'password', 'confirmPassword'] as const) : (['organizationName', 'organizationEmail', 'organizationType'] as const); const isValid = await trigger([...fieldsToValidate]); if (isValid) { setStep(step + 1); } }; const onSubmit = async (data: RegisterForm) => { try { setError(null); await registerTrial( data.email, data.password, data.name, data.organizationName, data.organizationEmail, data.organizationType, ); } catch (err: unknown) { const message = err instanceof Error ? err.message : t('registrationFailed'); setError(message || t('registrationFailed')); } }; return (
{tCommon('appName')}

{t('registerTitle')}

{t('registerPrompt')}{' '} {t('signInLink')}

{t('trialIncludes')}

  • {t('trialTeamMembers')}
  • {t('trialFullAccess')}
  • {t('trialNoCard')}
{step === 1 && ( <> } /> } /> } /> } /> )} {step === 2 && ( <> {error && (

{error}

)}
)}

{t('termsIntro')}{' '} {t('termsOfService')} {' '} {tCommon('and')}{' '} {t('privacyPolicy')}

); }