import { useState } from 'react'; import { useGitHubAuth, useSignup } 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 { ThemeToggle } from '../../../components/theme-toggle'; 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; // Registration deadline: 2025-11-30 23:29:00 WIB (UTC+7) const REGISTRATION_DEADLINE = new Date('2025-11-30T16:29:00Z'); export default function SignupPage() { const navigate = useNavigate(); // Check if registration is closed const isRegistrationClosed = new Date() >= REGISTRATION_DEADLINE; const { signInWithGitHub } = useGitHubAuth(); const signupMutation = useSignup(); const [isGithubLoading, setIsGithubLoading] = useState(false); const [error, setError] = useState(null); const [registrationSuccess, setRegistrationSuccess] = useState(false); const [registeredEmail, setRegisteredEmail] = useState(''); 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); try { const result = await signupMutation.mutateAsync({ email: data.email, password: data.password, fullname: data.fullname, }); toast.success(result.message); setRegisteredEmail(data.email); setRegistrationSuccess(true); } catch (err) { console.error('[Signup] Email signup failed:', err); setError((err as Error).message || 'Signup failed'); } }; // Show closed registration screen if (isRegistrationClosed) { return (

Registration Closed

The registration period for this hackathon has ended.

Thank you for your interest! Registration closed on November 30, 2025 at 23:29 WIB.

); } // Show success screen after registration if (registrationSuccess) { return (

Check Your Email

We've sent an activation link to{' '} {registeredEmail}

Click the link in the email to activate your account. The link will expire in 24 hours.

Don't forget to check your spam folder if you don't see the email.

); } 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 dark:bg-gray-800 text-gray-900 dark:text-white placeholder:text-gray-400 dark:placeholder:text-gray-500 disabled:bg-gray-100 dark:disabled:bg-gray-700 disabled:cursor-not-allowed'; const inputErrorClass = 'border-red-500 dark:border-red-500'; const inputNormalClass = 'border-gray-300 dark:border-gray-600'; return (

Create Account

Join the hackathon 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

); }