'use client';
import { useState } from 'react';
import { useForm, SubmitHandler } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as Yup from 'yup';
import { useRouter } from 'next/navigation';
import { register as registerUser } from '@/services/auth';
import FormInput from '@/components/FormInput';
import {useAuth} from "@/app/hooks/useAuth";
type FormValues = {
name: string;
email: string;
username: string;
password: string;
password_confirmation: string;
};
const RegisterPage = () => {
const router = useRouter();
useAuth(true);
const [serverError, setServerError] = useState('');
const validationSchema = Yup.object().shape({
name: Yup.string().required('Full Name is required'),
email: Yup.string()
.required('Email is required')
.email('Invalid email address'),
username: Yup.string()
.required('Username is required')
.min(3, 'Username must be at least 3 characters')
.max(20, 'Username cannot exceed 20 characters'),
password: Yup.string()
.required('Password is required')
.min(6, 'Password must be at least 6 characters'),
password_confirmation: Yup.string()
.oneOf([Yup.ref('password'), null], 'Passwords must match')
.required('Password confirmation is required'),
});
const {
register,
handleSubmit,
formState: { errors, isSubmitting },
} = useForm<FormValues>({
resolver: yupResolver(validationSchema),
});
const onSubmit: SubmitHandler<FormValues> = async (data) => {
setServerError('');
try {
await registerUser(data);
router.push('/login');
} catch (err: any) {
setServerError(err.response?.data?.message || 'Registration failed');
}
};
return (
<div className="min-h-screen flex items-center justify-center bg-gray-100">
<form
onSubmit={handleSubmit(onSubmit)}
className="w-full max-w-md bg-white p-6 rounded-lg shadow-md"
>
<h1 className="text-2xl font-bold text-center mb-6">Register</h1>
{serverError && <p className="text-red-500 text-center text-sm mb-4">{serverError}</p>}
<FormInput
label="Full Name"
id="name"
register={register('name')}
error={errors.name?.message}
/>
<FormInput
label="Email"
id="email"
type="email"
register={register('email')}
error={errors.email?.message}
/>
<FormInput
label="Username"
id="username"
register={register('username')}
error={errors.username?.message}
/>
<FormInput
label="Password"
id="password"
type="password"
register={register('password')}
error={errors.password?.message}
/>
<FormInput
label="Confirm Password"
id="password_confirmation"
type="password"
register={register('password_confirmation')}
error={errors.password_confirmation?.message}
/>
<button
type="submit"
disabled={isSubmitting}
className={`w-full py-2 px-4 rounded-md text-white ${
isSubmitting ? 'bg-gray-400' : 'bg-blue-500 hover:bg-blue-600'
}`}
>
{isSubmitting ? 'Registering...' : 'Register'}
</button>
<p className="text-center text-sm mt-4">
Already have an account?{' '}
<a href="/login" className="text-blue-500 hover:underline">
Login
</a>
</p>
</form>
</div>
);
};
export default RegisterPage;
|