import { useState } from 'react'; import { useGitHubAuth } from '@imphnen-frontend-service/service'; import { GithubOutlined } from '@ant-design/icons'; import { useNavigate, Link } from 'react-router'; import { toast } from 'sonner'; import { Icon } from '@iconify/react'; import { useAuthStore } from '../../features/auth/store/auth.store'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; const signupSchema = z .object({ fullname: z .string() .min(1, 'Full name is required') .min(2, 'Full name must be at least 2 characters'), email: z .string() .min(1, 'Email is required') .email('Please enter a valid email address'), password: z .string() .min(1, 'Password is required') .min(6, 'Password must be at least 6 characters'), confirmPassword: z.string().min(1, 'Please confirm your password'), }) .refine((data) => data.password === data.confirmPassword, { message: 'Passwords do not match', path: ['confirmPassword'], }); type SignupFormData = z.infer; export default function SignupPage() { const navigate = useNavigate(); const registerUser = useAuthStore((state) => state.register); const { signInWithGitHub } = useGitHubAuth(); const [isGithubLoading, setIsGithubLoading] = useState(false); const [error, setError] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const { register, handleSubmit, formState: { errors, isValid }, } = useForm({ resolver: zodResolver(signupSchema), mode: 'onChange', }); const onSubmit = async (data: SignupFormData) => { setError(null); setIsSubmitting(true); try { await registerUser(data.fullname, data.email, data.password); toast.success('Registration successful! Redirecting...'); navigate('/'); } catch (err: any) { console.error('[Signup] Email signup failed:', err); // Construct a user-friendly error message const errorMessage = err.response?.data?.message || err.message || 'Signup failed'; setError(errorMessage); } finally { setIsSubmitting(false); } }; const handleGithubLogin = async () => { try { setIsGithubLoading(true); const result = await signInWithGitHub(); if (result?.url) { globalThis.location.href = result.url; } else { setIsGithubLoading(false); setError('Failed to get GitHub OAuth URL'); } } catch (err) { console.error('[Signup] GitHub login failed:', err); setError((err as Error).message || 'GitHub login failed'); setIsGithubLoading(false); } }; const inputBaseClass = 'w-full px-4 py-2.5 border rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent bg-white text-gray-900 placeholder:text-gray-400 disabled:bg-gray-100 disabled:cursor-not-allowed'; const inputErrorClass = 'border-red-500'; const inputNormalClass = 'border-gray-300'; return (

Create Account

Join IMPHNEN community

{error && (

{error}

)}
{errors.fullname && (

{errors.fullname.message}

)}
{errors.email && (

{errors.email.message}

)}
{errors.password && (

{errors.password.message}

)}
{errors.confirmPassword && (

{errors.confirmPassword.message}

)}
OR

Make sure your GitHub email is{' '} set to public {' '} for GitHub sign up to work.

Already have an account?{' '} Sign in

By signing up, you agree to our Terms of Service and Privacy Policy

); }