import { useState } from 'react'; import { useGitHubAuth, useEmailAuth, supabase, useAuthStore, } from '@imphnen-frontend-service/service'; import { GithubOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router'; import { toast } from 'sonner'; import { Icon } from '@iconify/react'; import { ThemeToggle } from '../../../components/theme-toggle'; export default function SignupPage() { const navigate = useNavigate(); const { setSession } = useAuthStore(); const { signInWithGitHub } = useGitHubAuth(); const { signUpWithEmail } = useEmailAuth(); const [isGithubLoading, setIsGithubLoading] = useState(false); const [isEmailLoading, setIsEmailLoading] = useState(false); const [fullname, setFullname] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [error, setError] = useState(null); const handleEmailSignup = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (!fullname || !email || !password || !confirmPassword) { setError('Please fill in all fields'); return; } if (password !== confirmPassword) { setError('Passwords do not match'); return; } if (password.length < 6) { setError('Password must be at least 6 characters long'); return; } try { setIsEmailLoading(true); // console.log('[Signup] Attempting email signup...'); const result = await signUpWithEmail(email, password, fullname); // console.log('[Signup] Email signup successful:', result); if (!result.user) { throw new Error('Signup failed - no user returned'); } // Create user record in database const { error: upsertError } = await supabase.from('users').upsert( { id: result.user.id, email: result.user.email || '', fullname: fullname, is_active: true, updated_at: new Date().toISOString(), }, { onConflict: 'id', } ); if (upsertError) { console.warn('[Signup] Failed to create user record'); } // If session is available (email confirmation disabled), store it if (result.session) { setSession({ token: { access_token: result.session.access_token, refresh_token: result.session.refresh_token || '', }, user: { id: result.user.id, email: result.user.email || '', fullname: fullname, phone_number: '', avatar: '', birthdate: '', gender: '', is_active: true, role: { id: '', name: 'user', permissions: [], created_at: '', updated_at: '', }, }, }); toast.success('Account created successfully!'); navigate('/onboarding/user'); } else { // Email confirmation is enabled toast.success( 'Account created! Please check your email to verify your account.' ); setTimeout(() => { navigate('/auth/login'); }, 2000); } } catch (err) { // console.error('[Signup] Email signup failed:', err); setError((err as Error).message || 'Signup failed'); setIsEmailLoading(false); } }; const handleGithubLogin = async () => { try { setIsGithubLoading(true); // console.log('[Signup] Initiating GitHub OAuth...'); const result = await signInWithGitHub(); // console.log('[Signup] OAuth result:', result); if (result?.url) { // console.log('[Signup] Redirecting to GitHub OAuth:', result.url); globalThis.location.href = result.url; } else { // console.error('[Signup] No OAuth URL returned'); setIsGithubLoading(false); } } catch (error) { // console.error('[Signup] GitHub login failed:', error); setIsGithubLoading(false); } }; return (

Create Account

Join the hackathon community

{error && (

{error}

)}
setFullname(e.target.value)} placeholder="John Doe" disabled={isEmailLoading} className="w-full px-4 py-2.5 border border-gray-300 dark:border-gray-600 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" required />
setEmail(e.target.value)} placeholder="your@email.com" disabled={isEmailLoading} className="w-full px-4 py-2.5 border border-gray-300 dark:border-gray-600 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" required />
setPassword(e.target.value)} placeholder="••••••••" disabled={isEmailLoading} className="w-full px-4 py-2.5 border border-gray-300 dark:border-gray-600 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" required />
setConfirmPassword(e.target.value)} placeholder="••••••••" disabled={isEmailLoading} className="w-full px-4 py-2.5 border border-gray-300 dark:border-gray-600 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" required />
OR

Already have an account?{' '} Sign in

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

); }