import { Paper, TextInput, Button, Stack, Title, Text, Anchor, } from '@mantine/core'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useNavigate, Link } from 'react-router-dom'; import { useAppDispatch, useAppSelector } from '../../../store/hooks'; import { signupStart, signupSuccess, signupFailure } from '../store/signup.slice'; import { hydrateAuth } from '../store/auth.slice'; import { authStorage } from '../utils/auth-storage'; import { notify } from '@ema-platform/ui'; const BASE_API_URL = (import.meta as { env?: Record }).env?.['VITE_BASE_API_URL'] ?? 'http://localhost:3001/api'; const schema = z.object({ email: z.string().email('Enter a valid email'), username: z.string().min(3, 'Username must be at least 3 characters'), phoneNumber: z.string().min(1, 'Phone number is required'), userType: z.string().min(1, 'User type is required'), name: z.string().min(1, 'Name is required'), }); type FormValues = z.infer; interface SignupPayload { email: string; username: string; phoneNumber: string; userType: string; name: { am: string; en: string; }; } export function SignupPage() { const navigate = useNavigate(); const dispatch = useAppDispatch(); const { loading } = useAppSelector((s) => s.signup); const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(schema), }); const onSubmit = async (values: FormValues) => { dispatch(signupStart()); try { const payload: SignupPayload = { email: values.email, username: values.username, phoneNumber: values.phoneNumber, userType: values.userType, name: { am: '', en: values.name, }, }; const res = await fetch(`${BASE_API_URL}/auth/signup`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); if (!res.ok) { const errorData = await res.json().catch(() => null); throw new Error(errorData?.message ?? 'Signup failed'); } const data = (await res.json()) as { token: string; refreshToken: string }; authStorage.setToken(data.token); authStorage.setRefreshToken(data.refreshToken); dispatch(hydrateAuth()); dispatch(signupSuccess()); navigate('/set-password', { state: { email: values.email } }); } catch (err) { const msg = err instanceof Error ? err.message : 'Something went wrong'; dispatch(signupFailure(msg)); notify.error(msg); } }; return ( Create an account Fill in your details to get started
Already have an account?{' '} Sign in
); }